转载

基础指南:DB2 for z/OS 中的备份和恢复

简介

用户常常提出问题,要求解释 IBM 产品的某些特性和功能的工作原理。IBM 产品已安装好,但用户不熟悉它们,常常很难理清头绪,不知从何处开始。最佳的解释方式是让用户自己动手。本指南带您执行一次小型的实验练习,让用户切身感受能做什么和如何做。当然,像这样的练习无法涵盖每个细节或可能使用的每个参数。我们的目的是介绍该产品,让您对最常用的功能有一些印象,为进一步开始构建奠定基础。

该练习是为不熟悉 DB2 for z/OS 的用户开发的。客户需要实施备份和恢复过程,但由于他们不熟悉,他们对 DB2 提供了哪些选项仅有理论性的观点,而且肯定更不了解如何使用和实现它们。本练习基本涵盖了 DB2 for z/OS 的以下实用程序:

  • UNLOAD
  • LOAD(包括 RESUME 和 REPLACE)
  • REPAIR
  • COPY(包括 FULL 和 INCREMENTAL)
  • RECOVER(无条件、TOCOPY 和 TOLOGPOINT)
  • QUIESCE
  • REBUILD INDEX

本练习是在 DB2 10 for z/OS 上开发和执行的,但无需任何修改即可用于 DB2 11。所有查询都通过 SPUFI 执行。

本文中给出的 JCL 是一个示例 JCL。未给出作业控制卡。在您的环境中,DB2 产品库必须具有不同的名称,输入和输出数据集,DB2 子系统等也是如此。

回页首

创建一个数据库

创建 DB2 对象

我们首先创建一个包含两个表的简单数据库。为了专门演示备份和恢复特性,这些表之间没有参照完整性或关系。两个表的布局相同。这些表之间的区别是,第一个表有 4 个索引,其中一个是 UNIQUE 索引。第二个表仅有 2 个索引,其中没有 UNIQUE。两个表的列大小都根据一个标准 4K 存储页面中只能放入不超过 5 条记录来选择。创建语句类似于下面这个清单。

清单 1. 测试数据库的 create 语句

--DROP DATABASE LAB01; -- --COMMIT;  --   CREATE DATABASE LAB01; --   COMMIT; --   CREATE TABLESPACE TSLAB01   IN LAB01   PCTFREE 10   LOCKSIZE ROW; --   CREATE TABLE TBLAB01   ( T01_D_PROCES      DATE      NOT NULL WITH DEFAULT   , T01_T_PROCES      TIME      NOT NULL WITH DEFAULT   , T01_N_AGENCY      SMALLINT  NOT NULL WITH DEFAULT   , T01_C_USERID      CHAR(4)   NOT NULL WITH DEFAULT   , T01_C_TERMNL      CHAR(4)   NOT NULL WITH DEFAULT   , T01_C_CURNCY      CHAR(3)   NOT NULL WITH DEFAULT   , T01_C_TRNSAX      CHAR(3)   NOT NULL WITH DEFAULT   , T01_N_PERIOD      INTEGER   NOT NULL WITH DEFAULT   , T01_N_OLDPCT      DEC(6,4)  NOT NULL WITH DEFAULT   , T01_D_OSTART      DATE      NOT NULL WITH DEFAULT   , T01_N_NEWPCT      DEC(6,4)  NOT NULL WITH DEFAULT   , T01_D_NSTART      DATE      NOT NULL WITH DEFAULT   , T01_C_COMENT      CHAR(250) NOT NULL WITH DEFAULT   , T01_C_TEXT01      CHAR(250) NOT NULL WITH DEFAULT   , T01_C_TEST02      CHAR(250) NOT NULL WITH DEFAULT   , T01_T_TSTAMP      TIMESTAMP NOT NULL WITH DEFAULT )   IN LAB01.TSLAB01; --   CREATE UNIQUE INDEX TBLAB01_K00   ON TBLAB01   ( T01_D_PROCES      ASC   , T01_T_PROCES      ASC   , T01_N_AGENCY      ASC   , T01_C_USERID      ASC )   CLUSTER   PCTFREE 10; --   CREATE INDEX TBLAB01_K01   ON TBLAB01   ( T01_C_USERID      ASC   , T01_D_PROCES      ASC   , T01_T_PROCES      ASC )   PCTFREE 10; --   CREATE INDEX TBLAB01_K02   ON TBLAB01   ( T01_N_AGENCY      ASC   , T01_D_PROCES      ASC   , T01_T_PROCES      ASC )   PCTFREE 10; --   CREATE INDEX TBLAB01_K03   ON TBLAB01   ( T01_C_CURNCY      ASC   , T01_N_PERIOD      ASC )   PCTFREE 10; --   CREATE TABLESPACE TSLAB02   IN LAB01   PCTFREE 10   LOCKSIZE ROW; --   CREATE TABLE TBLAB02   ( T02_D_PROCES      DATE      NOT NULL WITH DEFAULT   , T02_T_PROCES      TIME      NOT NULL WITH DEFAULT   , T02_N_AGENCY      SMALLINT  NOT NULL WITH DEFAULT   , T02_C_USERID      CHAR(4)   NOT NULL WITH DEFAULT   , T02_C_TERMNL      CHAR(4)   NOT NULL WITH DEFAULT   , T02_C_CURNCY      CHAR(3)   NOT NULL WITH DEFAULT   , T02_C_TRNSAX      CHAR(3)   NOT NULL WITH DEFAULT   , T02_N_PERIOD      INTEGER   NOT NULL WITH DEFAULT   , T02_N_OLDPCT      DEC(6,4)  NOT NULL WITH DEFAULT   , T02_D_OSTART      DATE      NOT NULL WITH DEFAULT   , T02_N_NEWPCT      DEC(6,4)  NOT NULL WITH DEFAULT   , T02_D_NSTART      DATE      NOT NULL WITH DEFAULT   , T01_C_COMENT      CHAR(250) NOT NULL WITH DEFAULT   , T01_C_TEXT01      CHAR(250) NOT NULL WITH DEFAULT   , T01_C_TEST02      CHAR(250) NOT NULL WITH DEFAULT   , T02_T_TSTAMP      TIMESTAMP NOT NULL WITH DEFAULT )   IN LAB01.TSLAB02; --   CREATE INDEX TBLAB02_K01   ON TBLAB02   ( T02_C_USERID      ASC   , T02_D_PROCES      ASC   , T02_T_PROCES      ASC )   PCTFREE 10; --   CREATE INDEX TBLAB02_K02   ON TBLAB02   ( T02_N_AGENCY      ASC   , T02_D_PROCES      ASC   , T02_T_PROCES      ASC )   PCTFREE 10; 

所有语句都应该以 SQLCODE 0 结尾。

将数据插入到测试数据库中

创建我们的数据库后,我们通过标准 INSERT 语句向每个表载入(相同的)26 条记录,如下所示:

清单 2. 测试数据的 INSERT 语句

DELETE FROM TBLAB01; --   COMMIT; --   INSERT INTO TBLAB01 VALUES   ( '2008-09-30','10.03.03',0,'LAMN','B066','USD','TAR', 90,0.0000    ,'1900-01-01',2.0000,'2008-09-30','RECORD NR 01','TEXT1 01'    ,'TEXT2 01',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2008-09-30','10.04.04',0,'LAMN','B066','USD','TAR',  0,0.0000    ,'1900-01-01',1.1250,'2008-09-30','RECORD NR 02','TEXT1 02'    ,'TEXT2 02',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2008-09-30','10.05.05',0,'LAMN','B066','USD','TAR',180,0.0000    ,'1900-01-01',3.0000,'2008-09-30','RECORD NR 03','TEXT1 03'    ,'TEXT2 03',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2009-09-15','08.00.00',0,'LAMN','B066','USD','TAR',  0,1.1250    ,'2008-09-30',0.8500,'2009-09-15','RECORD NR 04','TEXT1 04'    ,'TEXT2 04',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2009-09-15','08.01.01',0,'LAMN','B066','USD','TAR', 90,2.0000    ,'2008-09-30',0.8500,'2009-09-15','RECORD NR 05','TEXT1 05'    ,'TEXT2 05',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2009-09-15','08.02.02',0,'LAMN','B066','USD','TAR',360,4.5000    ,'2008-09-30',1.1500,'2009-09-15','RECORD NR 06','TEXT1 06'    ,'TEXT2 06',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2009-10-22','16.26.26',0,'LAMN','B066','USD','TAR',  0,0.8500    ,'2009-09-15',0.5000,'2009-10-22','RECORD NR 07','TEXT1 07'    ,'TEXT2 07',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2010-07-15','21.53.53',0,'LAMN','SO53','USD','TAR', 90,0.8500    ,'2009-09-15',1.0000,'2010-07-15','RECORD NR 08','TEXT1 08'    ,'TEXT2 08',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2010-07-15','21.54.54',0,'LAMN','SO53','USD','TAR',360,1.1500    ,'2009-09-15',1.3000,'2010-07-15','RECORD NR 09','TEXT1 09'    ,'TEXT2 09',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2010-07-31','18.04.04',0,'LAMN','B066','USD','TAR',  0,0.5000    ,'2009-10-22',0.3000,'2010-07-31','RECORD NR 10','TEXT1 10'    ,'TEXT2 10',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2011-04-11','07.55.55',0,'LAMN','B066','USD','TAR', 90,1.0000    ,'2010-07-15',1.5000,'2011-04-11','RECORD NR 11','TEXT1 11'    ,'TEXT2 11',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2011-04-11','07.56.56',0,'LAMN','B066','USD','TAR',360,1.3000    ,'2010-07-15',1.8000,'2011-04-11','RECORD NR 12','TEXT1 12'    ,'TEXT2 12',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2011-04-30','19.40.40',0,'LAMN','B065','USD','TAR',  0,0.3000    ,'2010-07-31',0.4000,'2011-04-30','RECORD NR 13','TEXT1 13'    ,'TEXT2 13',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-09-24','07.43.43',0,'LAMN','B065','USD','TAR', 90,1.5000    ,'2011-04-11',1.1500,'2012-09-24','RECORD NR 14','TEXT1 14'    ,'TEXT2 14',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-09-24','07.44.44',0,'LAMN','B065','USD','TAR',180,1.6000    ,'2011-04-11',1.3500,'2012-09-24','RECORD NR 15','TEXT1 15'    ,'TEXT2 15',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-10-31','18.30.30',0,'LAMN','B065','USD','TAR', 90,1.1500    ,'2012-09-24',0.9000,'2012-10-31','RECORD NR 16','TEXT1 16'    ,'TEXT2 16',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-10-31','18.31.31',0,'LAMN','B065','USD','TAR',180,1.3500    ,'2012-09-24',0.8000,'2012-10-31','RECORD NR 17','TEXT1 17'    ,'TEXT2 17',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-10-31','18.32.32',0,'LAMN','B065','USD','TAR',360,1.4000    ,'2012-09-24',0.7000,'2012-10-31','RECORD NR 18','TEXT1 18'    ,'TEXT2 18',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-11-06','18.19.19',0,'LAMN','B066','USD','TAR', 90,0.9000    ,'2012-10-31',1.1500,'2012-11-06','RECORD NR 19','TEXT1 19'    ,'TEXT2 19',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-11-06','18.20.20',0,'LAMN','B066','USD','TAR',360,0.7000    ,'2012-10-31',1.4000,'2012-11-06','RECORD NR 20','TEXT1 20'    ,'TEXT2 20',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-11-12','09.16.16',0,'LAMN','B066','USD','TAR', 90,1.1500    ,'2012-11-06',0.9000,'2012-11-12','RECORD NR 21','TEXT1 21'    ,'TEXT2 21',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2012-11-12','09.17.17',0,'LAMN','B066','USD','TAR',360,1.4000    ,'2012-11-06',0.7000,'2012-11-12','RECORD NR 22','TEXT1 22'    ,'TEXT2 22',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2013-01-11','14.41.41',0,'LAMN','B066','USD','TAR',  0,0.4000    ,'2011-04-30',0.2000,'2013-01-11','RECORD NR 23','TEXT1 23'    ,'TEXT2 23',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2013-09-25','11.55.55',0,'MLLU','V107','USD','TAR',180,0.8000    ,'2012-11-12',8.0000,'2013-09-25','RECORD NR 24','TEXT1 24'    ,'TEXT2 24',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2013-10-15','15.57.57',0,'FAAN','V108','EUR','TAR',360,0.0000    ,'1900-01-01',0.7800,'2013-10-15','RECORD NR 25','TEXT1 25'    ,'TEXT2 25',CURRENT TIMESTAMP ); --   COMMIT; --   DELETE FROM TBLAB02; --   COMMIT; --   INSERT INTO TBLAB02 VALUES   ( '2008-09-30','10.03.03',0,'LAMN','B066','USD','TAR', 90,0.0000    ,'1900-01-01',2.0000,'2008-09-30','RECORD NR 01','TEXT1 01'    ,'TEXT2 01',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2008-09-30','10.04.04',0,'LAMN','B066','USD','TAR',  0,0.0000    ,'1900-01-01',1.1250,'2008-09-30','RECORD NR 02','TEXT1 02'    ,'TEXT2 02',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2008-09-30','10.05.05',0,'LAMN','B066','USD','TAR',180,0.0000    ,'1900-01-01',3.0000,'2008-09-30','RECORD NR 03','TEXT1 03'    ,'TEXT2 03',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2009-09-15','08.00.00',0,'LAMN','B066','USD','TAR',  0,1.1250    ,'2008-09-30',0.8500,'2009-09-15','RECORD NR 04','TEXT1 04'    ,'TEXT2 04',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2009-09-15','08.01.01',0,'LAMN','B066','USD','TAR', 90,2.0000    ,'2008-09-30',0.8500,'2009-09-15','RECORD NR 05','TEXT1 05'    ,'TEXT2 05',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2009-09-15','08.02.02',0,'LAMN','B066','USD','TAR',360,4.5000    ,'2008-09-30',1.1500,'2009-09-15','RECORD NR 06','TEXT1 06'    ,'TEXT2 06',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2009-10-22','16.26.26',0,'LAMN','B066','USD','TAR',  0,0.8500    ,'2009-09-15',0.5000,'2009-10-22','RECORD NR 07','TEXT1 07'    ,'TEXT2 07',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2010-07-15','21.53.53',0,'LAMN','SO53','USD','TAR', 90,0.8500    ,'2009-09-15',1.0000,'2010-07-15','RECORD NR 08','TEXT1 08'    ,'TEXT2 08',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2010-07-15','21.54.54',0,'LAMN','SO53','USD','TAR',360,1.1500    ,'2009-09-15',1.3000,'2010-07-15','RECORD NR 09','TEXT1 09'    ,'TEXT2 09',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2010-07-31','18.04.04',0,'LAMN','B066','USD','TAR',  0,0.5000    ,'2009-10-22',0.3000,'2010-07-31','RECORD NR 10','TEXT1 10'    ,'TEXT2 10',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2011-04-11','07.55.55',0,'LAMN','B066','USD','TAR', 90,1.0000    ,'2010-07-15',1.5000,'2011-04-11','RECORD NR 11','TEXT1 11'    ,'TEXT2 11',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2011-04-11','07.56.56',0,'LAMN','B066','USD','TAR',360,1.3000    ,'2010-07-15',1.8000,'2011-04-11','RECORD NR 12','TEXT1 12'    ,'TEXT2 12',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2011-04-30','19.40.40',0,'LAMN','B065','USD','TAR',  0,0.3000    ,'2010-07-31',0.4000,'2011-04-30','RECORD NR 13','TEXT1 13'    ,'TEXT2 13',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-09-24','07.43.43',0,'LAMN','B065','USD','TAR', 90,1.5000    ,'2011-04-11',1.1500,'2012-09-24','RECORD NR 14','TEXT1 14'    ,'TEXT2 14',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-09-24','07.44.44',0,'LAMN','B065','USD','TAR',180,1.6000    ,'2011-04-11',1.3500,'2012-09-24','RECORD NR 15','TEXT1 15'    ,'TEXT2 15',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-10-31','18.30.30',0,'LAMN','B065','USD','TAR', 90,1.1500    ,'2012-09-24',0.9000,'2012-10-31','RECORD NR 16','TEXT1 16'    ,'TEXT2 16',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-10-31','18.31.31',0,'LAMN','B065','USD','TAR',180,1.3500    ,'2012-09-24',0.8000,'2012-10-31','RECORD NR 17','TEXT1 17'    ,'TEXT2 17',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-10-31','18.32.32',0,'LAMN','B065','USD','TAR',360,1.4000    ,'2012-09-24',0.7000,'2012-10-31','RECORD NR 18','TEXT1 18'    ,'TEXT2 18',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-11-06','18.19.19',0,'LAMN','B066','USD','TAR', 90,0.9000    ,'2012-10-31',1.1500,'2012-11-06','RECORD NR 19','TEXT1 19'    ,'TEXT2 19',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-11-06','18.20.20',0,'LAMN','B066','USD','TAR',360,0.7000    ,'2012-10-31',1.4000,'2012-11-06','RECORD NR 20','TEXT1 20'    ,'TEXT2 20',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-11-12','09.16.16',0,'LAMN','B066','USD','TAR', 90,1.1500    ,'2012-11-06',0.9000,'2012-11-12','RECORD NR 21','TEXT1 21'    ,'TEXT2 21',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2012-11-12','09.17.17',0,'LAMN','B066','USD','TAR',360,1.4000    ,'2012-11-06',0.7000,'2012-11-12','RECORD NR 22','TEXT1 22'    ,'TEXT2 22',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2013-01-11','14.41.41',0,'LAMN','B066','USD','TAR',  0,0.4000    ,'2011-04-30',0.2000,'2013-01-11','RECORD NR 23','TEXT1 23'    ,'TEXT2 23',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2013-09-25','11.55.55',0,'MLLU','V107','USD','TAR',180,0.8000    ,'2012-11-12',8.0000,'2013-09-25','RECORD NR 24','TEXT1 24'    ,'TEXT2 24',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2013-10-15','15.57.57',0,'FAAN','V108','EUR','TAR',360,0.0000    ,'1900-01-01',0.7800,'2013-10-15','RECORD NR 25','TEXT1 25'    ,'TEXT2 25',CURRENT TIMESTAMP ); 

所有语句都应该以 SQLCODE 0 或 100 结尾。

检查表的内容

在插入数据后,我们执行以下查询来执行检查。

清单 3. 检查测试数据的 Select 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

两个表都应显示 25 条记录。

回页首

卸载和加载数据

卸载两个表空间

现在我们首先看看 UNLOAD 实用程序的使用。我们运行以下作业:

清单 4. 运行 UNLOAD 实用程序的示例 JCL

//* //********************************************************************** //* STEP DELETE: DELETE OLD DATA SETS //********************************************************************** //* //DELETE  EXEC PGM=IEFBR14 //CNTL01    DD DSN=IBMWG.CNTL.TSLAB01, //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1) //UNLD01    DD DSN=IBMWG.UNLD.TSLAB01, //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1) //CNTL02    DD DSN=IBMWG.CNTL.TSLAB02, //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1) //UNLD02    DD DSN=IBMWG.UNLD.TSLAB02, //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1) //* //********************************************************************** //* STEP UNLD1: UNLOAD TABLE SPACE //********************************************************************** //* //UNLD1   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.UNLD01' //SYSPUNCH  DD DSN=IBMWG.CNTL.TSLAB01, //             SPACE=(TRK,(5,5),RLSE), //             UNIT=SYSDA, //             DISP=(,CATLG,DELETE) //SYSREC    DD DSN=IBMWG.UNLD.TSLAB01, //             DISP=(,CATLG,DELETE), //             DCB=(BLKSIZE=8192), //             SPACE=(TRK,(35,5),RLSE), //             UNIT=SYSDA //SYSIN     DD *  UNLOAD TABLESPACE LAB01.TSLAB01  FROM TABLE "IBMWG"."TBLAB01" /* //* //********************************************************************** //* STEP UNLD2: UNLOAD TABLE SPACE //********************************************************************** //* //UNLD2   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.UNLD02' //SYSPUNCH  DD DSN=IBMWG.CNTL.TSLAB02, //             SPACE=(TRK,(5,5),RLSE), //             UNIT=SYSDA, //             DISP=(,CATLG,DELETE) //SYSREC    DD DSN=IBMWG.UNLD.TSLAB02, //             DISP=(,CATLG,DELETE), //             DCB=(BLKSIZE=8192), //             SPACE=(TRK,(35,5),RLSE), //             UNIT=SYSDA //SYSIN     DD *  UNLOAD TABLESPACE LAB01.TSLAB02  FROM TABLE "IBMWG"."TBLAB02" /* 

备注:此作业的第一步将会删除要创建的卸载数据集,防止它们在执行以前的操作后仍然存在。在使用真实数据的实际场景中,在删除卸载数据集时需要小心,因为您以后可能需要使用它们。

执行此作业会得到 RC=00。完成上述操作后,我们允许用户查看以下项:

  • SDSF 下载的作业输出 — 在 SYSPRINT 中,显示了有关实用程序执行情况的信息。
  • SYSREC 文件 — 它们分别包含 25 条记录,其中是表列格式的表空间内容。
  • SYSPUNCH 文件 — 这些文件包含卸载的数据的布局和将用于重新加载数据的必要语句。

用户一定要理解每个文件包含哪些内容,它们用于何种用途,以及两个文件之间有何区别。

使用 RESUME YES 加载两个表空间

我们现在使用了上一步中得到的 SYSPUNCH 和 SYSREC 文件,对两个表空间执行 LOAD 实用程序。我们不会更改 LOAD 语句上的任何代码,这意味着 LOAD 实用程序将会按以下方式执行。

清单 5. 运行 LOAD ( RESUME ) 实用程序的示例 LOAD 卡。

LOAD DATA INDDN SYSREC   LOG NO  RESUME YES

执行了下面这个作业。

清单 6. 运行 LOAD ( RESUME ) 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP LOAD1: LOAD TABLE SPACE                     //**********************************************************************                     //*                     //LOAD1   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.LOAD01'                     //DSNUPROC.SYSREC DD DSN=IBMWG.UNLD.TSLAB01,DISP=(OLD),UNIT=SYSDA                     //DSNUPROC.SYSUT1 DD DSN=&&SYSUT1,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SORTOUT DD DSN=&&SORTOUT,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSMAP DD DSN=&&SYSMAP,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSIN DD DSN=IBMWG.CNTL.TSLAB01,DISP=(OLD),UNIT=SYSDA                     //*                     //**********************************************************************                     //* STEP LOAD2: LOAD TABLE SPACE                     //**********************************************************************                     //*                     //LOAD2   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.LOAD02'                     //DSNUPROC.SYSREC DD DSN=IBMWG.UNLD.TSLAB02,DISP=(OLD),UNIT=SYSDA                     //DSNUPROC.SYSUT1 DD DSN=&&SYSUT1,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SORTOUT DD DSN=&&SORTOUT,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSMAP DD DSN=&&SYSMAP,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSIN DD DSN=IBMWG.CNTL.TSLAB02,DISP=(OLD),UNIT=SYSDA

此作业会得到 RC=04。完成上述操作后,我们允许用户查看以下项:

  • SDSF 下载的作业输出。在执行的两个实用程序的 SYSPRINT 中,显示了重要的信息。为什么执行结果是 RC=04:两个表空间都处于 COPY PENDING 状态。除此之外,由于我们这里创建的 UNIQUE 索引在第一个表空间中,所有记录都因为重复的键条件而被拒绝(另一个表没有 UNIQUE 索引,所以全部记录都被加载)。
  • 表和索引空间的状态可以使用 Interactive DB2 下的 DB2 命令进行显示。这将显示两个表空间都处于 RW,COPY 状态。

要使用的命令:

-DISPLAY DATABASE(LAB01) SPACENAM(*)

此命令的输出显示的信息类似下面这个清单。

清单 7. 显示一个数据库内的表空间状态的 DB2 命令的结果

DSNT360I  -DSN1 *********************************** DSNT361I  -DSN1 *  DISPLAY DATABASE SUMMARY                 *    GLOBAL DSNT360I  -DSN1 *********************************** DSNT362I  -DSN1     DATABASE = LAB01  STATUS = RW  DBD LENGTH = 8066 DSNT397I  -DSN1 NAME     TYPE PART  STATUS            PHYERRLO PHYERRHI CATALOG  PIECE -------- ---- ----- ----------------- -------- -------- -------- ----- TSLAB01  TS         RW,COPY TSLAB02  TS         RW,COPY TBLA1F1L IX         RW TBLA1TCC IX         RW TBLA1VJD IX         RW TBLA1VOE IX         RW TBLAB01R IX         RW TBLAB02R IX         RW ******* DISPLAY OF DATABASE LAB01    ENDED      ********************** DSN9022I  -DSN1 DSNTDDIS 'DISPLAY DATABASE' NORMAL COMPLETION *** 

COPY PENDING 状态是 LOAD 实用程序上的 LOG NO 条件的结果。因为 DB2 没有记录表空间的更改,所以它引导用户创建一个备份来恢复丢失的日志信息。

在这种情况下,有两个解决方案:

  • 获取两个表空间的镜像副本
  • 运行 REPAIR 实用程序来删除 COPY PENDING 状态

有必要解释一下在哪种情况下使用哪个解决方案。通常,当您有一个简单方法,可在执行 LOAD 后重新创建表空间的内容,无需获取镜像副本。如果您明确需要一个备份,而且这是恢复表空间内容的惟一方式,那么可以获取镜像副本。

检查表的内容

数据加载后,我们执行以下查询来执行检查。

清单 8. 检查测试数据的 Select 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

第一个表仍显示 25 条记录。第二个表现在会显示 25 条记录。

删除 COPY PENDING 状态

在这一步中,我们运行 REPAIR 实用程序来删除两个表空间的 COPY PENDING 状态。

清单 9. 运行 REPAIR 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP REPAIR1: REPAIR TABLE SPACES                     //**********************************************************************                     //*                     //REPAIR1 EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.REPAIR'                     //SYSIN     DD *                      REPAIR OBJECT                      SET TABLESPACE LAB01.TSLAB01 NOCOPYPEND                      SET TABLESPACE LAB01.TSLAB02 NOCOPYPEND                     /*

此作业的执行将得到 RC=00。完成上述操作后,查看以下项:

  • SDSF 下载的作业输出 — 在执行的实用程序的 SYSPRINT 中,显示了所有重要的信息。
  • 表和索引空间的状态可以使用 Interactive DB2 下的 DB2 命令进行显示 — 它们现在将显示两个表空间都处于 RW 状态。

使用 REPLACE 加载两个表空间

现在我们将使用一个 LOAD REPLACE 来加载两个表空间,以显示该命令与 LOAD RESUME 之间的区别。出于演示目的,我们已使用 LOAD 指令准备了两个不同的 SYSPUNCH 文件。

LOAD DATA INDDN SYSREC   LOG NO  RESUME NO REPLACE NOCOPYPEND

请注意,我们不仅将加载指令更改为 RESUME NO REPLACE ,还添加了 NOCOPYPEND 。有必要解释一下使用此参数的原因(指的是执行我们的 LOAD RESUME 步骤所得到的 COPY PENDING 状态)。我们还可以将 LOAD 卡更改为 LOG YES

我们还创建了两个新 SYSREC 文件,它们实质上是最初的文件的副本,我们在其中更改了一些记录的日期。

清单 10. 将在 LOAD ( REPLACE ) 实用程序中使用的已更改的加载数据的示例

..2008-09-3010.03.03..LAMNB066USDTAR...!....1900-01-01....2008-09-30RECORD NR 01                     ..2008-09-3010.04.04..LAMNB066USDTAR........1900-01-01....2008-09-30RECORD NR 02                     ..2008-09-3010.05.05..LAMNB066USDTAR...©....1900-01-01....2008-09-30RECORD NR 03                     ..2009-09-1508.00.00..LAMNB066USDTAR........2008-09-30..&.2009-09-15RECORD NR 04                     ..2009-09-1508.01.01..LAMNB066USDTAR...!....2008-09-30..&.2009-09-15RECORD NR 05                     ..2009-09-1508.02.02..LAMNB066USDTAR...Ç.á..2008-09-30..&.2009-09-15RECORD NR 06                     ..2009-10-2216.26.26..LAMNB066USDTAR......&.2009-09-15....2009-10-22RECORD NR 07                     ..2012-07-1521.53.53..LAMNSO53USDTAR...!..&.2009-09-15....2012-07-15RECORD NR 08                     ..2012-07-1521.54.54..LAMNSO53USDTAR...Ç..&.2009-09-15....2012-07-15RECORD NR 09                     ..2012-07-3118.04.04..LAMNB066USDTAR........2009-10-22....2012-07-31RECORD NR 10                     ..2013-04-1107.55.55..LAMNB066USDTAR...!....2012-07-15....2013-04-11RECORD NR 11                     ..2013-04-1107.56.56..LAMNB066USDTAR...Ç....2012-07-15....2013-04-11RECORD NR 12                     ..2013-04-3019.40.40..LAMNB065USDTAR........2012-07-31....2013-04-30RECORD NR 13                     ..2014-09-2407.43.43..LAMNB065USDTAR...!....2013-04-11..&.2014-09-24RECORD NR 14                     ..2014-09-2407.44.44..LAMNB065USDTAR...©....2013-04-11..&.2014-09-24RECORD NR 15                     ..2014-10-3118.30.30..LAMNB065USDTAR...!..&.2014-09-24....2014-10-31RECORD NR 16                     ..2014-10-3118.31.31..LAMNB065USDTAR...©..&.2014-09-24....2014-10-31RECORD NR 17                     ..2014-10-3118.32.32..LAMNB065USDTAR...Ç....2014-09-24....2014-10-31RECORD NR 18                     ..2014-11-0618.19.19..LAMNB066USDTAR...!....2014-10-31..&.2014-11-06RECORD NR 19                     ..2014-11-0618.20.20..LAMNB066USDTAR...Ç....2014-10-31....2014-11-06RECORD NR 20                     ..2014-11-1209.16.16..LAMNB066USDTAR...!..&.2014-11-06....2014-11-12RECORD NR 21                     ..2014-11-1209.17.17..LAMNB066USDTAR...Ç....2014-11-06....2014-11-12RECORD NR 22                     ..2015-01-1114.41.41..LAMNB066USDTAR........2013-04-30....2015-01-11RECORD NR 23                     ..2015-09-2511.55.55..MLLUV107USDTAR...©....2014-11-12.Ø..2015-09-25RECORD NR 24                     ..2015-10-1515.57.57..FAANV108EURTAR...Ç....1900-01-01..Ø.2015-10-15RECORD NR 25

然后运行以下作业。

清单 11. 运行 LOAD ( REPLACE ) 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP LOAD1: LOAD TABLE SPACE                     //**********************************************************************                     //*                     //LOAD1   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.LOAD01'                     //DSNUPROC.SYSREC DD DSN=IBMWG.UNLD.TSLAB01A,DISP=(OLD),UNIT=SYSDA                     //DSNUPROC.SYSUT1 DD DSN=&&SYSUT1,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SORTOUT DD DSN=&&SORTOUT,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSMAP DD DSN=&&SYSMAP,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSIN DD DSN=IBMWG.CNTL.TSLAB01A,DISP=(OLD),UNIT=SYSDA                     //*                     //**********************************************************************                     //* STEP LOAD2: LOAD TABLE SPACE                     //**********************************************************************                     //*                     //LOAD2   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.LOAD02'                     //DSNUPROC.SYSREC DD DSN=IBMWG.UNLD.TSLAB02A,DISP=(OLD),UNIT=SYSDA                     //DSNUPROC.SYSUT1 DD DSN=&&SYSUT1,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SORTOUT DD DSN=&&SORTOUT,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSMAP DD DSN=&&SYSMAP,DISP=(NEW,PASS),UNIT=SYSDA,                     //             SPACE=(TRK,(10,10))                     //DSNUPROC.SYSIN DD DSN=IBMWG.CNTL.TSLAB02A,DISP=(OLD),UNIT=SYSDA

