Db2 pureScale 环境中的高可用性灾难恢复 (HADR) 监视

必须使用 db2pd 命令或 MON_GET_HADR 表函数来监视 Db2 pureScale 环境中的 HADR 数据库。 其他接口(例如,GET SNAPSHOT FOR DATABASE 命令、SNAPHADR 管理视图和 SNAP_GET_HADR 表函数)不会返回任何 HADR 信息,所以它将表现为好像没有配置 HADR 一样。

db2pd 命令和 MON_GET_HADR 表函数基本上返回相同的信息,但由于在备用数据库上读取在 Db2 pureScale 环境中不受支持,因此只能使用 db2pd 命令从备用数据库进行监视。 并且,在接管期间 db2pd 命令是首选的,因为其中某段时间可能主数据库和备用数据库都不允许客户机连接。

db2pd 命令

Db2 pureScale 环境中, db2pd 命令在其输出中针对发出该命令的成员正在处理的每个日志流返回一个部分。 在主数据库上,任何受助远程同步复制流都由其所有者(即受助成员)和提供帮助的成员进行报告。 在备用数据库上,如果在重放成员上发出该命令,那么将返回所有流;如果在非重放成员上发出 db2pd,那么不会返回任何数据。

如果要查看来自主数据库的所有日志流,请将 -allmembers 选项和 -hadr 选项与 db2pd 命令配合使用。 如果在备用数据库上使用 -allmembers 选项,那么对于每个非重放成员,输出指示该数据库在成员上处于不活动状态;对于重放成员,将返回所有流。 因此,仅当您想要确定哪个成员是当前重放成员时,此命令选项才在备用数据库上有用 (或者,您可以在主数据库的 db2pd 输出中检查 STANDBY_MEMBER 字段)。

以下示例针对使用三个成员集群的 HADR 设置:成员 0、1 和 2。 成员 1 处于活动状态,但它处于辅助远程同步复制状态,并由成员 0 辅助;备用重放成员是成员 0。 DBA 对主数据库上的成员 0 发出 db2pd 命令。 请注意,将返回两组数据,每一组针对成员 0 正在处理的一个日志流:
Database Member 0 -- Database HADRDB -- Active -- Up 0 days 00:23:17 -- Date 06/08/2011 13:57:23

                              HADR_ROLE = PRIMARY
                            REPLAY_TYPE = PHYSICAL
                          HADR_SYNCMODE = ASYNC
                             STANDBY_ID = 1
                          LOG_STREAM_ID = 0
                             HADR_STATE = PEER
                             HADR_FLAGS =
                    PRIMARY_MEMBER_HOST = hostP.ibm.com
                       PRIMARY_INSTANCE = db2inst
                         PRIMARY_MEMBER = 0
                    STANDBY_MEMBER_HOST = hostS.ibm.com
                       STANDBY_INSTANCE = db2inst
                         STANDBY_MEMBER = 0
                    HADR_CONNECT_STATUS = CONNECTED
               HADR_CONNECT_STATUS_TIME = 06/08/2011 13:38:10.199479 (1307565490)
            HEARTBEAT_INTERVAL(seconds) = 25
                  HADR_TIMEOUT(seconds) = 100
          TIME_SINCE_LAST_RECV(seconds) = 3
               PEER_WAIT_LIMIT(seconds) = 0
             LOG_HADR_WAIT_CUR(seconds) = 0.000
      LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.006298
     LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.516
                    LOG_HADR_WAIT_COUNT = 82
  SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 50772
  SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 87616
              PRIMARY_LOG_FILE,PAGE,POS = S0000009.LOG, 1, 49262315
              STANDBY_LOG_FILE,PAGE,POS = S0000009.LOG, 1, 49262315
                    HADR_LOG_GAP(bytes) = 0
       STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000009.LOG, 1, 49262315
         STANDBY_RECV_REPLAY_GAP(bytes) = 0
                       PRIMARY_LOG_TIME = 06/08/2011 13:49:19.000000 (1307566159)
                       STANDBY_LOG_TIME = 06/08/2011 13:49:19.000000 (1307566159)
                STANDBY_REPLAY_LOG_TIME = 06/08/2011 13:49:19.000000 (1307566159)
           STANDBY_RECV_BUF_SIZE(pages) = 16
               STANDBY_RECV_BUF_PERCENT = 0
             STANDBY_SPOOL_LIMIT(pages) = 13000 
                  STANDBY_SPOOL_PERCENT = 0
                   PEER_WINDOW(seconds) = 0
               READS_ON_STANDBY_ENABLED = N

                              HADR_ROLE = PRIMARY
                            REPLAY_TYPE = PHYSICAL
                          HADR_SYNCMODE = ASYNC
                             STANDBY_ID = 1
                          LOG_STREAM_ID = 1
                             HADR_STATE = REMOTE_CATCHUP
                             HADR_FLAGS = ASSISTED_REMOTE_CATCHUP ASSISTED_MEMBER_ACTIVE
                    PRIMARY_MEMBER_HOST = hostP.ibm.com
                       PRIMARY_INSTANCE = db2inst
                         PRIMARY_MEMBER = 0
                    STANDBY_MEMBER_HOST = hostS.ibm.com
                       STANDBY_INSTANCE = db2inst
                         STANDBY_MEMBER = 0
                    HADR_CONNECT_STATUS = CONNECTED
               HADR_CONNECT_STATUS_TIME = 06/08/2011 13:35:51.724447 (1307565351)
            HEARTBEAT_INTERVAL(seconds) = 25
                  HADR_TIMEOUT(seconds) = 100
          TIME_SINCE_LAST_RECV(seconds) = 16
               PEER_WAIT_LIMIT(seconds) = 0
             LOG_HADR_WAIT_CUR(seconds) = 0.000
      LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.005631
     LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.837
                    LOG_HADR_WAIT_COUNT = 124
  SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 16384
  SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 87380
              PRIMARY_LOG_FILE,PAGE,POS = S0000012.LOG, 1, 56541576
              STANDBY_LOG_FILE,PAGE,POS = S0000012.LOG, 1, 56541576
                    HADR_LOG_GAP(bytes) = 0
       STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000012.LOG, 1, 56541576
         STANDBY_RECV_REPLAY_GAP(bytes) = 0
                       PRIMARY_LOG_TIME = 06/08/2011 13:49:25.000000 (1307566165)
                       STANDBY_LOG_TIME = 06/08/2011 13:49:25.000000 (1307566165)
                STANDBY_REPLAY_LOG_TIME = 06/08/2011 13:49:25.000000 (1307566165)
           STANDBY_RECV_BUF_SIZE(pages) = 16
               STANDBY_RECV_BUF_PERCENT = 0
             STANDBY_SPOOL_LIMIT(pages) = 13000
                  STANDBY_SPOOL_PERCENT = 0
                   PEER_WINDOW(seconds) = 0
               READS_ON_STANDBY_ENABLED = N

