备份测试

  现在我们来备份测试数据库,好方便我们在下面的例子中可以恢复到此时的状态,如清单10所示。

  --清单 10.备份数据库 

BACKUP DATABASE TEST1 TO /db2/databases/backup/


  命令执行完后,显示如下:

  备份成功。此备份映像的时间戳记是:20070911175125

  创建示例表

  接下来我们创建示例表,在/home/db2inst1/目录下我们编写脚本employee.sql,内容如清单11所示。

  --清单 11. employee.sql内容

CREATE TABLE "DB2INST1"."EMPLOYEE" (
  "EMPNO" CHAR(6) NOT NULL ,
  "FIRSTNME" CHAR(12) NOT NULL ,
  "MIDINIT" CHAR(1) ,
  "LASTNAME" CHAR(15) NOT NULL ,
  "PHOTO" BLOB (10 M ) NOT NULL LOGGED NOT COMPACT,
  "WORKDEPT" CHAR(3) ,
  "PHONENO" CHAR(4) ,
  "HIREDATE" DATE ,
  "JOB" CHAR(8) ,
  "EDLEVEL" SMALLINT NOT NULL ,
  "SEX" CHAR(1) ,
  "BIRTHDATE" DATE ,
  "SALARY" DECIMAL(9,2) ,
  "BONUS" DECIMAL(9,2) ,
  "COMM" DECIMAL(9,2) )
  IN "TABLESPACE1" LONG IN "TABLESPACE2";


  接下来执行employee.sql脚本:

$db2 –tvf /home/db2inst1/employee.sql


  执行成功后,表DB2INST1.EMPLOYEE的用户数据存放在TABLESPACE1,大型字段存放在TABLESPACE2中,其中TABLESPACE1是使用自动存储器,TABLESPACE2是使用的非自动存储器。

  再次备份测试数据库

  现在我们来再次备份测试数据库,好方便我们在下面的例子中可以恢复到此时的状态,如清单12所示。
--清单 12.备份数据库

BACKUP DATABASE DB2TEST1 TO /db2/databases/backup/


  命令执行完后,显示如下:

  备份成功。此备份映像的时间戳记是:20070911175656

  利用全量备份还原测试数据库

  使用RESTORE DATABASE 命令来在发生问题(例如介质或存储器故障、断电或者应用程序故障)后恢复数据库或表空间。如果已经备份了数据库或各个表空间,则可以在它们由于某种原因损坏时重新创建它们。

  需要注意的是,我们的备份介质中所包含的自动存储路径在我们要复原的环境中必须存在,这次还原我们将利用第一次全量备份的备份文件,时间戳为20070911175125,通过DB2命令行发出RESTORE DATABASE命令,具体如清单13所示。

  --清单 13.还原数据库

  RESTORE DATABASE DB2TEST1 FROM /db2/databases/backup/ TAKEN AT 20070911175125

  由于DB2TEST1数据库存在并且在发出RESTORE DATABASE命令时将被替换,所以会返回一个提示消息,内容如下:

  SQL2539W 警告!正在复原至与备份映像数据库相同的现有数据库。数据库文件将被删除。

  要继续吗?(y/n)

  我们指定y,将完成还原操作。

  数据库还原操作需要一个独占连接:启动任务后,restore实用程序会防止其他应用程序访问数据库,直到还原操作成功完成,所以不能再对该数据库运行任何应用程序,但表空间还原操作可以联机完成,前提是该数据库是归档数据库。

  命令成功后,连接数据库,会报数据库处于ROLL-FORWARD PENDING状态,这是因为归档数据库执行完还原后,需要进行前滚恢复,具体返回消息如下:

  SQL1117N 由于 ROLL-FORWARD PENDING,不能连接或激活数据库 "DB2TEST1"。SQLSTATE=57019

  接下来我们对DB2TEST1继续进行前滚恢复,发出ROLLFORWARD命令,具体见清单14所示。

  --清单 14.前滚恢复数据库

  ROLLFORWARD DATABASE DB2TEST1 TO END OF LOGS AND STOP

  执行成功后,就可以正常访问数据库了,从返回的消息可以看到已处理的日志文件有两个S0000001.LOG、S0000002.LOG两个,此时具体的消息如清单15所示下。

  清单 15.前滚恢复数据库返回消息

  前滚状态

  输入数据库别名 = DB2TEST1

  节点数已返回状态 = 1

  节点号 = 0

  前滚状态 = 未暂挂

  下一个要读取的日志文件 =

  已处理的日志文件 = S0000001.LOG - S0000002.LOG

  上次落实的事务 = 2007-09-11-09.56.54.000000 UTC

  DB20000I ROLLFORWARD命令成功完成。
