達夢資料庫DM8主備叢集測試記錄

魚塘頑主發表於2022-04-05

一、安裝計劃

系統環境:CentOS_7 + Docker

資料庫版本:dm8_docker :v01

 

Docker 映象dm8a為primary節點,例項名CRM1

Docker 映象dm8b為standby節點,例項名CRM2

Docker 映象dm8m為monitor節點

 

目錄劃分


Linux 系統目錄

對映Docker內路徑

說明

1

/dm/data_1

dm8a :/dm8/data

資料庫檔案目錄

2

/dm/archlog_1

dm8a :/dm8/archlog

歸檔目錄

3

/dm/data_2

dm8b :/dm8/ data

資料庫檔案目錄

4

/dm/archlog_2

dm8b :/dm8/archlog

歸檔目錄

5

/dm/backup

dm8a :/dm8/ backup

dm8b :/dm8/ backup

資料庫備份目錄(共用)

6

/dm/ini

dm8a :/dm8/ ini

dm8b :/dm8/ ini

指令碼和ini配置檔案目錄(共用)

 

/dm/ini 目錄下包含以下檔案:





1

CRM_1_dm.ini

主庫初始化dm.ini


2

CRM_1_dmarch.ini

主庫arch.ini


3

CRM_2_dm.ini

備庫初始化dm.ini


4

CRM_2_dmarch.ini

備庫arch.ini


5

dmmal.ini

MAL.INI 配置(共用)


6

dmmonitor.ini

Monitor 配置(共用)


7

dmwatcher_1.ini

主庫守護配置檔案


8

dmwatcher_2.ini

備庫守護配置檔案


9

init_crm1.sh

主庫初始化指令碼


10

init_crm2.sh

備庫初始化指令碼


 

二、啟動Docker映象

 

# 建立dockers network網段

docker network ls

docker network create   --subnet=172.18.0.0/16 mynetwork

 

docker run -it -p 5236:5236 --name   dm8a --hostname crm_1 --net mynetwork --ip 172.18.0.10 -v /dm/ini:/dm8/ini -v   /dm/data_1:/dm8/data -v /dm/archlog_1:/dm8/archlog -v /dm/backup:/dm8/backup   -d dm8:v01 /bin/bash

 

docker run -it -p 5237:5236 --name   dm8b --hostname crm_2 --net mynetwork --ip 172.18.0.20 -v /dm/ini:/dm8/ini -v   /dm/data_2:/dm8/data -v /dm/archlog_2:/dm8/archlog -v /dm/backup:/dm8/backup   -d dm8:v01 /bin/bash

 

docker run -it --name dm8m --hostname   crm_m --net mynetwork --ip 172.18.0.30 -v /dm/ini:/dm8/ini -d dm8:v01   /bin/bash

 

 

三、初始化資料庫

在dm8a映象當中執行init_crm1.sh指令碼

 

##init_crm1.sh 樣例

#!/bin/bash

 

# 映象內更改目錄所屬許可權

chown dmdba:dinstall -R /dm8/data   /dm8/archlog /dm8/backup

 

# 以下登入dmdba使用者,初始化資料庫

su - dmdba<<EOF

cd /dm8/bin

./dminit CONTROL=/dm8/ini/CRM_1_dm.ini

 

# 將寫好的ini配置檔案拷貝至資料庫路徑下

cp -if /dm8/ini/CRM_1_dmarch.ini   /dm8/data/crm1/dmarch.ini

cp -if /dm8/ini/dmmal.ini /dm8/data/crm1/dmmal.ini

cp -if /dm8/ini/dmwatcher_1.ini   /dm8/data/crm1/dmwatcher.ini