MON_GET_HADR 表函数

Db2 pureScale 环境中, MON_GET_HADR 表函数针对每个日志流返回一行。 无法在备用数据库上发出表函数,因为在 Db2 pureScale 环境中不支持在备用数据库上读取。 使用表函数输出中的 LOG_STREAM_ID 字段来标识日志流,并使用 PRIMARY_MEMBER 和 STANDBY_MEMBER 字段来标识正在主数据库和备用数据库端处理流的成员。

该表函数接受成员自变量,并返回指定成员所拥有的流以及该成员正在帮助的所有远程同步复制流。 如果自变量是提供帮助的成员,那么受助远程同步复制流会将其 HADR_STATE 字段报告为 REMOTE_CATCHUP 并在 HADR_FLAGS 字段中设置 ASSISTED_REMOTE_CATCHUP 标志。 如果自变量是受助成员,那么受助远程同步复制流会将其 HADR_STATE 字段报告为 DISCONNECTED。

如果指定 -1 或 NULL 作为自变量,那么将返回当前数据库成员(即正在处理查询的成员)的结果。 如果指定 -2 作为自变量,那么将返回主数据库上所有成员的结果。 将仅在提供帮助的成员上报告任何受助远程同步复制流。 如果成员处于不活动状态,并且尚未为该成员的日志流建立受助远程同步复制,那么该日志流不会出现在输出中。 表函数请求将传递到所有活动成员,并且将合并结果,所以不会表示不活动成员。

在以下示例中,DBA 调用 MON_GET_HADR 表函数以使用三个成员集群监视 HADR 设置:成员 0、1 和 2。 成员 1 处于活动状态,但它处于辅助远程同步复制状态,并由成员 0 辅助;备用重放成员是成员 0。 DBA 使用自变量 0、1、2 和 -2(对于所有成员)调用表函数。 请注意,当该自变量为 0 时,将返回两行,每一行针对成员 0 正在处理的一个日志流:

成员 0 的示例
select LOG_STREAM_ID, PRIMARY_MEMBER, STANDBY_MEMBER, HADR_STATE, HADR_FLAGS
 from table (mon_get_hadr(0))
LOG_STREAM_ID PRIMARY_MEMBER STANDBY_MEMBER HADR_STATE     HADR_FLAGS
------------- -------------- -------------- -------------- -----------------------
0             0              0              PEER                    
1             0              0              REMOTE_CATCHUP ASSISTED_REMOTE_CATCHUP     
成员 1 的示例
select LOG_STREAM_ID, PRIMARY_MEMBER, STANDBY_MEMBER, HADR_STATE, HADR_FLAGS
 from table (mon_get_hadr(1))
LOG_STREAM_ID PRIMARY_MEMBER STANDBY_MEMBER HADR_STATE     HADR_FLAGS
------------- -------------- -------------- -------------- ----------------------
1             1              0              DISCONNECTED     
成员 2 的示例
select LOG_STREAM_ID, PRIMARY_MEMBER, STANDBY_MEMBER, HADR_STATE, HADR_FLAGS
 from table (mon_get_hadr(2))
LOG_STREAM_ID PRIMARY_MEMBER STANDBY_MEMBER HADR_STATE     HADR_FLAGS
------------- -------------- -------------- -------------- -----------------------
2             2              0              PEER                    
所有成员的示例
select LOG_STREAM_ID, PRIMARY_MEMBER, STANDBY_MEMBER, HADR_STATE, HADR_FLAGS
 from table (mon_get_hadr(-2))
LOG_STREAM_ID PRIMARY_MEMBER STANDBY_MEMBER HADR_STATE     HADR_FLAGS
------------- -------------- -------------- -------------- -----------------------
0             0              0              PEER                    
1             0              0              REMOTE_CATCHUP ASSISTED_REMOTE_CATCHUP     
2             2              0              PEER