首页 > 数据库 > 国内数据库 > 达梦数据库DM8主备集群测试记录
系统环境: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 |
备库初始化脚本 |
|
|
# 创建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库
社区地址:https://eco.dameng.com
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70015510/viewspace-2885685/ ,如需转载,请注明出处,否则将追究法律责任。