介紹數據庫
DB2的HA能夠在OS級別使用專門的HA來實現,也可以使用DB2內置的HADR來實現,且配置和管理很簡單。服務器
一個HADR環境須要兩臺數據庫服務器:主數據庫服務器(primary)和備用數據庫服務器(standby,處於standby角色的數據庫不可以被訪問)。當主數據庫中發生事務操做時,會同時將日誌文件經過TCP/IP協議傳送到備用數據庫服務器,而後備用數據庫對接受到的日誌文件進行重放(Replay),從而保持與主數據庫的一致性。當主數據庫發生故障時,備用數據庫服務器能夠接管主數據庫服務器的事務處理。此時,備用數據庫服務器做爲新的主數據庫服務器進行數據庫的讀寫操做,而客戶端應用程序的數據庫鏈接能夠經過自動客戶端從新路由(Automatic Client Reroute)機制轉移到新的主服務器。當原來的主數據庫服務器被修復後,又能夠做爲新的備用數據庫服務器加入HADR。經過這種機制,DB2 UDB實現了數據庫的災難恢復和高可用性,最大限度的避免了數據丟失。異步
同步方式tcp
primary和standby 的參數HADR_SYNCMODE用來設置日誌的同步方式,參數的設置將取決於DB在事務的響應時間和事務丟失的可能性之間的平衡。ide
SYNC:primary和standby DB日誌均確認寫入成功才認爲日誌寫入成功。spa
NEARSYNC:primary DB日誌寫入成功,standby DB確認接收到日誌即認爲日誌寫入成功。操作系統
ASYNC(異步):primary DB日誌寫入成功,並將日誌發送出去以後即認爲日誌寫入成功。rest
自動客戶端從新路由(automatic client reroute) 日誌
db2 UPDATE ALTERNATE SERVER FOR DATABASE testdb USING HOSTNAME 172.16.72.11 PORT 60000 xml
#此命令用來在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"