本文转载自http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1109xingcl/。
DB2 pureScale Feature 是 IBM 在 2009 年推出一款针对在线事务处理 (Online Transaction Processing, OLTP) 的集群技术 , 具有无限扩展性、应用透明性和持续可用性等主要优势,被认为是近年来关系型数据库领域最重要的技术突破。DB2 pureScale 很好的解决了传统数据库集群产品中存在的不足。它通过采用 PowerHA pureScale 技术实现数据库集群的持续高可用性;通过使用 RDMA(Remote Direct Memory Access)实现节点间的数据访问,避免了处理器在系统内 IP 网络通信的上下文切换,从而提高数据处理性能;另外,它通过共享数据(share data)方式和全局锁定技术来保证数据的一致性;它的工作负载均衡技术可以根据数据库节点的工作状态,将工作负载在不同节点间动态智能的分发,并且保证对应用程序的完全透明。
DB2 pureScale 技术自发布到现在,一直受到市场的广泛关注,很多国内外企业或单位对之表现出强烈的兴趣,有些已经开始进行研究和技术评估。
图 1. DB2 pureScale
数据的备份和恢复
一个 DB2 pureScale 集群环境中,在任意一个成员节点上执行 BACKUP DATABASE 或 RESTORE DATABASE 命令即对全库执行备份或恢复操作。这是因为 DB2 pureScale 采用了共享数据(Share Data)的架构,整个集群里只有一个数据库分区,在任一 DB2 pureScale 成员节点上发起的备份操作会将整个集群中的相关数据统一备份到一个备份影像 (image) 中。
一个备份影像中通常包含了特定表空间中的数据信息,以及所有成员节点上的元数据和配置信息。对于备份操作,你只需要在任意一个成员节点上执行 BACKUP DATABASE 即可,而不需要在其它成员节点上重复同样的操作。对于恢复操作,你可以在任意一个成员节点上通过执行一条 RESTORE DATABASE 命令来恢复数据库数据和所有成员节点上的元数据信息。每个数据库备份影像都会有一个唯一的基于时间戳的标识符,不管该备份影像是在哪个成员节点上生成的。换句话说,你可以在一个成员节点上对整个 DB2 pureScale 集群中的数据库进行备份,而在另外一个成员节点上对该数据库备份进行恢复。
离线备份和在线备份
DB2 pureScale 支持离线备份和在线备份。在进行离线备份操作之前,所有成员节点必须在一致性状态。而且,在同一时间点整个 DB2 集群中只允许一个离线备份的操作在执行。对于在线备份操作,虽然可以支持多个在线备份命令同时执行,但是这些操作也不能同时操作同一个表空间,而需要按顺序执行。
备份命令的执行过程中,所有从数据库中读数据和读元数据的操作,以及将读出的数据写入到备份影像的操作都只发生在执行 BACKUP DATABASE 的这单个节点上。备份命令和其它成员节点的交互仅限于拷贝或更新数据库元数据,比如:表空间定义、日志文件头和数据库配置等。
日志备份
在一个 DB2 pureScale 的集群环境中,每一个成员节点都有自己的日志。执行 ROLLFORWARD DATABASE 命令时需要所有成员节点的日志都可以被访问。在针对某一个数据库执行 ROLLFORWARD DATABASE 命令的过程中,来自不同成员节点的日志会被合并以后重放以保证数据库的一致性。在执行 ROLLFORWARD DATABASE 时指定的时间点是相对于合并后的日志。
需要特别注意的地方
DB2 pureScale 的备份恢复功能还存在一些限制,我们在使用的过程中需要特别的注意:
1. 在对一个 DB2 pureScale 集群进行数据库备份之后,如果对该集群的拓扑结构进行了某些调整,比如增加或减少了一个成员节点,则拓扑结构改变之前的备份影像将不能再被用来在新的拓扑结构上进行数据库恢复。
2. 每次对 DB2 pureScale 集群的拓扑结构进行调整后,数据库将处于 Backup Pending 状态,必须做一次全库的离线备份后才能正常使用。
在后面的章节里,我们会用一个实验环境来介绍 DB2 pureScale 的备份和恢复功能,以及如何和第三方工具 Symantec NetBackup 进行集成。DB2 pureScale 的实验环境配置如下:
图 2. 实验环境配置
其中,DB2 pureScale 集群搭建在一台 IBM P6 550 上,总共划分了 4 个 LPAR,包括两个 DB2 pureScale 成员(member)节点和两个 DB2 pureScale CF 节点;NetBackup 服务器搭建在一台独立的服务器上;NetBackup 客户端和一个 DB2 pureScale 成员节点安装在同一台服务器上。
在进行数据库离线备份之前,首先需要确保当前没有其它应用连接到该数据库,如果有的话则要先关闭这些连接,并将数据库设置成非激活状态。具体操作如下:
首先,切换到数据库用户。
$ su – db2sdin1 |
然后,断开所有数据连接并将目标数据库设置成非激活状态。
$ db2 connect reset $ db2 force applications all $ db2 deactivate db testdb |
现在,我们就可以使用 backup 命令进行目标数据库的离线备份了。
$ db2 backup db testdb to /db2data/backups/ |
执行结果:
图 3. 执行结果
备份成功后,我们向数据库的一张表中插入两条测试记录,并记下插入第一条记录后的时间。
$ db2 connect to testdb $ db2 "insert into t1 values (1,'john')" $ date $ db2 "insert into t1 values (2,'smith')" $ db2 "select * from t1" |
执行结果:
图 4. 执行结果
现在,我们将会对数据库进行恢复,并回滚到之前插入第一条记录后的时间点(2011/05/31 11:53:36)。按照预期,数据库应该恢复到插入第一条记录后的状态,即表 t1 中应该有一条记录。
进行数据恢复之前,同样需要先断开所有数据连接并将目标数据库设置成非激活状态。
$ db2 connect reset $ db2 force applications all $ db2 deactivate db testdb |
然后,使用 restore 命令从之前备份的镜像进行数据库恢复。
$ db2 restore db testdb from /db2data/backups taken at 20110531115100 |
执行结果:
图 5. 执行结果
通过执行 rollforward 命令,将数据库滚动到指定的时间点:2011-05-31-11.53.36.000000。需要注意的是,一定要加上“using local time”选项,否则 DB2 将会默认使用 GMT 时间。
$ db2 rollforward db testdb to 2011-05-31-11.53.36.000000 using local time and stop |
执行结果:
图 6. 执行结果
我们需要验证一下数据库中目前的数据记录,确保我们的恢复操作是成功的。 按照预期,如果之前的操作成功,则数据库表中应该只保留第一条数据记录。
$ db2 connect to testdb $ db2 "select * from t1" |
执行结果:
图 7. 执行结果
执行结果和我们的期望是一致的,只有第一条插入的数据被保留下来。
数据库的在线备份需要在 backup 命令中使用 online 关键字。
$ db2 backup database testdb online to /db2data/backups/ |
执行成功后,会看到如下结果:
图 8. 执行结果
同样,我们向数据表中插入两条记录,并记下时间点。这时,数据表中应该总共有三条记录。
$ db2 connect to testdb $ db2 "insert into t1 values (2,'john')" $ date $ db2 "insert into t1 values(3,'peter')" $ db2 "select * from t1" |
执行结果:
图 9. 执行结果
接下来,我们使用 restore 命令从备份影像中进行数据库恢复。
$ db2 connect reset $ db2 force applications all $ db2 deactivate db testdb $ db2 restore db testdb from /db2data/backups taken at 20110531120035 |
执行结果:
图 10. 执行结果
然后,我们使用 rollforward 命令将数据库回滚到日志末尾。按照期望,操作成功后,数据表中应该有三条记录。
$ db2 rollforward db testdb to end of logs and stop $ db2 connect to testdb $ db2 "select * from t1" |
执行结果:
图 11. 执行结果
DB2 提供了对日志文件的归档功能,当默认的日志文件被写满后,会自动被归档到指定的设备,归档设备可以磁盘或磁带。在下面的演示中,我们会把日志文件归档到一个磁盘目录下。
DB2 的日志文件默认为循环模式,我们需要修改‘ logarchmeth1 ’数据库参数将其设置为归档模式。修改‘ logarchmeth1 ’参数后,需要对数据库进行一次离线全备份,这样修改操作才能起效。
$ su - db2sdin1 $ db2 get db cfg for testdb | grep -i logarchmeth1 $ db2 update db cfg for testdb using logarchmeth1 disk:/db2data/log $ db2 backup db testdb to /db2data/backups/ |
执行结果:
图 12. 执行结果
现在,数据库的日志已经被修改成归档模式。为了验证日志文件能够被正确归档,我们通过一个脚本不断向数据库中插入数据,从而产生新的日志,当默认的日志文件被写满后,旧的日志文件就会被归档到我们指定的磁盘目录。
执行结果:
图 13. 执行结果
Symantec NetBackup(简称 NetBackup)提供了一套简单高效的数据备份和恢复的解决方案,在企业中有着广泛的应用。DB2 pureScale 可以和 NetBackup 进行很好的集成,从而实现企业内部数据备份恢复的集中调度和管理。
配置 NetBackup 实现对 DB2 pureScale 的管理
在我们的演示中,NetBackup 服务器安装在一台独立的 AIX 服务器上,并且在该 NetBackup 服务器上已经配置了一个存储设备‘ storage1 ’,用来保存备份数据。NetBackup 的客户端被安装在 DB2 pureScale member 0 所在的服务器上。
在 NetBackup 服务器上,通过执行下面的命令启动 NetBackup 的管理界面。
$ /usr/openv/netbackup/bin/jbpSA |
图 14. NetBackup 管理界面
在对 NetBackup 进行配置后,就可以方便的通过 NetBackup 进行数据库的备份了。为此,我们需要在 NetBackup 中创建一个数据库的备份策略。
在 NetBackup 的管理界面上,启动策略创建向导,并指定策略名为 db2_purescale_policy。策略类型(Policy type)选择“DB2”,策略存储(Policy storage)选择‘ storage1 ’。“storage1”是我们之前创建好的一个存储设备,可以是磁带或磁盘设备,在我们的演示中“storage1”是一个磁盘目录。
图 15. 创建数据库备份策略
然后,切换到日历(Schedules)标签下,为该策略定义日历。日历决定了该策略在什么时间被被激活执行备份操作。在生产环境中,我们一般会选择系统事务交易比较空闲的时间窗口进行数据库的备份操作,比如晚上。在该演示中,我们定义了两个日历,一个是自动全备份类型(Automatic Full Backup),一个是应用备份类型(Application Backup)。
图 16. 创建数据库备份日历
接下来,我们切换到 Backup Selections 标签,指定与该策略相关联的命令脚本“db2_backup_cmd”。
图 17. 指定命令脚本
在“db2_backup_cmd”命令脚本中,我们会调用 DB2 的 backup 命令进行数据库的备份操作。该脚本可以在 NetBackup 提供的脚本样例的基础上修改得到。需要注意的是:该脚本中,MY_LIB 变量指定了备份操作用到的动态库文件,需要根据运行平台的类型选择适当的库文件;MY_DB2 变量指定了要备份的目标数据库名称;MY_USER 变量指定了执行备份操作的数据库用户。
清单 1. db2_backup_cmd 脚本文件
#!/bin/sh #Solaris or Linux 32-bit = nbdb2.so #Solaris 64-bit = nbdb2.so64 #HPUX (ia64) = nbdb2.so #AIX or HPUX = nbdb2.sl #AIX or HPUX = nbdb2.sl64 MY_LIB=/usr/openv/netbackup/bin/nbdb2.sl64 MY_DB2=TESTDB CMD_LINE="db2 BACKUP DATABASE $MY_DB2 online LOAD $MY_LIB OPEN 1 SESSIONS BUFFER 1024" MY_USER=db2sdin1 echo "Executing: $CMD_LINE" su - $MY_USER -c "$CMD_LINE" RETURN_STATUS=$? # Return 0 for success, non-zero for errors exit $RETURN_STATUS |
备份策略创建成功后,我们可以在 NetBackup 的管理界面中手动执行该策略,验证其正确性。策略被手动触发后,我们可以在活动监控(Activity Monitor)窗口看到活动执行的进度。活动执行完成后,我们双击活动记录可以看到具体的执行结果。
图 18. 查看执行结果
我们可以通过执行 DB2 的 restore 和 rollforward 命令进行数据库的恢复。为了操作方便,可以创建一个数据库恢复的脚本文件。在脚本中,我们先通过 restore 命令从数据库的备份影像中恢复数据库,执行 restore 命令时,我们需要使用 load 关键字指定 NetBackup 的动态库位置,然后调用 rollforward 命令将数据库前滚到日志末尾。在恢复过程中,数据库的备份影像将从 NetBackup 服务器上配置的存储设备中自动获取,所以我们并不需要显式的指定数据库备份影像的位置。
清单 2. db2_restore_cmd 脚本文件
#!/bin/sh MY_LIB=/usr/openv/netbackup/bin/nbdb2.sl64 CMD_LINE="db2 restore database testdb load $MY_LIB taken at $1 " echo "Execute $CMD_LINE" $CMD_LINE CMD_LINE="db2 rollforward db testdb to end of logs and stop" echo "Execute $CMD_LINE" $CMD_LINE |
现在,我们执行该脚本文件进行数据库的恢复操作。
$ db2 list backup all for testdb $ ./db2_restore_cmd 20110531160110 |
执行结果:
图 19. 执行结果
在 NetBackup 的管理界面上,我们可以看到数据库恢复的进度和最终执行状态。
图 20. 数据库恢复执行结果
从 NetBackup 进行 DB2 pureScale 的日志备份,需要先将数据库的日志设置成归档模式。具体的操作方法,我们再前面已经介绍过了。这个小结我们将展示如何通过 NetBackup 将数据库的归档日志备份到指定的存储设备。
首先,我们在 NetBackup 中创建一个备份策略,名为 db2_purescale_log_policy。策略类型(Policy type)选为‘ Standard ’,策略存储(Policy storage)选为‘ storage1 ’。
图 21. 创建日志备份策略
然后,我们切换到 Schedules 标签,添加两个日历,一个是全备份类型(Full Backup),一个是增量备份类型(Differential Incremental Backup)。
图 22. 创建日志备份日历
在 Backup Selections 标签页,我们指定数据库的归档日志目录:/db2data/log。
图 23. 指定日志目录
我们通过手动执行该备份策略,如果该策略执行成功,目录 /db2data/log 下的所有文件将被备份到在 NetBackup 中设定的存储设备。在 NetBackup 管理界面中,我们可以看到备份执行的过程和结果。
图 24. 日志备份结果
同样,我们可以从 NetBackup 中恢复数据库日志的备份影像。为了验证恢复操作的执行结果,我们先把 /db2data/log 目录下的文件清空,在恢复操作执行完成后,再去检查文件是否被成功恢复到了备份前的状态。
在 NetBackup 的管理界面中,切换到 Backup, Archive, and Restore 视图,选择要恢复的备份影像,然后点击 Restore 按钮启动恢复操作。
图 25. 选择要恢复的日志文件
恢复操作执行完成后,我们可以在 NetBackup 管理界面看到最终的执行结果。
图 26. 日志文件恢复结果
然后,我们去目录 /db2data/log,可以看到日志文件已经被成功的恢复。
图 27. 执行结果
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25714482/viewspace-761091/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25714482/viewspace-761091/