DB2 HADR配置


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

 

DB2HA可以在OS級別使用專門的HA來實現,也可使用DB2內置的HADR來實現,且配置和管理很簡單。

  一個HADR環境需要兩台數據庫服務器:主數據庫服務器(primary)和備用數據庫服務器(standby,處於standby角色的數據庫不能夠被訪問)。當主數據庫中發生事務操作時,會同時將日志文件通過TCP/IP協議傳送到備用數據庫服務器,然后備用數據庫對接受到的日志文件進行重放(Replay),從而保持與主數據庫的一致性。

 

當主數據庫發生故障時,備用數據庫服務器可以接管主數據庫服務器的事務處理。

 

此時,備用數據庫服務器作為新的主數據庫服務器進行數據庫的讀寫操作,而客戶端應用程序的數據庫連接可以通過自動客戶端重新路由(Automatic Client Reroute)機制轉移到新的主服務器。當原來的主數據庫服務器被修復后,又可以作為新的備用數據庫服務器加入HADR。通過這種機制,DB2 UDB實現了數據庫的災難恢復和高可用性,最大限度的避免了數據丟失。

 

 

同步方式

primarystandby 的參數HADR_SYNCMODE用來設置日志的同步方式,參數的設置將取決於DB在事務的響應時間和事務丟失的可能性之間的平衡。

SYNC:primarystandby 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

#此命令用來在primarystandby DB上設置備用數據庫信息.

#ACR 不使用HADR_REMOTE_HOST 和 HADR_REMOTE_SVC 數據庫配置參數

 

 

 

DB2 HADR的使用限制

  1. 只有DB2 UDB Enterprise Server EditionESE)支持HADR,但HADR不能支持分區數據庫(Database Partitioning FeatureDPF)。

  2. 主數據庫和備用數據庫必須運行在相同的操作系統版本上,並且DB2 UDB的版本也必須一致,除非短暫的軟件升級過程。

  3. 主數據庫和備用數據庫的位大小必須一致(32位或64位)。

  4. 不能在備用數據庫上進行備份操作

  5. 備用數據庫是不能訪問的,客戶端程序無法連接備用數據庫。

  6. 日至歸檔操作只能在主數據庫上進行。

  7. 帶有COPY NO選項的LOAD命令是不支持的

  8. 主數據庫和備用數據庫必須是一對一的。

  1. HADR不能使用循環日志

  2. HADR不復制數據庫配置參數、共享庫、DLLsUDFs或存儲過程

 

 

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

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM