用户常常提出问题,要求解释 IBM 产品的某些特性和功能的工作原理。IBM 产品已安装好,但用户不熟悉它们,常常很难理清头绪,不知从何处开始。最佳的解释方式是让用户自己动手。本指南带您执行一次小型的实验练习,让用户切身感受能做什么和如何做。当然,像这样的练习无法涵盖每个细节或可能使用的每个参数。我们的目的是介绍该产品,让您对最常用的功能有一些印象,为进一步开始构建奠定基础。
该练习是为不熟悉 DB2 for z/OS 的用户开发的。客户需要实施备份和恢复过程,但由于他们不熟悉,他们对 DB2 提供了哪些选项仅有理论性的观点,而且肯定更不了解如何使用和实现它们。本练习基本涵盖了 DB2 for z/OS 的以下实用程序:
本练习是在 DB2 10 for z/OS 上开发和执行的,但无需任何修改即可用于 DB2 11。所有查询都通过 SPUFI 执行。
本文中给出的 JCL 是一个示例 JCL。未给出作业控制卡。在您的环境中,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。完成上述操作后,我们允许用户查看以下项:
用户一定要理解每个文件包含哪些内容,它们用于何种用途,以及两个文件之间有何区别。
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。完成上述操作后,我们允许用户查看以下项:
要使用的命令:
-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 条记录。
在这一步中,我们运行 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。完成上述操作后,查看以下项:
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。运行该作业后,我们查看以下项:
完成 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。完成上述操作后,查看以下项:
COPY
实用程序的 SYSPRINT 包含宝贵的信息。 UNLOAD
实用程序的 SYSREC(包含来自表空间的表列格式的数据)与来自 COPY
实用程序的 SYSCOPY(包含来自表空间的页面格式的数据)之间的区别。镜像副本数据集显示了两个有趣的事实: LOAD
实用程序加载它们的相同顺序存储在表空间的数据页面上。 获取完整的镜像副本后,我们现在选择使用来自目录表 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 的含义:
我们现在使用标准 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。查看以下项:
INSERT
语句已在现有的数据页面上放置了 5 条额外的记录,填入了最初 LOAD
实用程序由于 PCTFREE
参数而保持空闲的空间。 获取增量镜像副本后,我们再次选择使用来自目录表 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。查看两处信息:
RECOVER TOCOPY
时,索引未恢复。两个索引的索引空间仍处于 REBUILD PENDING 状态。 要使用的命令:
-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。完成该作业后,我们查看以下项:
执行这个 RECOVER TOCOPY
和 REBUILD 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。查看以下项:
COPY
实用程序执行情况相关的基本信息。 同样地,我们对目录表 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
我们首先看看目录表 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 条记录不变。
TOLOGPOINT
或 TORBA
现在我们使用参数 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。完成作业后,查看以下项:
RECOVER TOLOGPOINT
,索引未恢复(与使用 RECOVER TOCOPY
完全相同)。所有 4 个索引的索引空间都仍处于 REBUILD PENDING
状态。 要使用的命令:
-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 ***
要重新创建索引,需要运行 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。完成作业后,查看以下项:
我们最后一次使用以下查询检查我们的测试表的内容。
清单 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 存储在目录表 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 了。