chown dmdba:dinstall   /dm8/data/crm1/*.ini

 

# 修改dm.ini配置檔案主備叢集相關引數項

find /dm8/data/crm1/ -type f -name   "dm.ini" | xargs sed -i 's/MAL_INI                         = 0/MAL_INI                         = 1/g'

find /dm8/data/crm1/ -type f -name   "dm.ini" | xargs sed -i 's/ALTER_MODE_STATUS               = 1/ALTER_MODE_STATUS               = 0/g'

find /dm8/data/crm1/ -type f -name   "dm.ini" | xargs sed -i 's/ENABLE_OFFLINE_TS               = 1/ENABLE_OFFLINE_TS               = 2/g'

EOF

 

# 以下在root使用者下注冊資料庫服務,生成服務檔案

cd /dm8/script/root

./dm_service_installer.sh -t dmwatcher   -p CRM1 -watcher_ini /dm8/data/crm1/dmwatcher.ini

./dm_service_installer.sh -t dmserver   -p CRM1 -dm_ini /dm8/data/crm1/dm.ini

# 首次啟動,即初始化啟動

/dm8/bin/DmServiceCRM1 start

/dm8/bin/DmAPService start

/dm8/bin/DmServiceCRM1 stop

 

# 切換dmdba使用者,主庫進行全量備份,備份集儲存至/dm8/backup/目錄(共享)

su - dmdba<<EOF

/dm8/bin/dmrman CTLSTMT="backup   database '/dm8/data/crm1/dm.ini' backupset '/dm8/backup/';"

EOF

 

# 使用dmserver命令將資料庫啟動到mount狀態,目的是修改oguid引數和設定primary

nohup /dm8/bin/dmserver   /dm8/data/crm1/dm.ini mount > /tmp/dm.out 2>&1 &

for((i=1;i<=10;i++));do    #for 迴圈判斷資料庫是否啟動完畢

    text=`cat /tmp/dm.out|grep "SYSTEM IS READY"`

    if [ -n "$text" ] ; then

      break

    fi

    sleep 1

done

su - dmdba<<EOF

/dm8/bin/disql SYSDBA/SYSDBA -e   "sp_set_oguid(453331);"

/dm8/bin/disql SYSDBA/SYSDBA -e   "alter database primary;"

EOF

# 設定完成後kill掉資料庫程式

ps -ef|grep dmserver|grep -v grep |awk   '{print $2}'|xargs kill -9

#rm -rf /tmp/dm.out

sleep 3

 

# 主庫完成初始化,啟動全部資料庫服務

source /startDm.sh

exit

 


 

在dm8b映象當中執行init_crm2.sh指令碼。

##init_crm2.sh 樣例

#!/bin/bash

 

chown dmdba:dinstall -R /dm8/data   /dm8/archlog /dm8/backup

 

su - dmdba<<EOF

cd /dm8/bin

./dminit CONTROL=/dm8/ini/CRM_2_dm.ini

cp -if /dm8/ini/CRM_2_dmarch.ini   /dm8/data/crm2/dmarch.ini

cp -if /dm8/ini/dmmal.ini   /dm8/data/crm2/dmmal.ini

cp -if /dm8/ini/dmwatcher_2.ini   /dm8/data/crm2/dmwatcher.ini

chown dmdba:dinstall   /dm8/data/crm2/*.ini

find /dm8/data/crm2/ -type f -name   "dm.ini" | xargs sed -i 's/MAL_INI                         = 0/MAL_INI                         = 1/g'

find /dm8/data/crm2/ -type f -name   "dm.ini" | xargs sed -i 's/ALTER_MODE_STATUS               = 1/ALTER_MODE_STATUS               = 0/g'

find /dm8/data/crm2/ -type f -name   "dm.ini" | xargs sed -i 's/ENABLE_OFFLINE_TS               = 1/ENABLE_OFFLINE_TS               = 2/g'

EOF

 

cd /dm8/script/root

./dm_service_installer.sh -t dmwatcher   -p CRM2 -watcher_ini /dm8/data/crm2/dmwatcher.ini

./dm_service_installer.sh -t dmserver   -p CRM2 -dm_ini /dm8/data/crm2/dm.ini

 

/dm8/bin/DmServiceCRM2 start

/dm8/bin/DmAPService start

/dm8/bin/DmServiceCRM2 stop

 

# 以下使用主庫備份集進行還原資料庫操作

su - dmdba<<EOF

/dm8/bin/dmrman CTLSTMT="restore   database '/dm8/data/crm2/dm.ini' from backupset '/dm8/backup/';"

/dm8/bin/dmrman CTLSTMT="recover   database '/dm8/data/crm2/dm.ini' update DB_MAGIC;"

EOF

 

nohup /dm8/bin/dmserver   /dm8/data/crm2/dm.ini mount > /tmp/dm.out 2>&1 &

for((i=1;i<=10;i++));do

    text=`cat /tmp/dm.out|grep "SYSTEM IS READY"`

    if [ -n "$text" ] ; then

      break

    fi

    sleep 1

done

 

su - dmdba<<EOF

/dm8/bin/disql SYSDBA/SYSDBA -e   "sp_set_oguid(453331);"

/dm8/bin/disql SYSDBA/SYSDBA -e   "alter database standby;"

EOF

 

ps -ef|grep dmserver|grep -v grep |awk   '{print $2}'|xargs kill -9

#rm -rf /tmp/dm.out

sleep 3

source /startDm.sh

exit

 

四、啟動監視器

在dm8m映象當中啟動監視器,觀察系統狀態。

 

./dmmonitor /dm8/ini/dmmonitor.ini

 

 

五、測試主備叢集功能

## 測試用例

create tablespace CRM_DATA datafile   'crm_data_01.dbf' size 1024 autoextend on next 64;

create tablespace CRM_INDEX datafile   'crm_index_01.dbf' size 512 autoextend on next 64;

 

create user crm identified by "*"   default TABLESPACE "CRM_DATA" default INDEX TABLESPACE   "CRM_INDEX";

grant PUBLIC to crm;

grant RESOURCE to crm;

 

create table tab_01 (c1 int, c2 char(10),   c3 varchar, c4 numeric(5,2), c5 smallint, c6 bigint, c7 byte,c8 binary,c9   float, c10 double, c11 real,c12 bit,c13 date,c14 time, c15 timestamp, c16   interval year to month,  c17 time with   time zone, c18 text,c19 image ,c20 blob, c21 clob);

 

insert into tab_01 values (1, 'abcd',   'testdatatype', '-123.45', '-32768', '-92233720', 123, '1',

 5, 7.8, 9.1, null, '2012-12-24', '21:59:59',   '2012-12-21 07:59:59', '15-08', '19:59:59 +02:03', 'test text data   type','0x123456789','0x987654321','test clob data type');

 

 

1 、模擬備庫當機,檢視叢集狀態

# 正常關閉CRM2庫或直接停止dm8b映象

# 備庫當機後,主庫狀態為:OPEN-->STARTUP-->MON   CONFIRM-->FAILOVER--> OPEN

 

# 備庫當機期間主庫刪除資料,然後正常啟動備庫

 

# 備庫啟動後,監視器顯示叢集狀態:

CRM2 狀態:NONE-->STARTUP-->OPEN

CRM1 狀態:OPEN-->RECOVERY-->OPEN

 

# 最後確認主備資料一致,符合預期

 

 


 

2 、模擬主庫當機,檢視叢集狀態

 

 

# 關閉CRM1例項所在的docker映象,模擬主庫當機場景,觀察監視器

 

 

#show 命令檢視節點狀態

 

 

# 在CRM2庫升級為主庫後,刪除測試資料

 

 

# 正常啟動CRM1庫,檢視監視器中叢集狀態變化

 

 

# 最後確認資料一致,符合預期

 

 

 

3 、模擬CRM2節點故障不可恢復,重新加入叢集

 

 

# 關閉dm8b映象,清空資料檔案。CRM1節點狀態正常,完成聯機備份

 

BACKUP DATABASE FULL BACKUPSET '/dm8/backup/'   device type disk backupinfo ' 聯機備份';

 

# 確保備份集正常,在重新開啟的dm8b映象當中重新執行初始化指令碼

 

 

#CRM2 節點加入主備叢集成功

 

#CRM2 節點追平CRM1節點日誌

 

# 測試資料一致,符合預期。

 

 

 

 

【監視器常用命令】

show [group_name]                      顯示指定組的例項資訊,如果未指定組名,則顯示所有組資訊

list [[group_name.]db_name]            列出指定組的庫對應的守護程式配置資訊,如果都未指定,則列出所有守護程式配置資訊

show open info [group_name.]db_name    顯示指定庫的Open歷史資訊

show apply stat [group_name.]db_name   檢視指定組的指定庫的日誌重演資訊

tip

choose switchover [group_name]         選擇可切換為Primary庫的備庫列表

switchover [group_name[.]] [db_name]   切換指定組的指定庫為Primary庫

 

choose takeover [group_name]           選擇可接管故障Primary庫的備庫列表

choose takeover force [group_name]     選擇可強制接管故障Primary庫的備庫列表

takeover [group_name[.]] [db_name]     使用指定組的指定庫接管故障Primary庫

takeover force [group_name[.]] [db_name] 使用指定組的指定庫強制接管故障Primary庫

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70015510/viewspace-2885685/,如需轉載,請註明出處,否則將追究法律責任。

相關文章