DB2 开发系列 第三部分 DB2数据库的备份
备份数据库有脱机和联机两种方式能够进行数据库的备份操作:
一:脱机备份:
脱机备份需要对数据库的独占存取权。在可进行备份操作之前,所有用户必须与数据库或 数据库分区断开,在分区数据库环境中,若正在执行编目节点的脱机备份,则整个数据库上不能有任何活动。
在数据库初始建立的时候,由于数据库没有备份印象文件(此时对于数据库的日志中没有关于数据库备份的日志纪录),因此此时只能进行数据库的脱机备份方式,同时如果要进行数据库的联机备份,这个工作也是必须的,因为系统要求只有在数据库中存在有数据库的完全备份的时候,才能进行数据库的联机备份。
二:联机备份:
注意:
仅当已配置数据库或数据库分区作前滚恢复 (即将 userexit 和/或 logretain 数据库配置参数设置为 ON),并且数据库或数据库分区的脱机备份已存在时,才能执行联机备份
联机进行备份操作(即,当进行备份时所有其他应用程序和用户都可以连接至该数据库或数据库分区)。
注意:
若启用数据库或数据库分区进行前滚恢复;即,logretain或userexit 数据库配置参数(或二者)设置为打开,且已进行了数据库或数据库分区的全脱机备份,则只能进行联机备份。
1、启用用户出口 (userexit)
配置类型:数据库
参数类型:可配置的
缺省值[范围]:否(是;否)
相关参数:
启用日志保留 (logretain)
用户出口状态指示符 (user_exit_status)
备份暂挂指示器 (backup_pending)
若启用此参数,则无论是如何设置 logretain 参数的,都执行日志保留值记录。此参数也指示应使用用户出口程序以归档和检索日志文件。 当数据库管理程序 关闭日志文件时,将日志文件归档。 当 ROLLFORWARD 实用程序需要使用这些日志文件复原数据库时,将检索这些日志文件。
在启用 logretain、userexit 或同时启用这两个参数之后,必须制作数据库的完全备份。此状态由 backup_pending 标志参数指示。
若取消对这两个参数的选择,则前卷恢复对该数据库不可用,因为将不再保留日志。在此情况下,数据库管理程序 删除 logpath 目录中的所有日志文件(包括联机归档日志文件),分配新的活动日志文件,并还原为循环日志,当数据库的两个参数打开之后,数据库处于备份暂挂状态,须对数据库进行一次完全的脱机备份之后才能使数据库重新恢复活动状态,之后就可以进行联机备份了
2、前滚恢复
前滚恢复使用 BACKUP 命令连同 RESTORE 命令和 ROLLFORWARD 命令一起, 可将数据库或表空间恢复到一个特定时间点的状态。
当第一次创建一个数据库时,只对它启用循环记录。这意味着(以循环方式)重新使用日志,而不保存或归档这些日志。使用循环记录时,不可能进行前滚恢复: 只允许应急恢复或版本恢复。但是,当执行日志归档时,则可进行前滚恢复,因为这些日志会记录在建立该备份之后对数据库所做的更改。可通过以下方法执行日志归档:将 logretain 数据库配置参数设置为 "RECOVERY"; 或启用 userexit 数据库配置参数;或两种方法同时使用。当按上一句中所述配置其中一个参数时,就允许数据库进行前滚恢复。
若数据库是可恢复的,可在数据库和表空间级执行备份、 复原和前滚恢复。数据库和表空间的备份可以联机完成。在表空间级也可进行联机复原和前滚。
前滚恢复将记录在日志中已完成的工作单元重新应用于复原的数据库、 一个或多个表空间。可以指定前滚恢复至日志末尾或特定的时间点。
logretain 和 userexit 配置参数的缺省设置 ("No") 不允许前滚恢复。这两个参数的缺省值被设置为 "No", 因为最初没有可以用来恢复数据库的备份;最初不能恢复数据库,所以不能对它执行正向恢复。
要允许新数据库进行前滚恢复,必须在建立该数据库的第一个备份之前,启用这两个配置参数中的至少一个。当更改这两个参数的其中一个或两个的值时,该数据库将会被置于备份暂挂状态, 这要求您对该数据库执行脱机备份。在备份操作成功完成之后,就可以使用该数据库了。
不能备份处于不可使用状态的数据库,但是处于备份暂挂状态的数据库除外。
若一个数据库或表空间由于在复原数据库的任何阶段期间发生系统崩溃而处于部分复原的状态,必须成功复原该数据库或表空间后,才能备份它。
若一个数据库中的任何表空间处于“异常”状态, 则除非它处于备份暂挂状态,否则不能备份该数据库或表空间。
可以将数据库或表空间备份至 TSM 或另一个供应商的存储管理产品管理的 一个硬盘、磁带或位置中。
可以将一个完整的数据库备份或一个表空间备份的副本复原至现存的数据库。 要复原至现存的数据库,必须具有 SYSADM、SYSCTRL 或 SYSMAINT 权限。备份映象可能在别名、数据库名或数据库起始值等方面与现存的数据库有所不同。
当复原到一个现存的数据库且该数据库的起始值相同时,保留日志。
仅当该数据库或表空间先前是使用 BACKUP 命令备份时, 才可使用 RESTORE 命令。
在复原一个允许前滚恢复的数据库之后,它处于前滚暂挂状态。此数据库在前滚之前不能使用。当指定 WITHOUT ROLLING FORWARD 的复原时,会出现异常情况。若复原联机数据库备份或仅复原选定的表空间备份,则不能关闭前滚。
当复原和前滚是不相关的操作时, 恢复策略可将复原作为一个完整的数据库前滚恢复的第一阶段。在成功的复原之后,在建立该备份时配置了前滚恢复的数据库就会进入前滚暂挂状态,且直到成功运行 ROLLFORWARD 命令之后才可用。
当发出 ROLLFORWARD 命令时:
若数据库处于前滚暂挂状态,则会前滚该数据库。
若数据库未处于前滚暂挂状态,但是该数据库中的表空间处于此状态, 则当发出 ROLLFORWARD 命令并指定表空间的列表时,只会前滚这些表空间。若未指定列表,则会前滚所有处于前滚暂挂状态的表空间。 注意: 若在最近的备份之后重命名了表空间, 则前滚表空间时,务必使用新名称。先前表空间名将不被识别。
若在一个分区数据库环境中某些数据库分区处于前滚暂挂状态, 而在其他数据库分区上某些表空间处于前滚暂挂状态(但是数据库分区未处于该状态),则必须先前滚该数据库分区,然后前滚这些表空间。当前滚进程正在运行时,不允许对另一个数据库进行 RESTORE记录:
若要从使用 BACKUP 命令的脱机选项创建的完整数据库备份复原, 可以在复原过程期间绕过此前滚暂挂状态。使用 WITHOUT ROLLING FORWARD 选项,允许立即使用复原的数据库, 而不用将该数据库前滚。 若要从使用 BACKUP 命令的联机选项创建的备份复原, 则不能绕过此前滚暂挂状态。
复原表空间的考虑事项如下所示:
仅当一个表空间当前存在时,才能复原该表空间,且复原的应是相同的表空间。(“相同的表空间”意味着在建立备份映象之后到试图复原表空间之前这段时间,表空间未被卸下和重新创建过。)若在最近的备份之后重命名了表空间, 则前滚表空间时,务必使用新名称。先前表空间名将不被识别。
不能将表空间备份复原至新的数据库。
若备份的表跨越多个表空间,应一起复原这组表空间。
一旦对一个表空间备份启动 RESTORE 命令,则直到 RESTORE 命令及随后的前滚恢复成功完成之后,该表空间才是可使用的。 表空间复原可以是联机的(共享方式)或脱机的(独占方式)。 若在复原一个表空间备份期间发生系统故障,只有正在复原的表空间不可用。 数据库中的其他表空间仍可以使用。
不能对系统目录表执行联机表空间复原。
当执行部分或子集 RESTORE 时,可以使用表空间备份, 也可以使用完整的数据库备份并从该映象中选择一个或多个表空间。所有与表空间相关的日志文件从创建该备份时起就必须存在。若在最近的备份之后重命名了表空间,则在复原或前滚表空间时,务必使用新名称。先前表空间名将不被识别。
在一个分区数据库系统中,若打算将表空间前滚至日志末尾, 则不必在每个数据库分区(节点)中都复原它。只须在需要恢复的数据库分区处复原它。若打算将一个表空间前滚至一个时间点,必须在前滚之前, 在每个数据库分区中都复原该表空间。
重定向复原的考虑事项如下所示:
在备份一个数据库或一个或多个表空间期间,会对备份的表空间使用的所有表空间容器进行记录。 RESTORE 期间,会检查在备份中列出的所有容器, 以查看它们当前是否存在且是否是可存取的。若一个或多个容器由于媒体故障(或由于任何其他原因)而不可存取,RESTORE 将失败。为了使得在这种情况下可以复原, 则在 RESTORE 期间支持表空间容器的重定向。此支持包括添加、更改或除去表空间容器。
RESTORE 之后常常要执行 ROLLFORWARD, 以重新应用在建立备份以后记录在数据库日志中的更改。前滚操作期间,可能要重新执行或重新运行一个事务, 该事务使用 ADD 选项来执行 ALTER TABLESPACE(以添加容器)。为了使 ROLLFORWARD 成功,添加的容器必须是可存取的。若该容器不是可存取的,对表空间的前滚就会暂停,且表空间被置于前滚暂挂状态。
可能希望在数据库日志中重新执行添加容器的操作,也可能不希望这样做。 事实上,您可能不知道自建立该备份以来已添加了哪些容器。因此,就不能预测需要哪些容器。或者,根据执行重定向复原的原因,可能只需要在复原时指定的容器的列表,而不需要添加的任何其他容器。 要控制此行为,可以在复原时指示在前滚恢复期间是否要 ROLLFORWARD 重新创建容器。
打开logretain、userexit参数:
DB2 CONNECT TO database_name USER user_name USING user_password
DB2 UPDATE DATABASE CONFIGURATION FOR TIMMS USING LOGRETAIN ON
DB2 UPDATE DATABASE CONFIGURATION FOR TIMMS USING USEREXIT ON
database_alias
DB2 UPDATE DATABASE CONFIGURATION FOR TIMMS USING LOGRETAIN NO
DB2 UPDATE DATABASE CONFIGURATION FOR TIMMS USING USEREXIT NO
DB2 UPDATE DATABASE CONFIGURATION FOR TIMMS USING ROLL-FORWARD PENDING NO
三、备份数据库
上面的内容着重说明了一下关于备份的一些基础知识,下面就是数据库的备份操作。
1、脱机备份
对于脱机备份只要给出备份映像的存放路径即可实现备份:
BACKUP DATABASE TIMMS TO backup_FilePath WITH vaule BUFFERS BUFFER size
其中:
backup_FilePath:存放备份映像的路径
vaule:使用备份的缓冲池的个数
size:备份数据库使用的缓冲池的大小
例如:
BACKUP DATABASE TIMMS TO D:\\TIMMS.NET.DB\\BACKUP WITH 2 BUFFERS BUFFER 1024
2、联机备份:
在上面的讨论中我们知道要进行数据库的联机备份必须将数据库的配置用户出口参数打开,当参数打开以后,数据库处于备份暂挂状态,此时需对数据库进行一次脱机备份以后数据库才能恢复到活动状态,此后就可对数据库进行联机备份了。
连接备份的命令格式如下:
BACKUP DATABASE TIMMS ONLINE TO backup_FilePath WITH vaule BUFFERS BUFFER size
例如:
BACKUP DATABASE TIMMS ONLINE TO D:\\TIMMS.NET.DB\\BACKUP WITH 2 BUFFERS BUFFER 1024
完成数据库的备份操作。
DB2离线和在线全备、增量备份及恢复的操作步骤
1、离线全备份
1)、首先确保没有用户使用DB2:
db2 list applications for db sample
2)、停掉数据库并重新启动,以便断掉所有连接:
db2stop force
db2start
3)、执行备份命令:(使用TSM作为备份的介质)
db2 backup db sample use tsm
备份成功,将会返回一个时间戳。
4)、检查备份成功:
Db2 list history backup all for sample ,可以看到多了这个备份的纪录。
Db2adutl query命令也可以看到返回值。
5)、备注:
首先对主节点(catalog表空间在的节点)执行备份命令,再对另外的节点也做这个操作。
2、 在线备份:
1)、首先打开一下支持在线备份的数据库配置参数:
db2 update db cfg for sample using userexit on 启用用户出口
db2 update db cfg for sample using logretain on 启用归档日志
db2 update db cfg for sample using trackmod on 启用增量备份功能
(需要各个Node都分别做设置)
开启这些参数后,数据库处于backup pending状态,要求做数据库的离线全备份。做一下离线全备份,参考上面的命令。
2)、在线备份命令如下:
db2 backup db sample online use tsm
备份成功,返回一个时间戳。
3)、同样可以用db2adutl 和db2 list history察看备份纪录。
4)、备注:
同样,对每个节点都做这个操作。
3、 在线增量备份
1)、在开启了必须的三个参数的情况下,做增量备份:
db2 backup db sample online incremental use tsm
备份成功,返回一个时间戳。
2)、同样可以用db2adutl 和db2 list history察看备份纪录。
3)、还有一种delta的备份:
db2 backup db sample online incremental delta use tsm
这两种备份的区别,类似Oracle Exports的Incremental和Cumulative方式,db2的incremental对应oracle的cumulative方式,而db2的delta方式则对应oracle的incremental方式。
4)、备注:
同样,对每个节点都做这个操作。
4、 恢复数据库
1)、手工drop数据库,模拟灾难恢复的情况,执行如下操作:
db2 drop db sample
2)、恢复备份历史纪录(每次backup,不论类型,都会备份历史纪录文件)。这里的时间戳应该是最新的:
db2 restore db sample history file use tsm taken at 20030102223107 buffer 100
3)、使用db2的恢复帮助工具:
db2ckrst -d sample -t 20030101224424 -r database
命令返回建议的必需的恢复操作命令。
4)、按照帮助工具的提示,先做版本恢复,恢复命令如下:
db2 restore db sample incremental use tsm taken at 20030101224424 buffer 100
同样先做主节点的恢复,再做其他节点的恢复操作。
5)、这时数据库处于rollforward-pending state的状态,需要做roll forward 操作:
db2 rollforward db sample to 2003-01-12-13.27.25.000000 on all nodes and stop
前滚到同一个时间点。这个操作要在主节点来做。
5、有关说明:
1)、恢复操作也有online和offline的,区别如同backup的操作。
2)、按照表空间的备份和恢复类似,加子句TABLESPACE ( tablespace-name 即可。表空间级别的备份/恢复操作要求数据库处于归档日志和启用增量备份模式下。
3)、恢复的例子中只做了版本恢复。若还有更新的全备份和增量备份的image,可以依次做恢复(注意使用db2ckrst的建议恢复次序和次数)后,再做roll forward.