ITPub博客

首页 > 数据库 > 国内数据库 > 达梦数据库DM8主备集群测试记录

达梦数据库DM8主备集群测试记录

原创 国内数据库 作者:鱼塘顽主 时间:2022-04-05 11:04:13 0 删除 编辑

一、安装计划

系统环境: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库

 

社区地址:https://eco.dameng.com

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70015510/viewspace-2885685/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-03-20

  • 博文量
    5
  • 访问量
    2874