非增量重定向还原测试数据库

  以上介绍了如何对数据库进行还原和前滚恢复,接下来看一下如何对不允许增量备份的数据库进行非增量重定向还原。

  在数据库备份操作期间,保留了一个记录,它记录了与正在备份的表空间相关的所有表空间容器。在还原操作期间,会检查备份映像中列示的所有容器,以确定它们是否存在并可访问。若这些容器中的一个或多个由于介质故障(或由于任何其他原因)而不可访问,还原操作将失败。在这种情况下,还原操作需要重定向至不同的容器。

  可以通过调用RESTORE DATABASE命令并指定REDIRECT参数来重新定义表空间容器,需要注意的是对使用自动存储功能的表空间需要重新指定自动存储路径,而不是重定向至不同的容器。在重定向还原操作期间,如果目录和文件容器不存在,将自动创建。数据库管理器不会自动创建设备容器。容器重定向为管理表空间容器提供了相当大的灵活性。

  我们使用时间戳记为20070911175656的全备备份映像进行重定向还原,首先,连接上DB2TEST1数据库(如果要还原的是另外的机器,可以在其上面建立一个名称为DB2TEST1的数据库,再连接上),发出RESTORE DATABASE命令,使用REDIRECT选项,如清单16所示。

  --清单 16.重定向还原数据库第一步

  RESTORE DATABASE DB2TEST1 TAKEN AT 20070911175656 ON /db2/databases/new_db2test1/auto_storage DBPATH ON /db2/databases/new_db2test1 REPLACE EXISTING REDIRECT

  我们此次重定向还原数据库,通过ON和DBPATH ON参数将数据库路径和自动存储器路径都做了更改,即把数据库路径由/db2/databases/db2test1改成了/db2/databases/new_db2test1,把自动存储器路径由/db2/databases/db2test1/auto_storage改成了/db2/databases/new_db2test1/auto_storage。

  DBPATH ON参数表示目标数据库目录。如果实用程序还原到一个现有数据库,将忽略次参数。知道的驱动器和目录必须是本地的。如果备份映像包括启用了自动存储器的数据库,且未指定ON参数,则此参数与TO参数是同义词,且仅数据库目录被更改,而与数据库关联的存储路径不更改。

  TO target-directory参数我们这里没有使用,简单介绍一下这个参数,因为在实际应用过程中,也会经常用到。此参数表示目标数据库目录,如果实用程序还原到一个现有数据库,将忽略此参数。指定的驱动器和目录必须是本地的。如果备份映像包括启用了自动存储器的数据库,则仅数据库目录被更改,而与数据库关联的存储路径不更改。

  ON参数重新定义与自动存储区数据库相关联的存储路径。此参数只能用在启用了自动存储器的数据库上,如果将此参数与未启用自动存储器的数据库将导致错误(SQL20321N)。使用此参数后, 不再使用备份映像中定义的现有存储路径,自动存储器表空间自动重定向至新路径。如果没有为自动存储器数据库指定此参数,则存储器路径仍为备份映像中定义的路径,此时,备份映像中定义的路径在我们要还原的服务器上要真实存在,否则整个重定向最终会失败。

  可以指定一个或多个路径,各个路径之间用逗号分隔。每个路径必须有绝对路径名称且该路径必须在本地。如果磁盘上尚没有该数据库,且未指定DBPATH ON参数,则第一个路径用作目标数据库目录。

  对不使用自动存储,且需要重新定义其容器的表空间TABLESPACE2发出SET TABLESPACE CONTAINERS命令。对TABLESPACE2的表空间标识可以通过LIST TABLESPACES SHOW DETAIL得到。表空间TABLESPACE1、SYSCATSPACE、TEMPSPACE1和USERSPACE1,都是使用自动存储管理,所以不需要发出SET TABLESPACE CONTAINERS命令。如清单17所示。

  --清单 17.重定向还原数据库第二步

  SET TABLESPACE CONTAINERS FOR 4 USING (FILE /databases/tablespace1/tablespace_32k 640)

  成功后完成了第一步和第二步之后,发出RESTORE DATABASE DB2TEST1 CONTINUE命令,如清单18所示。

  --清单 18.重定向还原数据库第三步

  RESTORE DATABASE DB2TEST1 CONTINUE

  如果第三步失败,或者如果已异常终止了还原操作,则可以从第一步重启启动重定向的还原。

  命令成功后,连接数据库,会报数据库处于ROLL-FORWARD PENDING状态,这是因为归档数据库执行完还原后,需要进行前滚恢复,具体返回消息如下:

  SQL1117N 由于 ROLL-FORWARD PENDING,不能连接或激活数据库 "DB2TEST1"。SQLSTATE=57019

  接下来我们对DB2TEST1继续进行前滚恢复,发出ROLLFORWARD命令,具体见清单19所示。

  --清单 19.前滚恢复数据库

  ROLLFORWARD DATABASE DB2TEST1 TO END OF LOGS AND STOP

  执行成功后,就可以正常访问数据库了,从返回的消息可以看到已处理的日志文件有S0000003.LOG,此时具体的消息如清单20所示下。

  清单 20.前滚恢复数据库返回消息

  前滚状态

  输入数据库别名 = DB2TEST1

  节点数已返回状态 = 1

  节点号 = 0

  前滚状态 = 未暂挂

  下一个要读取的日志文件 =

  已处理的日志文件 = S0000003.LOG - S0000003.LOG

  上次落实的事务 = 2007