执行次作业将得到 RC=00。运行该作业后,我们查看以下项:

  • SDSF 下载的作业输出 — 在执行的实用程序的 SYSPRINT 中,显示了所有重要的信息。
  • 表和索引空间的状态可以使用 Interactive DB2 下的 DB2 命令进行显示 — 它们将显示两个表空间都处于 RW 状态。

检查表的内容

完成 LOAD REPLACE 后,我们按检查的顺序再次选择两个表的内容。

清单 12. 检查测试数据的 Select 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

两个表都应再次显示 25 条记录,但这两种情况下都包含与我们用于 LOAD REPLACE 的(已更改的)SYSREC 文件一致的一组新数据。

回页首

创建镜像副本和恢复数据

创建两个表空间的镜像副本

有了两个表的新内容后,我们现在创建两个表空间的一个(完整的)镜像副本。

清单 13. 运行 COPY ( FULL ) 实用程序的示例 JCL

//* //********************************************************************** //* STEP DELETE: DELETE OLD DATA SETS //********************************************************************** //* //DELETE  EXEC PGM=IEFBR14 //COPY01    DD DSN=IBMWG.COPY.TSLAB01.FULL01, //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1) //COPY02    DD DSN=IBMWG.COPY.TSLAB02.FULL01, //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1) //* //********************************************************************** //* STEP COPY1: FULL IMAGE COPY OF TABLE SPACE //********************************************************************** //* //COPY1   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.COPYFL' //SYSCOPY   DD DSN=IBMWG.COPY.TSLAB01.FULL01,UNIT=SYSDA, //             SPACE=(CYL,(10,1)),DISP=(NEW,CATLG,CATLG) //SYSIN     DD *  COPY TABLESPACE LAB01.TSLAB01 /* //* //********************************************************************** //* STEP COPY2: FULL IMAGE COPY OF TABLE SPACE //********************************************************************** //* //COPY2   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.COPYFL' //SYSCOPY   DD DSN=IBMWG.COPY.TSLAB02.FULL01,UNIT=SYSDA, //             SPACE=(CYL,(10,1)),DISP=(NEW,CATLG,CATLG) //SYSIN     DD *  COPY TABLESPACE LAB01.TSLAB02 /* 

备注:此作业的第一步将会删除创建的镜像副本数据集,放置它们在执行以前的操作后仍然存在。在真实情况下,您不应删除任何镜像副本数据集,除非确定您不再需要它们。您需要知道镜像副本数据集无法重用,因为 DB2 的目录保留了镜像副本活动的信息和使用的数据集。如果您决定删除镜像副本数据集,那么一定要使用 MODIFY RECOVERY 实用程序清除目录,本练习没有介绍此过程。

此作业的执行最终会得到 RC=00。完成上述操作后,查看以下项:

  • SDSF 下的作业输出 — 具体地讲,两个 COPY 实用程序的 SYSPRINT 包含宝贵的信息。
  • 输出数据集 — 有必要给出来自 UNLOAD 实用程序的 SYSREC(包含来自表空间的表列格式的数据)与来自 COPY 实用程序的 SYSCOPY(包含来自表空间的页面格式的数据)之间的区别。镜像副本数据集显示了两个有趣的事实:
    1. 两个表空间都占用了 7 个数据页面,每个页面有 4 条记录(最后一页仅有 1 条记录)。
    2. 这些记录存按使用 LOAD 实用程序加载它们的相同顺序存储在表空间的数据页面上。

检查 DB2 目录中的信息

获取完整的镜像副本后,我们现在选择使用来自目录表 SYSCOPY 的数据来展示哪些与备份和恢复活动相关的信息存储在了 DB2 的目录中。我们使用以下查询:

SELECT * FROM SYSIBM.SYSCOPY                        WHERE DBNAME = 'LAB01';

结果如下所示(这里只显示了前几行)。

清单 14. 目录数据的输出

DBNAME    TSNAME          DSNUM  ICTYPE  ICDATE  START_RBA    FILESEQNO                     ---------+---------+---------+---------+---------+---------+---------+-                     LAB01     TSLAB01             0  C       150414  ..§3©»               0                     LAB01     TSLAB02             0  C       150414  ..§5˳               0                     LAB01     TSLAB01             0  Y       150414  ..§³©ç               0                     LAB01     TSLAB02             0  Y       150414  ..§Ú²J               0                     LAB01     TSLAB01             0  S       150414  ..¶.É,               0                     LAB01     TSLAB02             0  S       150414  ..¶.ÓH               0                     LAB01     TSLAB01             0  F       150414  ..¶.ü.               0                     LAB01     TSLAB02             0  F       150414  ..¶.Wo               0                     DSNE610I NUMBER OF ROWS DISPLAYED IS 8

有必要解释以下列 ICTYPE 和 START_RBA 的含义:

  • ICTYPE 表示备份和恢复活动的类型(C = 创建,Y = 加载继续,S = 加载替换,F = 完整镜像副本,等等)。
  • START_RBA(RBA = 相对字节地址)表示活动发生的时间点;该指标表示为日志的一个指针。

将更多记录插入两个表中

我们现在使用标准 INSERT 语句在每个测试表中插入 5 条额外的记录。

