http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1003wucx/
引言
在数据库成为存储企业数据的载体时,如何恢复数据成为大家比较关心的话题。在 DB2 中恢复数据的种类很多,本文主要介绍数据 DB2 rollforward 的使用说明,并使用 DB2 V97 做了一些实例分析,使读者更好的了解和掌握 rollforward 的使用。
回页首
Recovery 介绍
DB2 中有四种恢复数据库的方式,以下对其进行介绍说明:
- Crash Recovery 是指在事务处理过程中被中断,从而可能造成数据不一致,不可用。这时 Crash Recovery 就会保护数据库,避免造成数据不一致,不可用的情况。
- High Availability Disaster Recovery 是指高可用性灾难恢复(HADR),其通过将数据从源数据库复制到目标数据库来防止灾难性的数据丢失。
- Version Recovery 是对备份介质的恢复,主要是 restore 命令。
- Rollforward Recovery,一般是当数据库备份后,又执行了一些新事务,如果这时发生了存储故障或误操作,在 restore 之后使用 rollforward 就可以对这些新事务进行修复,本文主要介绍这种恢复方式。
回页首
rollforward 准备工作
rollforward 只能在数据库 recoverable 状态下使用,即采用归档日志,参数 logarchmeth1 或者 logarchmeth2 为非 OFF 的状态。
首先需要修改参数,使得数据库在 recoverable 状态下。
清单 1. 修改参数 LOGARCHMETH1
db2 "update db cfg for $db using logfilsiz 4 LOGARCHMETH1 disk:$archivePath"
|
如果修改参数前 logarchmeth1 为 OFF,修改参数后,数据库处于 backup pending 状态,需要进行 offline backup 来使数据库可用。
清单 2. 备份数据库
db2 "backup db $db to $backupPath"
|
备份好数据库后执行一些事务,例如简单事务操作 create table,insert,update,delete 等等。然后 Restore 数据库,如果是 tablespace 级别的 rollforward,还可以用其他方式来使表空间处于 rollforward-pending 状态。
清单 3. 恢复数据库
db2 "restore db $db from $backdir without prompting"
|
如果使用 restore db 时指定 WITHOUT ROLLING FORWARD 参数,则不能使数据库处于 rollforward-pending 状态,从而不能使用 rollforward。这里不指定 WITHOUT ROLLING FORWARD 参数,当数据库或表空间处于 rollforward-pending 状态,就可以对其进行 rollforward 操作了。
回页首
Rollforward 使用介绍
在数据库日志中,记录了对该数据库的所有操作,用 rollforward 可以通过前滚日志把数据库恢复到备份后有日志记录的某一时间点,或者活动日志的末尾。
常用的 rollforward 参数有以下几个:
- QUERY STATUS,主要查询数据库当前状态。
- STOP,特指 rollforward 完成,这样就不能在执行任何别的 rollforward 操作了,除非重新 restore 然后 rollforward。
- CANCEL,取消 rollforward 操作,使进行 rollforward 中的数据库退出 rollforward pending 状态。
- POINT IN TIME,rollforward 到某一特定时间点。
- END OF LOGS,rollforward 到活动日志的末尾。
- ONLINE,使表空间级的 rollforward 在执行时处于 online 状态,允许其他指向数据库的连接。
在分区数据环境中,rollforward 操作必须执行在某个分区上,以下简单进行介绍:
- point-in-time rollforward 会在所有的 partition 上执行。
- END OF LOGS rollforward,如果有 ON DATABASE PARTITION 参数,rollforward 只在指定 partition 上运行,如果没有指定 partition,那么会在所有 partition 上生效。
- end of backup 会影响所有的 partition。
综合上述参数,可以把 rollforward 分为两种类型,数据库级别的 rollforward 和表空间级的 rollforward。数据库级的 rollforward 需要数据库首先 restore,从而使数据库处于 rollforward pending 状态。而表空间级的 rolllforward 并不是只有 restore 才能成为 rollforward pending 状态,比如突然断电或者其他情况等等也可能使表空间进行 rollforward 操作。
当执行 rollforward 时,如果是数据库在 rollforward pending 状态,则进行数据库级 rollforward。如果执行完后某些表空间还是 rollforward pending 状态,则要执行表空间级的 rollforward 来使这些表空间恢复。在表空间级的 rollforward 中,可以指定表空间来进行 rollforward,如果未指定,则所有处于此状态的表空间都会进行 rollforward。如果在 backup 后,更改了一个表空间的名字,那么在 rollforward 该表空间时需要使用新的表空间名字。
数据库级 rollforward 和表空间级还有一点不同就是,数据库级进行 rollforward 时该数据库不能进行其他连接操作,也就是必须断开其他连接才能进行数据库级的 rollforward。而表空间级的可以选择其他操作能否进行。
不能取消正在进行的 rollfoward 操作,只能在 rollfoward 完成后,使用 rollforward cancel 来取消还没有 stop 的 rollforward,如果已经有 stop 了,就不能 cancel 了。
回页首
rollforward 案例分析
Tablespace rollforward 实例
当数据库的数据量较大时,数据库的全备份和恢复都非常消耗时间,这时通过表空间备份可以快速恢复数据库。
在这个例子中,Restore 三个表空间,使用 rollforward to the end of the logs 前滚一个表空间到活动日志的末尾,然后使用 to the end of the logs and stop 前滚另外两个表空间到活动日志的末尾。
作为 restore 和 rollforward 的先决条件,首先需要 backup 每一个表空间,如清单 4 所示。
清单 4. Backup 表空间
db2 "update db cfg for test using logfilsiz 4 LOGARCHMETH1 disk:$archivePath"
db2 "backup db test to $backupPath"
db2 "connect to test"
db2 "create tablespace tbs1"
db2 "create tablespace tbs2"
db2 "create tablespace tbs3"
db2 "backup db test tablespace(tbs1) to $backupPath/tbs1"
db2 "backup db test tablespace(tbs2) to $backupPath/tbs2"
db2 "backup db test tablespace(tbs3) to $backupPath/tbs3"
|
图 1 显示了备份结果。
图 1. Backup tablespace
备份之后可以在指定的目录中看到相应的备份影像。
清单 5 显示了对三个表空间创建表和插入数据的操作清单。
清单 5. 操作表空间
db2 "connect to test"
db2 "create table t1(a int) in tbs1"
db2 "create table t2(a int) in tbs2"
db2 "create table t3(a int) in tbs3"
db2 "insert int t1 values(1)"
db2 "insert int t2 values(2)"
db2 "insert int t3 values(3)"
|
操作完成后,可以通过刚才的备份影象对三个表空间进行 restore。要注意恢复的备份影像一定要和所恢复的表空间对应,不然就会恢复失败,如清单 6 所示。
清单 6. Restore 三个表空间
db2 "restore db test tablespace(tbs1) from $backupPath/tbs1 without prompting"
db2 "restore db test tablespace(tbs2) from $backupPath/tbs2 without prompting"
db2 "restore db test tablespace(tbs3) from $backupPath/tbs3 without prompting"
|
图 2 显示了操作表空间和恢复表空间的结果。
图 2. 插入数据后恢复表空间
恢复成功之后,三个表空间都处于 rollforward pending 状态,用户无法访问,状态如图 3 所示。
图 3. 验证表空间 rollforward-pending 状态
清单 7 显示了访问表空间的命令。
清单 7. 访问表空间
db2 "connect to test"
db2 "select * from t1"
db2 "select * from t2"
db2 "select * from t3"
|
此时需要做前滚操作使表空间回到可用状态,如清单 8 所示。
清单 8. 前滚表空间并验证结果
db2 "rollforward db test to end of logs tablespace(tbs1) online"
db2 "rollforward db test to end of logs and stop tablespace(tbs2, tbs3) online"
db2 "connect to test"
db2 "select * from t1"
db2 "select * from t2"
db2 "select * from t3"
|
图 4 正确返回对表的操作结果,说明 rollforward 成功。
图 4. 验证结果
rollforward query status 实例
rollforward 命令的 query status 选项可用于列出如下一些当前数据库的信息。
- DB2 已经前滚的日志文件。
- 需要的下一个归档日志文件。
- 自前滚处理开始以来最近提交的事务的时间戳。
下面使用清单 9 来查询数据库状态。
清单 9. 前滚数据库并查询状态
db2 "rollforward db test query status"
|
图 5 中显示 DB pending 状态的数据库,实际上是处于 rollforward pending 状态。需要前滚数据库,使数据库回到正常状态。
图 5. Check Rollforward Pending Status
rollforward cancel 实例
在进行 cancel 操作前,先执行最基本的操作,db2 rollforward db $db to end of logs,操作完成后所有在数据库备份后写的日志文件都会前滚,如图 6 所示。
图 6. Rollforward to end of logs
接下来执行 db2 rollforward db $db cancel 操作,即取消前滚操作。执行之后前面所做的所有前滚操作都将回滚,数据库重新处于 restore-pending 状态,此时任何连接都被拒绝。
清单 10 列出了取消前滚并进行 restore 的命令。
清单 10. cancel rollforward and restore
db2 "rollforward db test cancel"
db2 "connect to test"
db2 "restore db test from $backupPath without prompting"
db2 "connect to test"
|
当刚取消前滚时,由于数据库处于 restore pending 状态,无法连接上数据库,如图 7 所示。
图 7. Restore Pending 状态
重新执行 restore 操作,db2 restore db $db from $backdir without prompting,
此时数据库处于 rollforward-pending 状态,此时任何连接都被拒绝,如图 8 所示
图 8. Rollforward Pending 状态
Rollforward to end of logs and complete 实例
接着上面的实例,执行前滚操作来使数据库可以恢复正常状态。执行 db2 rollforward db $db to end of logs and complete 操作,将前滚到日志的最后,这意味着所有归档的日志和活动日志都被遍历。如清单 11 和图 9 所示。
清单 11. 前滚到活动日志末尾并完成前滚
db2 "rollforward db test to end of logs and complete"
|
图 9. Rollforward Completed
rollforward interrupted 实例
如果在执行 rollforward to end of logs 中,用户误操作或者其他原因不小心中断了前滚操作,那么再次执行 rollforward to end of logs 时,会接着上次的中断状态,继续执行以至完成。例如:db2 rollforward db $db to end of logs 在执行过程中按 Ctrl+C,使前滚操作执行中断,此时数据库仍然处于 rollforward-pending 状态。清单 12 列出了这个实例的命令。
清单 12. 前滚中断
db2 "rollforward db test to end of logs"
Push Ctrl+C
db2 "rollforward db test to end of logs and stop"
db2 "connect to test"
|
图 10 显示了中断 rollfoward 命令的结果。
图 10. Rollforward Pending 状态
此时执行前滚操作 db2 rollforward db $db to end of logs and stop,rollforward 继续执行至完成,这时数据库连接成功,如图 11 所示。
图 11. Rollforward Completed
rollforward noretrieve 实例
noretrieve 参数表明不需要取回已经归档的日志,所以 rollforward db $db to end of logs and stop noretrieve 成功与否取决与 rollforward 是否需要取回归档日志文件。如果需要,因为前滚参数指定 noretrieve,那前滚会因为缺少这些日志文件而失败。清单 13 和图 12 列出了这个实例。
清单 13. 不需要取回归档日志的前滚
db2 "rollforward db test to end of logs and stop noretrieve"
|
图 12. Rollforward With noretrieve
rollforward overflow log path 实例
参数 overflow log path 会覆盖以前设置的 overflow log path,如果先前设置了 db2 update db cfg for test using overflowlogpath $path,那么使用 rollforward db $db to end of logs and complete overflow log path ($overflow) 命令,$overflow 会取代 $path 成为新的 overflow log path。清单 14 和图 13 显示了该实例。
清单 14. 覆盖 logpath 的前滚
db2 "rollforward db test to end of logs and complete overflow log path ($overflowPath2)"
|
图 13. Rollforward With overflow log path
在 rollforward 执行过程中可以看到在新的目录 $overflow 中的日志文件,可见参数生效,如图 14 所示。
图 14. Overflow 日志列表
rollforward backup 实例
数据库还可以进行 rollforward backup 操作,如清单 15 所示。
清单 15. 前滚备份
db2 "backup db test online to $backupPath include logs"
db2 "restore db test from $backupPath taken at 20091101125919 without prompting"
db2 "rollforward db test to end of backup"
|
图 15 显示了 online backup 的结果。
图 15. Online backup
然后执行
db2 restore db $db from $backupPath taken at $backupNum without prompting
|
和
db2 rollforward db $db to end of backup
|
就可以进行恢复。Rollforward to the end of backup 可以前滚分区数据库中所有的分区到最近的恢复点。要人工的定位这个恢复点很难,特别是对分区数据库难上加难了,而使用 end of backup 却很容易定位。图 16 显示了最终结果。
图 16. Rollforward to end of backup
回页首
结束语
本文简单的对 rollforward 的使用进行了介绍,并使用 DB2 V97 做了简单的实例说明,从而能根据需要使用相应的参数,更好的运用 rollforward。
参考资料
学习
获得产品和技术
- 使用可直接从 developerWorks 下载的 IBM 产品评估试用软件 构建您的下一个开发项目。
- 现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。
讨论
作者简介
武翠霞,IBM 中国软件开发中心软件工程师,Business Intelligence 项目组,两年商业智能项目经验,目前从事 DB2 产品的测试。
李茂嘉,IBM 中国软件开发中心软件工程师,Business Intelligence 项目组,两年来一直从事 IBM 数据库,数据仓库系列产品的测试工作。