HADR是high availability disaster recovery的簡寫。組成HADR,需要一對機器(DB2並沒有支持多個從機,是因為這樣會給系統的管理帶來很大麻煩),一個主機(primary),一個從機(secondary)。
1.數據庫版本必須一致,此例為8.2ese
2.運行db2licm -l 查看是否支持hadr特性
3.兩台機器: serverA 10.10.20.16 255.255.255.0 serverB 10.10.20.110 255.255.255.0
4.兩台機器均使用默認實例DB2,服務端口號均為 50000
5.由於安裝后注冊表參數 db2comm=TCPIP為默認值, 所以下面不再配置,若不是此值,
必須通過命令 db2set db2comm=TCPIP為每個相關實例設置
6.關閉防火牆或打開端口 */
--在serverA上執行 set db2instance=DB2 db2set db2comm=TCPIP--默認即是
db2 terminate db2stop db2start
--創建數據庫 db2sampl
--修改數據庫參數
db2 update db cfg for sample using logretain=on
db2 update db cfg for sample using trackmod=on
db2 update db cfg for sample using logindexbuild=on
db2 update db cfg for sample using indexrec=restart
--備份數據庫 db2 backup db sample to f:/test
--在serverB上: set db2instance=DB2
--因為以下命令導致數據庫處於前滾暫掛狀態,
db2 restore db sample from f:/test replace history file
db2 update db cfg for sample using HADR_LOCAL_HOST 10.10.20.110
db2 update db cfg for sample using HADR_LOCAL_SVC 44444
db2 update db cfg for sample using HADR_REMOTE_HOST 10.10.20.16
db2 update db cfg for sample using HADR_REMOTE_SVC 33333
db2 update db cfg for sample using HADR_REMOTE_INST DB2
db2 update db cfg for sample using HADR_SYNCMODE nearsync
--在serverA上配置sample數據庫參數
set db2instance=DB2 db2 update db cfg for sample using HADR_LOCAL_HOST 10.10.20.16
db2 update db cfg for sample using HADR_LOCAL_SVC 33333
db2 update db cfg for sample using HADR_REMOTE_HOST 10.10.20.110
db2 update db cfg for sample using HADR_REMOTE_SVC 44444
db2 update db cfg for sample using HADR_REMOTE_INST DB2
db2 update db cfg for sample using HADR_SYNCMODE nearsync
--在serverB上以standby方式啟動sample數據庫
set db2instance=DB2 db2 deactivate database sample
db2 start hadr on database sample as standby
--在serverA上以primary方式啟動sample數據庫
set db2instance=DB2 db2 start hadr on database sample as primary
--在serverA上查看sample數據庫的hadr狀態
set db2instance=DB2 db2pd -d sample -hadr
--在serverB上查看sample數據庫的hadr狀態
set db2instance=DB2 db2pd -d sample -hadr
--測試:
--在serverA上
set db2instance=DB2
db2 connect to sample
db2 create table test(id integer)
db2 insert into test(1)
db2 insert into test(2)
db2 commit
db2 select * from sample
--在serverB上 set db2instance=DB2 --接管hadr,如果不能建立與serverA上DB2實例的連接,
比如serverA服務器或DB2實例已經關閉,則必須用by force選項如下:
db2 takeover hadr on database sample user db2admin using db2admin by force
--正常接管
db2 takeover hadr on database sample user db2admin using db2admin
db2 connect to sample db2 select * from test --顯示數據表明serverA上的數據應用到了serverB上了
--查看hadr狀態
db2pd -d sample -hadr
主機上執行
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_HOST 192.168.1.2
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_SVC 55001
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_HOST 192.168.1.5
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_SVC 55002
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_INST db2admin
db2 UPDATE DB CFG FOR XMHIS USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR XMHIS USING HADR_TIMEOUT 120
備機上執行
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_HOST 192.168.1.5
db2 UPDATE DB CFG FOR XMHIS USING HADR_LOCAL_SVC 55002
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_HOST 192.168.1.2
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_SVC 55001
db2 UPDATE DB CFG FOR XMHIS USING HADR_REMOTE_INST db2admin
db2 UPDATE DB CFG FOR XMHIS USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR XMHIS USING HADR_TIMEOUT 120
DB2的HA可以在OS級別使用專門的HA來實現,也可使用DB2內置的HADR來實現,且配置和管理很簡單。
一個HADR環境需要兩台數據庫服務器:主數據庫服務器(primary)和備用數據庫服務器(standby,處於standby角色的數據庫不能夠被訪問)。當主數據庫中發生事務操作時,會同時將日志文件通過TCP/IP協議傳送到備用數據庫服務器,然后備用數據庫對接受到的日志文件進行重放(Replay),從而保持與主數據庫的一致性。
當主數據庫發生故障時,備用數據庫服務器可以接管主數據庫服務器的事務處理。
此時,備用數據庫服務器作為新的主數據庫服務器進行數據庫的讀寫操作,而客戶端應用程序的數據庫連接可以通過自動客戶端重新路由(Automatic Client Reroute)機制轉移到新的主服務器。當原來的主數據庫服務器被修復后,又可以作為新的備用數據庫服務器加入HADR。通過這種機制,DB2 UDB實現了數據庫的災難恢復和高可用性,最大限度的避免了數據丟失。
同步方式
primary和standby 的參數HADR_SYNCMODE用來設置日志的同步方式,參數的設置將取決於DB在事務的響應時間和事務丟失的可能性之間的平衡。
SYNC:primary和standby DB日志均確認寫入成功才認為日志寫入成功。
NEARSYNC:primary DB日志寫入成功,standby DB確認接收到日志即認為日志寫入成功。
ASYNC(異步):primary DB日志寫入成功,並將日志發送出去之后即認為日志寫入成功。
自動客戶端重新路由(automatic client reroute)
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 172.16.72.11 PORT 60000
#此命令用來在primary和standby DB上設置備用數據庫信息.
#ACR 不使用HADR_REMOTE_HOST 和 HADR_REMOTE_SVC 數據庫配置參數
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或存儲過程
HADR操作
啟動和停止 #先啟動誰后啟動誰
db2 start HADR on db testdb user a3intest using passwd as standby
db2 start HADR on db testdb as primary [by force]
#如果在HADR_TIMEOUT所指定的時間內未能建立與備用數據庫HADR的連接,啟動會失敗,使用by force 選項可以在啟動失敗時強行啟動。
db2 deactivate db testdb
db2 stop hadr on db testdb
#stop HADR on standby
db2 stop hadr on db testdb
#stop HADR on primary
查看HADR的連接狀態
當備用數據庫的HADR啟動時,它首先進入本地同步更新狀態。並根據本地日志路徑配置參數及日志歸檔方法的設置檢索本地系統中的日志文件並重放。當本地日志文件重放完畢,備用數據庫進入遠程同步暫掛狀態。
當與主數據庫建立連接之后,備用數據庫進入遠程同步更新狀態。即主數據庫將自己的日志文件通過TCPIP協議發送給備用數據庫,備用數據庫接收到日志文件並重放,直到所有日志文件都重放完畢,備用數據庫和主數據庫進入對等狀態
db2 get snapshot for db on testdb
#可以查看primary,standby數據庫的連接狀態
db2 get db cfg | grep -i hadr
#查詢數據庫HADR的相關配置
接管/故障轉移
當主數據庫發生故障時,備用數據庫可以接管主數據庫的服務,成為新的主數據庫(稱為故障轉移)。當原主數據庫修復后,又可以作為備用數據庫加入HADR對。
即使主數據庫服務器沒有故障,我們通過接管命令(TAKEOVER)切換主數據庫和備用數據庫的角色。
db2 takeover HADR on db test by force
#當primary DB故障時緊急接管,takeover命令只運行在standby DB上。
db2 takeover HADR on db testdb
#普通接管
配置示例
hostname:primary.ade.com
IP:172.16.72.11
OS:RHEL7.0
package:db2 V10.1FP4 ESE
instance:a3intest
port:60000
db:testdb
hostname:standby.ade.com
IP:172.16.72.12
OS:RHEL7.0
package:db2 V10.1FP4 ESE
instance:a3intest
port:60000
db:testdb (restored from primary)
#primary & standby
DB2_a1intest 60000/tcp (/etc/services)
db2set db2comm=tcpip
db2 update dbm cfg using svcename DB2_a3intest
##make sure the following port is available for HADR.
echo "DB2_HADR_1 61001/tcp" >> /etc/sevices
echo "DB2_HADR_2 61002/tcp" >> /etc/sevices
#歸檔日志
db2 update db cfg for testdb using logarchmeth1 logretain
##索引日志記錄參數
db2 UPDATE DB CFG FOR testdb USING LOGINDEXBUILD ON
db2 UPDATE DB CFG FOR testdb USING INDEXREC RESTART
##primary
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 172.16.72.12 PORT 60000
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_HOST 172.16.72.11
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_SVC DB2_HADR_1
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_HOST 172.16.72.12
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_SVC DB2_HADR_2
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_INST a3intest
db2 UPDATE DB CFG FOR testdb USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR testdb USING HADR_TIMEOUT 120
db2 CONNECT TO testdb
db2 QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS
db2 UNQUIESCE DATABASE
db2 CONNECT RESET
##backup db on primary
db2 backup db testdb to /db/a3intest/db2backup
##restore db on standby
db2 restore db testdb from /db/a3intest/db2backup/ taken at 20150203203651 replace history file without prompting
##standby
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 172.16.72.11 PORT 60000
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_HOST 172.16.72.12
db2 UPDATE DB CFG FOR testdb USING HADR_LOCAL_SVC DB2_HADR_2
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_HOST 172.16.72.11
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_SVC DB2_HADR_1
db2 UPDATE DB CFG FOR testdb USING HADR_REMOTE_INST a3intest
db2 UPDATE DB CFG FOR testdb USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR testdb USING HADR_TIMEOUT 120
db2 update db cfg for testdb using logarchmeth1 logretain
db2 UPDATE DB CFG FOR testdb USING LOGINDEXBUILD ON
db2 UPDATE DB CFG FOR testdb USING INDEXREC RESTART
#start HADR on standby
db2 deactivate db testdb
db2 start hadr on db testdb as standby
#start HADR on primary
db2 deactivate db testdb
db2 start hadr on db testdb as primary
##HADR status
db2pd -db testdb -hadr
##HADR_STATE = PEER 表示連接正常
db2 get snapshot for db on testdb
##可以查詢HADR的連接狀態
##stop HADR
#primary
db2 stop hadr on db testdb
#standby
db2 deactivate db testdb
db2 stop hadr on db testdb
##test HADR
#primary:
db2 connect to testdb
db2 "CREATE TABLE HADRTEST(ID INTEGER NOT NULL WITH DEFAULT,NAME VARCHAR(10),PRIMARY KEY (ID))"
db2 "INSERT INTO HADRTEST (ID,NAME) VALUES (1,‘a‘)"
db2 "INSERT INTO HADRTEST (ID,NAME) VALUES (2,‘b‘)"
db2 "INSERT INTO HADRTEST (ID,NAME) VALUES (3,‘b‘)"
##standby
db2 takeover hadr on db testdb
db2 get snapshot for db on testdb
db2 connect to testdb
db2 "select * from hadrtest"
首先,說明幾個需要注意的問題:
(1). HADR pair不可以使用circular logging。大家可以參照db2 infocenter,閱讀以下DB2的log方式
(2). HADR的從機是由主機的備份鏡像恢復而成的
(3). 啟動HADR的時候應該首先啟動standby,然后在啟動primary
(4). Standby和Primary上和HADR相關的參數一定要一致,否則會在系統握手校驗的時候失敗
現在我們假設HADR Pair部署在主機hostp和從機hosts上
第一步,分別在主機和從機上創建數據庫:
db2 create db hadrdb
第二步,設置主數據庫配置參數:
db2 update db cfg for hadrdb using logretain on
db2 update db cfg for hadrdb using trackmod on
db2 update db cfg for hadrdb using logindexbuild on
db2 update db cfg for hadrdb using indexrec restart
db2 update db cfg for hadrdb using HADR_LOCAL_HOST hostp
db2 update db cfg for hadrdb using HADR_LOCAL_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_HOST hosts
db2 update db cfg for hadrdb using HADR_REMOTE_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_INST db2inst1
db2 update db cfg for hadrdb using HADR_TIMEOUT 120
db2 update db cfg for hadrdb using HADR_PEER_WINDOW 10
db2 update db cfg for hadrdb using HADR_SYNCMODE sync
第三步,備份主數據庫,生成一個備份文件
db2 backup db hadrdb
這里需要注意一下,如果你是第一次將日志的方式設置為retain方式,這次備份會使數據庫跳出backup pending方式。當從數據庫恢復時,不要使用這個備份文件,而是需要重新備份一次,使用第二次備份的文件。假設文件名是:HADRDB.0.sfbao.NODE0000.CATN0000.20091116071458.001
第四步,將剛才備份的數據庫日志文件拷貝到一個從機可以使用的文件系統里面
第五步,在從數據庫上恢復數據庫:
db2 restore db hadrdb from HADRDB.0.sfbao.NODE0000.CATN0000.20091116071458.001
第六步,配置從數據庫的參數:
db2 update db cfg for hadrdb using logretain on
db2 update db cfg for hadrdb using trackmod on
db2 update db cfg for hadrdb using logindexbuild on
db2 update db cfg for hadrdb using indexrec restart
db2 update db cfg for hadrdb using HADR_LOCAL_HOST hosts
db2 update db cfg for hadrdb using HADR_LOCAL_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_HOST hostp
db2 update db cfg for hadrdb using HADR_REMOTE_SVC 54321
db2 update db cfg for hadrdb using HADR_REMOTE_INST db2isnt1
db2 update db cfg for hadrdb using HADR_TIMEOUT 120
db2 update db cfg for hadrdb using HADR_PEER_WINDOW 10
db2 update db cfg for hadrdb using HADR_SYNCMODE sync
其實,對於這一步,你只要更新HADR_LOCAL_HOST和HADR_REMOTE_HOST就可以了,因為其他的參數在restore db的時候都會恢復出來。
第七步,啟動從數據庫:
db2 start hadr on db hadrdb as standby
第八步,啟動主數據庫:
db2 start hadr on db hadrdb as primary