本文参考了IBMdeveloperworks
https://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1206xuj2/
同步模式(SYNC)
在同步模式下,当用户在主数据库上提交一个事务时,首先该事务的相关数据库日志会被写到主数据库的本地磁盘上,然后主数据库会将日志发送给备机数据库,并且等待备机数据库的回复;备机数据库在接收到日志,并将其写到自己的磁盘上后,才回复给主数据库。主数据库在接到备机数据库的回复之后,才返回给用户该事务提交成功。由此可见,在该同步模式下,凡是提交成功的事务,日志不仅在主数据库的磁盘上,也在备机数据库的磁盘上,此时如果主数据库发生故障,已提交的数据不会丢失。因此,在同步模式下,HADR 能够提供无数据丢失保证(No data loss guarantee)。但是,在该同步模式下,HADR 对主数据库业务的影响也是显而易见的。
近同步模式(NEARSYNC)
与同步模式相比,近同步模式下的备机数据库接收到主数据库发来的日志时,并不等待将其写到本地磁盘之后才回复给主数据库,而是立即回复给主数据库。主数据库在接收到备机数据库的回复之后就返回给用户事务提交成功,而此时,该事务的日志可能还在备机数据库的内存中,并未写到本地盘上。如果此时主机发生故障,并不能保证在原主数据库上已提交的数据在备机上必然能找回。虽然该同步模式不能保证零数据丢失,但是相比同步模式,近同步模式下的 HADR 对于主数据库业务的影响较小。
异步模式(ASYNC)
在异步模式下,主数据库发送日志成功后就返回给用户,事务提交成功,而此时,备机数据库有可能还没有收到这些日志。如果此时主数据库发生故障,该已提交事务的数据更改就会丢失。同样的,由于异步模式下的主数据库在返回给用户事务提交成功之前不等待备机数据库的回复,HADR 对主数据库上业务的影响比近同步模式更小。
超级异步模式(SUPERASYNC)
从 DB2 LUW V9.7.5 和 V9.5.8 开始,HADR 引入了一种新的同步模式,即超同步模式。在该同步模式下,主数据库上数据库日志的产生与发送完全分离,二者没有任何依赖,这样 HADR 对于主数据库业务的影响降到了最低;同时,由于日志的产生与发送分离,可能导致主数据库和备机数据库之间的差距较大,此时如果主机发生故障,会有较多的数据丢失;并且非强制接管(non-force TAKEOVER)可能需要更多时间
模式 有无数据丢失风险 影响主数据库性能级别
SYNC 无 大
NEARSYNC(default) 有(不保证零数据丢失) 小
ASYNC 有 较小
SUPERASYNC 有 极小
1.系统环境准备,db01作为primary节点,db02作为nearsync节点,db03作为supersync节点。
[root@db01 ~]# cat /etc/hosts
192.168.2.123 db01
192.168.2.163 db02
192.168.2.113 db03
2.在主库创建库
[db2inst1@db01 ~]$ cd /db2data
[db2inst1@db01 db2data]$ mkdir archivelog
[db2inst1@db01 db2data]$ db2 update db cfg for testdb using LOGARCHMETH1 "DISK:/db2data/archivelog"
[db2inst1@db01 db2data]$ db2stop
[db2inst1@db01 db2data]$ db2start
[db2inst1@db01 db2data]$ db2 backup db testdb to /dev/null
db2 "CREATE DB testdb on /db2data/testdb using codeset UTF-8 territory us PAGESIZE 8192"
db2 "UPDATE DB CFG FOR testdb USING applheapsz 4096"
db2 "UPDATE DB CFG FOR testdb USING app_ctl_heap_sz 1024"
db2 "UPDATE DB CFG FOR testdb USING stmtheap 32768"
db2 "UPDATE DB CFG FOR testdb USING dbheap 2400"
db2 "UPDATE DB CFG FOR testdb USING locklist 1000"
db2 "UPDATE DB CFG FOR testdb USING logfilsiz 4000"
db2 "UPDATE DB CFG FOR testdb USING logprimary 12"
db2 "UPDATE DB CFG FOR testdb USING logsecond 20"
db2 "UPDATE DB CFG FOR testdb USING logbufsz 32"
db2 "UPDATE DB CFG FOR testdb USING avg_appls 5"
db2 "UPDATE DB CFG FOR testdb USING locktimeout 30"
db2 "UPDATE DB CFG FOR testdb using AUTO_MAINT off"
更新HADR信息
db2 "UPDATE DB CFG FOR TESTDB USING LOGINDEXBUILD ON LOGARCHMETH1 logretain"
db2 "update db cfg for testdb using trackmod on"
db2 "update db cfg for testdb using indexrec restart"
db2 "update db cfg for testdb using HADR_LOCAL_HOST db01"
db2 "update db cfg for testdb using HADR_LOCAL_SVC 54321"
db2 "update db cfg for testdb using HADR_REMOTE_HOST db02"
db2 "update db cfg for testdb using HADR_REMOTE_SVC 54321"
db2 "update db cfg for testdb using HADR_REMOTE_INST db2inst1"
db2 "update db cfg for testdb using HADR_TIMEOUT 120"
db2 "update db cfg for testdb using HADR_PEER_WINDOW 10"
db2 "update db cfg for testdb using HADR_SYNCMODE sync"
db2 "UPDATE DB CFG FOR TESTDB USING HADR_TARGET_LIST db02:54321|db03:54321"
3.备份主库
db2 backup db testdb to /db2data/backup/
4.传输至备机
cd /db2data/backup
scp TESTDB.0.db2inst1.DBPART000.20190811162133.001 db02:/db2data/backup/
scp TESTDB.0.db2inst1.DBPART000.20190811162133.001 db03:/db2data/backup/
4.在备机恢复
db2 restore db testdb from /db2data/backup/
5.在节点2执行命令
db2 update db cfg for testdb using HADR_LOCAL_HOST db02
db2 update db cfg for testdb using HADR_REMOTE_HOST db01
db2 "update db cfg for testdb using HADR_SYNCMODE NEARSYNC"
db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db03:54321"
6.在节点3执行命令
db2 "update db cfg for testdb using HADR_LOCAL_HOST db03"
db2 "update db cfg for testdb using HADR_REMOTE_HOST db01"
db2 "update db cfg for testdb using HADR_SYNCMODE SUPERASYNC"
db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db02:54321"
7.在节点2和节点3执行命令
db2 "start hadr on db testdb as standby"
8.在节点1执行命令
db2 "start hadr on db testdb as primary"
9.在节点1执行命令
[db2inst1@db01 backup]$ db2pd -db testdb -hadr
Database Member 0 -- Database TESTDB -- Active -- Up 0 days 00:00:45 -- Date 2019-09-12 18:44:51
HADR_ROLE = PRIMARY
REPLAY_TYPE = PHYSICAL
HADR_SYNCMODE = SYNC
STANDBY_ID = 1
LOG_STREAM_ID = 0
HADR_STATE = PEER
PRIMARY_MEMBER_HOST = db01
PRIMARY_INSTANCE = db2inst1
PRIMARY_MEMBER = 0
STANDBY_MEMBER_HOST = db02
STANDBY_INSTANCE = db2inst1
STANDBY_MEMBER = 0
HADR_CONNECT_STATUS = CONNECTED
HADR_CONNECT_STATUS_TIME = 2019-09-12 18:44:07.534501 (1568285047)
HEARTBEAT_INTERVAL(seconds) = 2
HADR_TIMEOUT(seconds) = 120
TIME_SINCE_LAST_RECV(seconds) = 15
PEER_WAIT_LIMIT(seconds) = 0
LOG_HADR_WAIT_CUR(seconds) = 0.000
LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000000
LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.000
LOG_HADR_WAIT_COUNT = 0
SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 19800
SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 87380
PRIMARY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
STANDBY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
HADR_LOG_GAP(bytes) = 0
STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
STANDBY_RECV_REPLAY_GAP(bytes) = 4072254
PRIMARY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
STANDBY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
STANDBY_REPLAY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
STANDBY_RECV_BUF_SIZE(pages) = 64
STANDBY_RECV_BUF_PERCENT = 0
STANDBY_SPOOL_LIMIT(pages) = 0
PEER_WINDOW(seconds) = 10
PEER_WINDOW_END = 2019-09-12 18:45:01.000000 (1568285101)
READS_ON_STANDBY_ENABLED = N
HADR_ROLE = PRIMARY
REPLAY_TYPE = PHYSICAL
HADR_SYNCMODE = SUPERASYNC
STANDBY_ID = 2
LOG_STREAM_ID = 0
HADR_STATE = REMOTE_CATCHUP
PRIMARY_MEMBER_HOST = db01
PRIMARY_INSTANCE = db2inst1
PRIMARY_MEMBER = 0
STANDBY_MEMBER_HOST = db03
STANDBY_INSTANCE = db2inst1
STANDBY_MEMBER = 0
HADR_CONNECT_STATUS = CONNECTED
HADR_CONNECT_STATUS_TIME = 2019-09-12 18:44:08.260206 (1568285048)
HEARTBEAT_INTERVAL(seconds) = 30
HADR_TIMEOUT(seconds) = 120
TIME_SINCE_LAST_RECV(seconds) = 13
PEER_WAIT_LIMIT(seconds) = 0
LOG_HADR_WAIT_CUR(seconds) = 0.000
LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000000
LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.000
LOG_HADR_WAIT_COUNT = 0
SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 19800
SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 87380
PRIMARY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
STANDBY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
HADR_LOG_GAP(bytes) = 0
STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
STANDBY_RECV_REPLAY_GAP(bytes) = 4072254
PRIMARY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
STANDBY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
STANDBY_REPLAY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
STANDBY_RECV_BUF_SIZE(pages) = 64
STANDBY_RECV_BUF_PERCENT = 0
STANDBY_SPOOL_LIMIT(pages) = 0
PEER_WINDOW(seconds) = 0
READS_ON_STANDBY_ENABLED = N
[db2inst1@db01 backup]$ db2 connect to testdb
Database Connection Information
Database server = DB2/LINUXX8664 10.1.0
SQL authorization ID = DB2INST1
Local database alias = TESTDB
[db2inst1@db01 backup]$ db2 "select HADR_ROLE, STANDBY_ID, HADR_STATE,
varchar(PRIMARY_MEMBER_HOST,20) as PRIMARY_HOST,
varchar(STANDBY_MEMBER_HOST,20) as STANDBY_HOST
from table (mon_get_hadr(NULL))"
HADR_ROLE STANDBY_ID HADR_STATE PRIMARY_HOST STANDBY_HOST
------------- ---------- ----------------------- -------------------- --------------------
PRIMARY 1 PEER db01 db02
PRIMARY 2 REMOTE_CATCHUP db01 db03
2 record(s) selected.
将db04加入到HADR
db2 "update db cfg for testdb using HADR_LOCAL_HOST db04"
db2 "update db cfg for testdb using HADR_REMOTE_HOST db01"
db2 "update db cfg for testdb using HADR_SYNCMODE SUPERASYNC"
db2 "update db cfg for testdb using HADR_TARGET_LIST db02:54321|db03:54321|db01:54321"
db2 "START HADR ON DB TESTDB AS STANDBY"
db2 "activate db testdb"
在db01执行
db2 "update db cfg for testdb using HADR_TARGET_LIST db02:54321|db03:54321|db04:54321"
在db02上执行
db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db03:54321|db04:54321"
在db03上面执行
db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db02:54321|db04:54321"
可以在db02上面接管hadr
db2 TAKEOVER HADR ON DB TESTDB
可以看到如下信息
[db2inst1@db01 backup]$ db2 "select HADR_ROLE, STANDBY_ID, HADR_STATE,
varchar(PRIMARY_MEMBER_HOST,20) as PRIMARY_HOST,
varchar(STANDBY_MEMBER_HOST,20) as STANDBY_HOST
from table (mon_get_hadr(NULL))"
HADR_ROLE STANDBY_ID HADR_STATE PRIMARY_HOST STANDBY_HOST
------------- ---------- ----------------------- -------------------- --------------------
PRIMARY 1 PEER db01 db02
PRIMARY 2 REMOTE_CATCHUP db01 db03
PRIMARY 3 REMOTE_CATCHUP db01 db04
版权声明:本文为博主原创文章,未经博主允许不得转载。
Linux,oracle
- 上一篇:DB2 HADR安装
- 下一篇:IBM CDC开启trace