INSERT INTO TBLAB01 VALUES   ( '2010-09-30','10.03.03',0,'LAMN','B066','USD','TAR', 90,0.0000    ,'1900-01-01',2.0000,'2010-09-30','RECORD NR 26','TEXT1 26'    ,'TEXT2 26',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2010-09-30','10.04.04',0,'LAMN','B066','USD','TAR',  0,0.0000    ,'1900-01-01',1.1250,'2010-09-30','RECORD NR 27','TEXT1 27'    ,'TEXT2 27',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2010-09-30','10.05.05',0,'LAMN','B066','USD','TAR',180,0.0000    ,'1900-01-01',3.0000,'2010-09-30','RECORD NR 28','TEXT1 28'    ,'TEXT2 28',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2011-09-15','08.00.00',0,'LAMN','B066','USD','TAR',  0,1.1250    ,'2010-09-30',0.8500,'2011-09-15','RECORD NR 29','TEXT1 29'    ,'TEXT2 29',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2011-09-15','08.01.01',0,'LAMN','B066','USD','TAR', 90,2.0000    ,'2010-09-30',0.8500,'2011-09-15','RECORD NR 30','TEXT1 30'    ,'TEXT2 30',CURRENT TIMESTAMP ); --   COMMIT; --   INSERT INTO TBLAB02 VALUES   ( '2010-09-30','10.03.03',0,'LAMN','B066','USD','TAR', 90,0.0000    ,'1900-01-01',2.0000,'2010-09-30','RECORD NR 26','TEXT1 26'    ,'TEXT2 26',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2010-09-30','10.04.04',0,'LAMN','B066','USD','TAR',  0,0.0000    ,'1900-01-01',1.1250,'2010-09-30','RECORD NR 27','TEXT1 27'    ,'TEXT2 27',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2010-09-30','10.05.05',0,'LAMN','B066','USD','TAR',180,0.0000    ,'1900-01-01',3.0000,'2010-09-30','RECORD NR 28','TEXT1 28'    ,'TEXT2 28',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2011-09-15','08.00.00',0,'LAMN','B066','USD','TAR',  0,1.1250    ,'2010-09-30',0.8500,'2011-09-15','RECORD NR 29','TEXT1 29'    ,'TEXT2 29',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB02 VALUES   ( '2011-09-15','08.01.01',0,'LAMN','B066','USD','TAR', 90,2.0000    ,'2010-09-30',0.8500,'2011-09-15','RECORD NR 30','TEXT1 30'    ,'TEXT2 30',CURRENT TIMESTAMP ); 

所有插入操作都应得到 SQLCODE 0。

检查表的内容

插入这些记录后,我们再次按检查的顺序选择两个表的内容。

清单 15. 检查测试数据的 Select 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

两个表现在都应显示 30 条记录。

创建增量镜像副本

然后,我们使用下面这个作业创建第二个表空间的增量镜像副本。

清单 16. 运行 COPY ( INCREMENTAL ) 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP DELETE: DELETE OLD DATA SETS                     //**********************************************************************                     //*                     //DELETE  EXEC PGM=IEFBR14                     //COPY01    DD DSN=IBMWG.COPY.TSLAB02.INCR01,                     //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1)                     //*                     //**********************************************************************                     //* STEP COPY1: INCREMENTAL IMAGE COPY OF TABLE SPACE                     //**********************************************************************                     //*                     //COPY1   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.COPYIN'                     //SYSCOPY   DD DSN=IBMWG.COPY.TSLAB02.INCR01,UNIT=SYSDA,                     //             SPACE=(CYL,(1,1)),DISP=(NEW,CATLG,CATLG)                     //SYSIN     DD *                      COPY TABLESPACE LAB01.TSLAB02 FULL NO                     /*

备注:此作业的第一步将会删除将创建的镜像副本数据集,放置它们在执行以前的操作后仍然存在。在真实场景中,现在您不应删除任何镜像副本数据集,除非您确定不再需要它们。

执行该作业会得到 RC=00。查看以下项:

  • SDSF 下的作业输出,具体地讲,就是实用程序的 SYSPRINT。
  • 执行该实用程序所得到的数据集。就像镜像副本数据集以页面格式显示数据一样,增量镜像副本应仅包含自上次创建镜像副本以来更改的页面。在我们的练习中,我们看到了以下有趣的信息:
    • INSERT 语句已在现有的数据页面上放置了 5 条额外的记录,填入了最初 LOAD 实用程序由于 PCTFREE 参数而保持空闲的空间。
    • 因为仅插入了 5 条额外的记录,所以仅更改了 5 个数据页面,所以增量镜像副本仅包含 5 个数据页面。未更改的两个数据页面未出现在增量镜像副本数据集中。

再次检查 DB2 目录中的信息

获取增量镜像副本后,我们再次选择使用来自目录表 SYSCOPY 的数据来展示哪些与备份和恢复活动相关的信息存储在了 DB2 的目录中。

SELECT * FROM SYSIBM.SYSCOPY                        WHERE DBNAME = 'LAB01';

结果如下所示(这里只显示了前几行)。

清单 17. 目录数据的输出

DBNAME    TSNAME          DSNUM  ICTYPE  ICDATE  START_RBA    FILESEQNO                     ---------+---------+---------+---------+---------+---------+---------+-                     LAB01     TSLAB01             0  C       150414  ..§3©»               0                     LAB01     TSLAB02             0  C       150414  ..§5˳               0                     LAB01     TSLAB01             0  Y       150414  ..§³©ç               0                     LAB01     TSLAB02             0  Y       150414  ..§Ú²J               0                     LAB01     TSLAB01             0  S       150414  ..¶.É,               0                     LAB01     TSLAB02             0  S       150414  ..¶.ÓH               0                     LAB01     TSLAB01             0  F       150414  ..¶.ü.               0                     LAB01     TSLAB02             0  F       150414  ..¶.Wo               0                     LAB01     TSLAB02             0  I       150414  ..¶.f©               0                     DSNE610I NUMBER OF ROWS DISPLAYED IS 9

目录表现在显示了表空间 TSLAB02 的新的增量镜像副本的信息。

不使用任何参数恢复两个表空间

在这里,我们不使用任何参数对两个表空间执行一次恢复。我们使用以下 JCL。

清单 18. 运行 RECOVER (FULL) 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP RECOV1: RECOVER TABLE SPACES                     //**********************************************************************                     //*                     //RECOV1  EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.RECOVER'                     //SYSIN     DD *                      RECOVER TABLESPACE LAB01.TSLAB01                      RECOVER TABLESPACE LAB01.TSLAB02                     /*

执行上述代码后会得到 RC=00。完成该作业后,查看 SDSF 中的输出。SYSPRINT 包含重要的信息。

检查表的内容

恢复后,我们再次选择两个表的内容。

清单 19. 检查测试数据的 Select 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

两个表像以前一样包含 30 条记录。尽管对于第 1 个表空间,上一个(完整)镜像副本是在我们插入 5 条额外的记录之前创建的,但这些额外的记录已使用 RECOVER 实用程序进行恢复。如果我们不使用参数运行 RECOVER 实用程序,DB2 会将表空间恢复到日志中最新的可用信息之前的状态。它恢复最后一个可用的镜像副本(完整和/或增量),并从这里读取日志来恢复剩余信息。 RECOVER 实用程序使用 START_RBA 列中的值来查找开始读取日志的位置。

将第二个表空间恢复到最后一个完整的镜像副本

对于第二个表空间 (TSLAB02),我们有一个完整镜像副本和一个增量镜像副本。我们将恢复到创建的最后一个完整镜像副本。

清单 20. 运行 RECOVER ( TOCOPY ) 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP RECOV1: RECOVER TO LAST FULL COPY OF TABLE SPACE                     //**********************************************************************                     //*                     //RECOV1  EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.RECOVR'                     //SYSIN     DD *                      RECOVER TABLESPACE LAB01.TSLAB02                      TOCOPY IBMWG.COPY.TSLAB02.FULL01                     /*

执行此作业将返回 RC=04。查看两处信息:

  • SDSF 中的作业输出。在这里我们发现了作业返回代码 04 的原因。执行 RECOVER TOCOPY 时,索引未恢复。两个索引的索引空间仍处于 REBUILD PENDING 状态。
  • 我们像之前一样,通过 DB2 命令来检查表和索引空间的状态。

要使用的命令:

-DISPLAY DATABASE(LAB01) SPACENAM(*)

此命令的输出显示的信息类似以下代码。

清单 21. 显示一个数据库内的表空间状态的 DB2 命令的结果

DSNT360I  -DSN1 *********************************** DSNT361I  -DSN1 *  DISPLAY DATABASE SUMMARY                 *    GLOBAL DSNT360I  -DSN1 *********************************** DSNT362I  -DSN1     DATABASE = LAB01  STATUS = RW  DBD LENGTH = 8066 DSNT397I  -DSN1 NAME     TYPE PART  STATUS            PHYERRLO PHYERRHI CATALOG  PIECE -------- ---- ----- ----------------- -------- -------- -------- ----- TSLAB01  TS         RW TSLAB02  TS         RW TBLA1F1L IX         RW,RBDP TBLA1TCC IX         RW TBLA1VJD IX         RW TBLA1VOE IX         RW TBLAB01R IX         RW TBLAB02R IX         RW,RBDP ******* DISPLAY OF DATABASE LAB01    ENDED      ********************** DSN9022I  -DSN1 DSNTDDIS 'DISPLAY DATABASE' NORMAL COMPLETION *** 

重新构建索引

要重新创建索引,我们需要使用以下 JCL 来运行 REBUILD INDEX 实用程序。

清单 22. 运行 REBUILD INDEX 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP REBLD1: REBUILD INDEXES                     //**********************************************************************                     //*                     //REBLD1  EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.RBLDIX'                     //SYSIN     DD *                      REBUILD INDEX (ALL) TABLESPACE LAB01.TSLAB02                     /*

执行此作业将得到 RC=00。完成该作业后,我们查看以下项:

  • SDSF 中的作业输出 — SYSPRINT 提供了有关该实用程序执行情况的重要信息。
  • 我们通过上一步中的相同方式检查表和索引空间的状态。我们现在看到两个索引空间都处于 RW 状态。

检查表的内容

执行这个 RECOVER TOCOPYREBUILD INDEX 后,我们再次选择两个表的内容。

清单 23. 检查测试数据的 Select 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

第一个表(当然)仍包含 30 条记录,但第二个表现在包含 25 条记录。最后一个完整镜像副本是在我们插入 5 条额外的记录之前获取的。现在我们将表空间恢复到了我们执行插入之前的情形。

第一个表空间的新的完整镜像副本

我们现在运行下面这个作业来获取第一个表空间的新的完整镜像副本。

清单 24. 运行 COPY ( FULL ) 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP DELETE: DELETE OLD DATA SETS                     //**********************************************************************                     //*                     //DELETE  EXEC PGM=IEFBR14                     //COPY01    DD DSN=IBMWG.COPY.TSLAB01.FULL02,                     //             UNIT=SYSDA,DISP=(MOD,DELETE,DELETE),SPACE=(TRK,1)                     //*                     //**********************************************************************                     //* STEP COPY1: FULL IMAGE COPY OF TABLE SPACE                     //**********************************************************************                     //*                     //COPY1   EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.COPYFL'                     //SYSCOPY   DD DSN=IBMWG.COPY.TSLAB01.FULL02,UNIT=SYSDA,                     //             SPACE=(CYL,(10,1)),DISP=(NEW,CATLG,CATLG)                     //SYSIN     DD *                      COPY TABLESPACE LAB01.TSLAB01                     /*

备注:此作业的第一步将会删除将创建的镜像副本数据集,防止它们在执行以前的操作后仍然存在。在真实场景中,您现在不应删除任何镜像副本数据集,除非您确定不再需要它们。

执行该作业会得到 RC=00。查看以下项:

  • SDSF 下载的作业输出 — SYSPRINT 包含与 COPY 实用程序执行情况相关的基本信息。
  • 我们也检查一下输出数据集。它包含与 7 个数据页面中的每一个对应的一条记录。前 5 个页面现在分别包含 5 条记录,第 6 个包含 4 条记录,而最后一个仅包含 1 条记录。

检查 DB2 目录中的信息

同样地,我们对目录表 SYSCOPY 运行查询来检查这里创建了哪些信息。

清单 25. 验证目录数据的 Select 语句

SELECT * FROM SYSIBM.SYSCOPY                        WHERE DBNAME = 'LAB01';

结果如下所示(这里只显示了前几行)。

清单 26. 目录数据的输出

DBNAME    TSNAME          DSNUM  ICTYPE  ICDATE  START_RBA    FILESEQNO                     ---------+---------+---------+---------+---------+---------+---------+-                     LAB01     TSLAB01             0  C       150414  ..§3©»               0                     LAB01     TSLAB02             0  C       150414  ..§5˳               0                     LAB01     TSLAB01             0  Y       150414  ..§³©ç               0                     LAB01     TSLAB02             0  Y       150414  ..§Ú²J               0                     LAB01     TSLAB01             0  S       150414  ..¶.É,               0                     LAB01     TSLAB02             0  S       150414  ..¶.ÓH               0                     LAB01     TSLAB01             0  F       150414  ..¶.ü.               0                     LAB01     TSLAB02             0  F       150414  ..¶.Wo               0                     LAB01     TSLAB02             0  I       150414  ..¶.f©               0                     LAB01     TSLAB01             0  E       150414  ..¶.>-               0                     LAB01     TSLAB02             0  E       150414  ..¶./Ð               0                     LAB01     TSLAB02             0  P       150414  ..¶..¦               0                     LAB01     TSLAB01             0  F       150414  ..¶.fo               0                     DSNE610I NUMBER OF ROWS DISPLAYED IS 13

目录表现在显示了两次恢复的信息: RECOVER TOCOPY 和我们在之前的步骤中为表空间 TSLAB01 创建的新的完整镜像副本。

回页首

让一个表空间静默并恢复数据

在第一个测试表中插入额外的记录

随后,我们再次向表 TBLAB01 插入一些额外的记录。我们通过 SPUFI 来使用标准 INSERT 语句。

清单 27. 针对额外的测试数据的 INSERT 语句

INSERT INTO TBLAB01 VALUES   ( '2006-09-30','10.03.03',0,'LAMN','B066','USD','TAR', 90,0.0000    ,'1900-01-01',2.0000,'2006-09-30','RECORD NR 31','TEXT1 31'    ,'TEXT2 31',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2006-09-30','10.04.04',0,'LAMN','B066','USD','TAR',  0,0.0000    ,'1900-01-01',1.1250,'2006-09-30','RECORD NR 32','TEXT1 32'    ,'TEXT2 32',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2006-09-30','10.05.05',0,'LAMN','B066','USD','TAR',180,0.0000    ,'1900-01-01',3.0000,'2006-09-30','RECORD NR 33','TEXT1 33'    ,'TEXT2 33',CURRENT TIMESTAMP ); 

所有 INSERT 都返回 SQLCODE 0。

检查表的内容

检查两个表的内容。

清单 28. 检查测试数据的 Select 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

第一个表现在包含 33 条记录,第二个表仍包含 25 条记录不变。

对第一个表空间执行 QUIESCE

这一次我们对第一个表空间运行 QUIESCE 实用程序。 QUIESCE 实用程序执行的惟一的一件事是返回一个相对字节地址 (RBA) 和日志记录序列号 (LRSN),它们是可在以后用来将数据恢复到该时间点的日志的指针。我们现在使用以下 JCL。

清单 29. 运行 QUIESCE 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP QUIESCE: TAKE QUIESCE OF TABLE SPACE                     //**********************************************************************                     //*                     //QUIESCE EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.QUISCE'                     //SYSIN     DD *                      QUIESCE TABLESPACE LAB01.TSLAB01                     /*

执行该 JCL 将返回 RC=00。完成该作业后,检查 SDSF 下的作业输出。SYSPRINT 包含与 QUIESCE 实用程序执行情况相关的基本信息。有必要记下 LRSN 或 RBA。

清单 30. QUIESCE 实用程序的 SYSPRINT 输出

DSNUGUTC - OUTPUT START FOR UTILITY, UTILID = IBMWG.QUISCE                     DSNUGTIS - PROCESSING SYSIN AS EBCDIC                     DSNUGUTC -  QUIESCE TABLESPACE LAB01.TSLAB01                     .05 DSNUQUIA - QUIESCE SUCCESSFUL FOR TABLESPACE LAB01.TSLAB01                     .06 DSNUQUIA - QUIESCE AT RBA 0000B617747C AND AT LRSN 0000B617747C                     DSNUQUIB - QUIESCE UTILITY COMPLETE, ELAPSED TIME= 00:00:00                     DSNUGBAC - UTILITY EXECUTION COMPLETE, HIGHEST RETURN CODE=0

检查 DB2 的目录

我们首先看看目录表 SYSCOPY,看看 DB2 目前存储了哪些与我们的活动相关的信息。

清单 31. 验证目录数据的 SELECT 语句

SELECT * FROM SYSIBM.SYSCOPY                        WHERE DBNAME = 'LAB01';

结果如下所示(这里只显示了前几行)。

清单 32. 目录数据的输出

DBNAME    TSNAME          DSNUM  ICTYPE  ICDATE  START_RBA    FILESEQNO                     ---------+---------+---------+---------+---------+---------+---------+-                     LAB01     TSLAB01             0  C       150414  ..§3©»               0                     LAB01     TSLAB02             0  C       150414  ..§5˳               0                     LAB01     TSLAB01             0  Y       150414  ..§³©ç               0                     LAB01     TSLAB02             0  Y       150414  ..§Ú²J               0                     LAB01     TSLAB01             0  S       150414  ..¶.É,               0                     LAB01     TSLAB02             0  S       150414  ..¶.ÓH               0                     LAB01     TSLAB01             0  F       150414  ..¶.ü.               0                     LAB01     TSLAB02             0  F       150414  ..¶.Wo               0                     LAB01     TSLAB02             0  I       150414  ..¶.f©               0                     LAB01     TSLAB01             0  E       150414  ..¶.>-               0                     LAB01     TSLAB02             0  E       150414  ..¶./Ð               0                     LAB01     TSLAB02             0  P       150414  ..¶..¦               0                     LAB01     TSLAB01             0  F       150414  ..¶.fo               0                     LAB01     TSLAB01             0  Q       150414  ..¶.È@               0                     DSNE610I NUMBER OF ROWS DISPLAYED IS 14

目录表现在显示了在我们的上一步中执行的 QUIESCE 的信息。

如果我们以十六进制格式显示商标中的最后个条目,我们会在列 START_RBA 中看到与在执行 QUIESCE 后的 SYSPRINT 中相同的 RBA。

清单 33. 十六进制格式的目录数据输出

LAB01     TSLAB01             0  Q       150414  ..¶.È@               0                     DCCFF44444EEDCCFF4444444444444F44D4444444FFFFFF4400B177444444444444444F                     312010000032312010000000000000000800000001504140000674C0000000000000000

将更多记录插入到第一个表中

我们现在将另一组额外的记录插入到第一个测试表中。我们再次通过标准 INSERT 语句来使用 SPUFI:

清单 34. 针对额外的测试数据的 INSERT 语句

INSERT INTO TBLAB01 VALUES   ( '2007-09-15','08.00.00',0,'LAMN','B066','USD','TAR',  0,1.1250    ,'2010-09-30',0.8500,'2009-09-15','RECORD NR 34','TEXT1 34'    ,'TEXT2 34',CURRENT TIMESTAMP ); --   INSERT INTO TBLAB01 VALUES   ( '2007-09-15','08.01.01',0,'LAMN','B066','USD','TAR', 90,2.0000    ,'2010-09-30',0.8500,'2009-09-15','RECORD NR 35','TEXT1 35'    ,'TEXT2 35',CURRENT TIMESTAMP ); 

两个 INSERT 都获得 SQLCODE 0。

检查表的内容

我们使用以下查询检查了两个测试表的内容。

清单 35. 检查测试数据的 SELECT 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

第一个表现在包含 35 条记录,第二个表仍包含 25 条记录不变。

恢复第一个表空间的 TOLOGPOINTTORBA

现在我们使用参数 TOLOGPOINT 来运行 RECOVER 实用程序。我们还可以使用 TORBA 参数,它的用途完全相同。我们使用以下 JCL(请注意,我们指明了在执行 QUIESCE 实用程序后获得的 LRSB):

清单 36. 运行 RECOVER ( TOLOGPOINT ) 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP RECOV1: RECOVER TO LOGPOINT                     //**********************************************************************                     //*                     //RECOV1  EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.RECOVR'                     //SYSIN     DD *                      RECOVER TABLESPACE LAB01.TSLAB01                      TOLOGPOINT X'0000B617747C'                     /*

执行 RECOVERY 实用程序会得到 RC=04。完成作业后,查看以下项:

  • SDSF 中的作业输出。在这里我们发现了作业返回代码 04 的原因。对于 RECOVER TOLOGPOINT ,索引未恢复(与使用 RECOVER TOCOPY 完全相同)。所有 4 个索引的索引空间都仍处于 REBUILD PENDING 状态。
  • 我们像第 5 步中一样,通过 DB2 命令来检查表和索引空间的状态。

要使用的命令:

-DISPLAY DATABASE(LAB01) SPACENAM(*)

输出显示的信息类似下面这个清单。

清单 37. 显示一个数据库内的表空间状态的 DB2 命令的结果

DSNT360I  -DSN1 *********************************** DSNT361I  -DSN1 *  DISPLAY DATABASE SUMMARY                 *    GLOBAL        DSNT360I  -DSN1 *********************************** DSNT362I  -DSN1     DATABASE = LAB01  STATUS = RW  DBD LENGTH = 8066 DSNT397I  -DSN1 NAME     TYPE PART  STATUS            PHYERRLO PHYERRHI CATALOG  PIECE -------- ---- ----- ----------------- -------- -------- -------- ----- TSLAB01  TS         RW TSLAB02  TS         RW TBLA1F1L IX         RW TBLA1TCC IX         RW,RBDP TBLA1VJD IX         RW,RBDP TBLA1VOE IX         RW,RBDP TBLAB01R IX         RW,RBDP TBLAB02R IX         RW ******* DISPLAY OF DATABASE LAB01    ENDED      ********************** DSN9022I  -DSN1 DSNTDDIS 'DISPLAY DATABASE' NORMAL COMPLETION *** 

5.8 重新构建索引

要重新创建索引,需要运行 REBUILD INDEX 实用程序。

清单 38. 运行 REBUILD INDEX 实用程序的示例 JCL

//*                     //**********************************************************************                     //* STEP REBLD1: REBUILD INDEXES                     //**********************************************************************                     //*                     //REBLD1  EXEC DSNUPROC,SYSTEM=DSN1,UID='IBMWG.RBLDIX'                     //SYSIN     DD *                      REBUILD INDEX (ALL) TABLESPACE LAB01.TSLAB01                     /*

执行此作业将得到 RC=00。完成作业后,查看以下项:

  • SDSF 中的作业输出。SYSPRINT 提供了有关该实用程序执行情况的重要信息。
  • 通过上一步中的相同方式检查表和索引空间的状态。我们现在看到所有索引空间都处于 RW 状态。

检查表的内容

我们最后一次使用以下查询检查我们的测试表的内容。

清单 39. 检查测试数据的 SELECT 语句

SELECT *     FROM TBLAB01    ORDER BY T01_D_PROCES     , T01_T_PROCES     , T01_N_AGENCY     , T01_C_USERID; --   SELECT *     FROM TBLAB02    ORDER BY T02_D_PROCES     , T02_T_PROCES     , T02_N_AGENCY     , T02_C_USERID; 

第一个表现在包含 33 条记录。这是我们运行 QUIESCE 实用程序时的情形。 RECOVER TOLOGPOINT 实用程序将第一个表空间准确恢复到该状态。第二个表保持 25 条记录不变。

检查 DB2 目录中的信息

最后,我们检查 DB2 存储在目录表 SYSCOPY 中的信息。

SELECT * FROM SYSIBM.SYSCOPY                        WHERE DBNAME = 'LAB01';

结果如下所示(这里只显示了前几行)。

清单 40. 目录数据的输出

DBNAME    TSNAME          DSNUM  ICTYPE  ICDATE  START_RBA    FILESEQNO                     ---------+---------+---------+---------+---------+---------+---------+-                     LAB01     TSLAB01             0  C       150414  ..§3©»               0                     LAB01     TSLAB02             0  C       150414  ..§5˳               0                     LAB01     TSLAB01             0  Y       150414  ..§³©ç               0                     LAB01     TSLAB02             0  Y       150414  ..§Ú²J               0                     LAB01     TSLAB01             0  S       150414  ..¶.É,               0                     LAB01     TSLAB02             0  S       150414  ..¶.ÓH               0                     LAB01     TSLAB01             0  F       150414  ..¶.ü.               0                     LAB01     TSLAB02             0  F       150414  ..¶.Wo               0                     LAB01     TSLAB02             0  I       150414  ..¶.f©               0                     LAB01     TSLAB01             0  E       150414  ..¶.>-               0                     LAB01     TSLAB02             0  E       150414  ..¶./Ð               0                     LAB01     TSLAB02             0  P       150414  ..¶..¦               0                     LAB01     TSLAB01             0  F       150414  ..¶.fo               0                     LAB01     TSLAB01             0  Q       150414  ..¶.È@               0                     LAB01     TSLAB01             0  P       150414  ..¶.?.               0                     DSNE610I NUMBER OF ROWS DISPLAYED IS 15

目录表现在显示了我们之前执行的 RECOVER TOLOGPOINT 的信息。

回页首

结束语

我们介绍了能使用 DB2 中的备份和恢复功能实现的用途。现在,是时候使用此基础知识来为 DB2 环境中的备份和恢复实现必要的 JCL 了。

正文到此结束
Loading...