DB2高可用性灾难恢复
3. 接管/故障转移
当主数据库发生故障时,备用数据库可以接管主数据库的服务,成为新的主数据库(称为故障转移)。当原主数据库修复后,又可以作为备用数据库加入HADR对。即使主数据库服务器没有故障,我们通过接管命令(TAKEOVER)切换主数据库和备用数据库的角色。接管命令只能用在备用数据库上。
HADR提供两种接管方式:
紧急接管:
当主数据库发生故障时,可以在备用数据库上使用紧急接管,使备用数据库成为新的主数据库。紧急接管必须指定TAKEOVER命令的BY FORCE子句,例如:
TAKEOVER HADR ON DATABASE SAMPLE BY FORCE
普通接管:
普通接管就是没有使用BY FORCE子句的接管,例如:
TAKEOVER HADR ON DATABASE SAMPLE
这种接管必须在主数据库和备用数据库都正常运行的情况下使用。如果主数据库发生故障,普通接管将失败,这时候必须使用上面的紧急接管。
4. 同步方式
在上面的配置实例中我们将主数据库和备用数据库的HADR_SYNCMODE参数值设置为NEARSYNC,当主数据库和备用数据库处于对等状态时,HADR采用NEARSYNC(接近同步)同步方式管理日志写入。DB2提供了三种日志同步方式:
SYNC(同步):
采用SYNC方式时,仅当主数据库日志写入成功,并收到备用数据库的应答,确保备用数据库的日志也成功写入的情况下,才认为日志写入成功。
这种方式下的事务响应时间最长,但最大限度的确保不发生事务丢失。
NEARSYNC(接近同步):
采用NEARSYNC方式时,当主数据库日志写入成功,并收到备用数据库的应答,确定备用数据库已经接收到日志时,即认为日志写入成功。也就是说,备用数据库接收到的日志并不一定能成功写入持久存储设备上的日志文件。
这种方式下的事务响应时间比SYNC方式短,且仅当两台服务器同时发生故障时,才会发生事务丢失。
ASYNC(异步):
采用ASYNC方式时,当主数据库日志写入成功,并将日志发送出去之后,即认为日志写入成功。此方式并不保证备用数据库能收到日志,这要依赖于TCP/IP网络情况。
这种方式下的事务响应时间最短,但产生事务丢失的可能性也最大
5. 自动客户端重新路由(Automatic Client Reroute)
要配置自动客户端重新路由,使用UPDATE ALTERNATE SERVER命令设置备用数据库信息(使用方法参考上面的配置实例),这些信息将被存放在数据库的系统目录中。请注意:必须使用此命令来设置备用数据库,而不是HADR_REMOTE_HOST 和 HADR_REMOTE_SVC 数据库配置参数,自动客户端重新路由不使用这两个参数。
当客户端与数据库建立连接时,备用数据库的配置信息(主机/IP 及 端口号)也同时被发送给DB2客户端。当客户端与主数据库的连接被中断时,客户端就使用这些信息连接到备用数据库,从而最小限度的降低了数据库故障所造成的影响。需要强调的是,这个过程由DB2客户端自动完成,不需要用户用程序干涉。见下图:

通过LIST DB DIRECOTRY 命令可以查看系统数据库目录中自动客户端重新路由的配置。
6. 使用控制中心管理HADR
在上面的讨论中我们主要通过DB2 CLP命令来创建和管理DB2 HADR。实际上DB2的控制中心也提供了创建和管理HADR的图形界面,例如:工具-〉向导-〉设置高可用性灾难恢复(HADR)数据库。这些功能使用起来都非常简单,在这里我们就不详细讨论了。但是,笔者强烈建议尽量多使用DB2 CLP命令来管理DB2(不仅仅是针对HADR),不要过于依赖DB2控制中心,因为很多服务器环境都不安装控制中心,这时候你如果没有掌握DB2 CLP命令,那可就麻烦大了。
7. 关于索引日志记录
索引的创建、重建、重组也是HADR环境中需要考虑的一个方面,DB2通过数据库配置参数LOGINDEXBUILD和CREATE TABLE或ALTER TABLE语句中的LOG INDEX BUILD选项来控制是否对索引的相关操作进行详细的日志记录。我们在上面的HADR配置实例中将LOGINDEXBUILD数据库参数配置为ON,意为让DB2记录索引创建、重建、重组的完整日志。这显然会降低主数据库的运行效率并占用更多的日志空间。但因为备用数据库可以通过重放日志来重新构建索引,所以当主数据库发生故障,备用数据库的索引仍然可用。
用户可以通过CREATE TABLE或ALTER TABLE语句的LOG INDEX BUILD选项来对单个表设定索引日志记录级别。LOG INDEX BUILD选项有三个可选参数:
NULL:这是缺省值,当使用此参数时,表的索引日志记录级别由数据库配置参数LOGINDEXBUILD的值决定。
ON:使用此参数,数据库配置参数LOGINDEXBUILD的值将被忽略,DB2将记录这个表上所有索引维护的详细日志。
OFF:使用此参数时,数据库配置参数LOGINDEXBUILD的值将被忽略,DB2将不记录这个表上索引维护的日志。
如果表选项LOG INDEX BUILD设置为OFF,或者LOG INDEX BUILD设置为NULL但数据库配置参数LOGINDEXBUILD设置为OFF,DB2将不记录这些表的索引维护日志,备用数据库也就无法重放索引维护操作,致使这些索引在备用数据库上变为无效状态。当主数据库发生故障,备用数据库切换为新主数据库后,这些无效的索引必须重建才能被使用。DB2通过数据库配置参数INDEXREC来指定在什么时候检查并重建无效索引。INDEXREC参数有三个可选值:
RESTART:DB2将在显式或隐式重启数据库(RESTART DATABASE)的时候检查并重新构建无效索引。
ACCESS:DB2将在无效索引第一次被访问的时候才会重新构建它。
SYSTEM:使用数据库管理器配置参数(Database Manager Configuration)INDEXREC的值。
在上面的配置实例中,我们将INDEXREC的值设为RESTART,备用数据库将在接管为新的主数据库时检查并重新构建所有无效索引。
DB2 HADR的使用限制
只有DB2 UDB Enterprise Server Edition(ESE)支持HADR,但HADR不能支持分区数据库(Database Partitioning Feature,DPF)。
主数据库和备用数据库必须运行在相同的操作系统版本上,并且DB2 UDB的版本也必须一致,除非短暂的软件升级过程。
主数据库和备用数据库的位大小必须一致(32位或64位)。
不能在备用数据库上进行备份操作
备用数据库是不能访问的,客户端程序无法连接备用数据库。
日至归档操作只能在主数据库上进行。
带有COPY NO选项的LOAD命令是不支持的
主数据库和备用数据库必须是一对一的。
HADR不能使用循环日志
HADR不复制数据库配置参数、共享库、DLLs、UDFs或存储过程
结束语
你也可以通过一些专门的HA软件来实现高可用性和灾难恢复,但这些HA软件一般都很昂贵,而DB2 HADR是包含在DB2 ESE里的,不需要额外的费用,另外,DB2 HADR配置和管理也很简单,而且功能也很不错,所以笔者一直喜欢将它推荐给客户。