DM实时主备系统部署
本次记录我进行DM数据库的实时主备系统搭建部署,相关的操作和我遇到的问题也记录下来了。
前期准备
服务器准备
-
设置参数
-
需要三台服务器(即三个虚拟机),一台主库服务器,一台备库服务器,一台监视器服务器
-
主备服务器需要安装有DM数据库,并且配备两张网卡。监视器服务器需要安装DM数据库,且与主备内网互联
-
三台虚拟机的参数如下(三个的配置是一样的):
设备 摘要 内存 1GB 处理器 1 硬盘(SCSI) 30GB CD/DVD (IDE) 自动检测 网络适配器 NAT 网络适配器 2 自定义(VMnet2) - 默认没有第二张网卡,这里提供添加网卡的链接:VMware虚拟机配置网卡和共享磁盘步骤图解_vmware网卡设置-优快云博客
-
-
系统版本
- 本次部署使用的是CentOS 7-x86_64-2207
- DM数据库使用的是DM8
服务器规划
-
IP规划
主机名 公网IP 内网IP 实例名 DM_zhuku 192.168.19.130 10.10.10.1 DM_zhuku DM_beiku 192.168.19.131 10.10.10.2 DM_beiku DM_jianshiqi 192.168.19.132 10.10.10.3 DM_jianshiqi - 主机名和实例名一样,在操作时更好识别
- 内网IP用于监视器监控主库和备库
-
端口规划
端口 作用 5236 数据库实例监听端口 61141 MAL系统监听 TCP连接的端口 52141 实例对应的守护进程监听 TCP 端口 33141 实例监听守护进程TCP连接端口 - 这些在后面配置文件中都会涉及,只是目前展示出来
-
数据库安装准备
-
就是DM数据库安装那一套,这里就只是简单说一下就好,具体情况就不做演示
-
创建新的组和用户,专用于DM数据库
groupadd dinstall ##新增组dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba ##新增用户dmdba在组dinstall下 passwd dmdba ##设置密码
-
修改资源限制
vim /etc/security/limits.conf
-
在文章最后面插入以下内容
dmdba soft core unlimited dmdba hard core unlimited dmdba soft nofile 65536 dmdba hard nofile 65536 dmdba soft nproc 65536 dmdba hard nproc 65536 dmdba soft stack 65536 dmdba hard stack 65536
-
-
修改环境变量
vi /home/dmdba/.bash_profile
-
打开后,在最后面插入以下内容
export DM_HOME=/home/dmdba/dmdbms export PATH=$PATH:$DM_HOME/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin
-
-
使用命令让环境变量生效
source /home/dmdba/.bash_profile
-
数据库安装这里就不再讲解
-
-
初始化实例
这里我就直接使用图形化界面来操作(方便)
-
创建初始化实例,在tool目录下,使用下面命令打开图形化操作界面
./dbca.sh
-
这里如果报错,很可能是图像化命令未开启,需要重新开启
-
-
打开后,默认选项不动即可
-
选择数据库存放位置,这里我选择的是之前创建的目录
-
填写数据库名称和实例名称,数据库名:dmrw,实例名称:DM_beiku(自己注意实例名)
-
数据库参数配置,主要是页大小、簇大小和字符集选择(这里页大小使用32K)
-
之后就直接全点【下一步】就好,不用管口令和示例。根据提示在终端完成命令就好
-
备份还原
主库脱机备份
-
查看主库DMAP服务是否启动
ps -ef|grep dmap
-
这里没启动,需要先启动DMAP服务,到bin目录下执行命令
./DmAPService start
- 有【OK】显示,就算是启动成功了
-
关闭数据库,这里指的是关闭当前实例
[root@localhost tool]# ./dmservice.sh
-
使用dmrman工具进行主库脱机备份,在bin目录下面
./dmrman
-
执行 backup 全库
backup database '/home/dmdba/dmdata/dmrw/dm.ini' backupset '/home/dmdba/dmbak/bakfull';
备库还原
-
将主库的备份拷贝到备库中,在主库下执行命令
scp -r /home/dmdba/dmbak/bakfull 192.168.19.131:/home/dmdba/dmbak
- 这里拷贝成功的话,会在备库生成一个dmbak目录,里面有bakfull.bak和bakfull.meta两个文件
-
关闭数据库,启用图形化工具CONSOLE还原备库
-
点击配置,选择还原的目录位置
-
选择完后点击【获取备份】,可以得到对应的备份情况
-
选择好还原的文件,点击【还原】进入还原界面,编辑存放备份的位置(这里我就直接默认)
-
点击【确定】进行还原,最后出现提示【还原成功】则说明成功
-
添加配置文件
配置实例配置文件dm.ini
-
使用dmdba用户,打开dmrw库的dm.ini配置文件
vi /home/dmdba/dmdata/dmrw/dm.ini
-
主库修改参数值
INSTANCE_NAME = DM_zhuku MAL_INI = 1 ARCH_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2
-
这里使用图形化工具CONSOLE更方便,选择【服务器配置】,选择需要修改的实例,点击进入,就可以搜索
- 这里就不过多展示内容,自行查找修改对应数值即可
-
-
备库修改参数值
INSTANCE_NAME = DM_beiku MAL_INI = 1 ARCH_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2
-
同样的操作(注意,这里是备库,别搞混了)
- 一定记得下面要保存
-
配置归档配置文件dmarch.ini
-
使用dmdba用户,打开dmarch.ini配置文件
vi /home/dmdba/dmdata/dmrw/dmarch.ini
-
主库添加内容
[ARCHIVE_REALTIME] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DM_beiku #实时归档目标实例名(主库侧填写备库实例名) [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /home/dmdba/dmarch/arch #本地归档文件存放路径 ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值 ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
-
备库添加内容
[ARCHIVE_REALTIME] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DM_zhuku #实时归档目标实例名(备库侧填写主库实例名) [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /home/dmdba/dmarch/arch #本地归档文件存放路径 ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值 ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
配置MAL系统配置文件dmmal.ini
-
使用dmdba用户,打开dmmal.ini配置文件
vi /home/dmdba/dmdata/dmrw/dmmal.ini
-
主备库添加的内容一样,如下:
MAL_CHECK_INTERVAL = 5 # MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 # 判定 MAL链路断开的时间 [MAL_INST1] MAL_INST_NAME = DM_zhuku #与 dm.ini中的 INSTANCE_NAME一致 MAL_HOST = 10.10.10.1 # MAL系统监听 TCP 内部网络 IP MAL_PORT = 61141 # MAL系统监听 TCP连接的端口 MAL_INST_HOST = 192.168.19.130 #实例的对外服务 IP地址 MAL_INST_PORT = 5236 #与 dm.ini中的 PORT_NUM一致 MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口 MAL_INST_DW_PORT = 33141 [MAL_INST2] MAL_INST_NAME = DM_beiku #与 dm.ini中的 INSTANCE_NAME 一致 MAL_HOST = 10.10.10.2 # MAL系统监听 TCP内部网络 IP MAL_PORT = 61141 # MAL系统监听 TCP连接的端口 MAL_INST_HOST = 192.168.19.131 #实例的对外服务 IP地址 MAL_INST_PORT = 5236 #与 dm.ini中的 PORT_NUM一致 MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP端口 MAL_INST_DW_PORT = 33141
注意:
主库和备库的内容是一样的!
配置守护进程文件dmwatcher.ini
-
在dmdba用户下,编辑dmwatcher.ini配置文件
vi /home/dmdba/dmdata/dmrw/dmwatcher.ini
-
主备库添加同样的内容,如下:
[GRP_RW] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #自动切换模式 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453331 #守护系统唯一 OGUID 值 INST_INI = /home/dmdba/dmdata/dmrw/dm.ini # dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
启动主备集群
这里提供两种方法,选择一个就好。
前台启动方法
-
启动数据库实例
-
在dmdba用户下,在bin目录下执行命令,主备库都要执行
./dmserver /home/dmdba/dmdata/dmrw/dm.ini mount
- 出现
SYSTEM IS READY
就说明成功
- 出现
-
另外开一个终端,使用DIsql工具连接数据库,修改oguid
./disql SYSDBA/SYSDBA # 连接成功后修改 oguid sp_set_oguid(453331);
-
主库数据库模式修改为primary模式
alter database primary;
-
备库数据库模式修改为standby模式
alter database standby;
-
我这里备库在启动数据库实例开头一步报错了
- 查了一下,是还原的时候没有更新Magic,所以需要使用CONSOLE工具更新
-
还是前面的操作,到获取备份,选中备份,点击右边【更新Magic】
-
点击【确定】,更新
-
此时再使用
./dmserver /home/dmdba/dmdata/dmrw/dm.ini mount
,即可成功
-
-
-
启动守护进程
-
在dmdba用户下,在bin目录下执行命令,主备库都要执行
./dmwatcher /home/dmdba/dmdata/dmrw/dmwatcher.ini
- 出现这个提示说明启动成功
- 守护进程启动后,会将Mount的实例Open
- 这里我是用的另一个终端开启的,前面启动数据库实例的没关
-
-
启动确认监视器
-
注意事项:
- 守护进程配置为自动切换时,必须配置确认监视器
- 监视器服务器需要安装有DM数据库,并且与主备库服务器能够互ping
-
在监视器服务器上,编辑dmmonitor_auto.ini配置文件
vi /home/dmdba/dmdata/dmmonitor_auto.ini
-
添加内容:
MON_DW_CONFIRM = 1 #确认监视器模式 MON_LOG_PATH = /home/dmdba/dmdata/dmmonitor_auto/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32 MB MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间 [GRP_RW] MON_INST_OGUID = 453331 #组 GRP_RW 的唯一 OGUID 值 #以下配置为监视器到组 GRP_RW 的守护进程的连接信息,以“IP:PORT”的形式配置 #IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT MON_DW_IP = 10.10.10.1:52141 MON_DW_IP = 10.10.10.2:52141
-
在dmdba用户下,到数据库bin目录下执行命令
./dmmonitor /home/dmdba/dmdata/dmmonitor_auto.ini
-
输入
show
命令查看集群状态- 出现问题了
-
这里发现问题,三台服务器的防火墙没关(我承认,我前期工作没处理好)
-
解决方法:关闭防火墙
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable firewalld
-
成功获取主备库的守护进程信息
- 需要关注的数值:
- 守护进程状态 WSTATUS 为 OPEN
- 实例状态 ISTATUS 为 OPEN
- 归档类型 RTYPE 为 REALTIME
- 归档状态 RSTAT 为 VALID
- 需要关注的数值:
-
-
服务方式启动
-
注册服务
使用root用户,在数据库安装目录下的script/root下
-
注册守护进程服务(主备库都要执行)
./dm_service_installer.sh -t dmwatcher -p dmrw -watcher_ini /home/dmdba/dmdata/dmrw/dmwatcher.ini
-
注册数据库实例服务(主备库都要执行)
./dm_service_installer.sh -t dmserver -p dmrw -dm_ini /home/dmdba/dmdata/dmrw/dm.ini
-
注册监视器服务(只用在监视器服务器上执行即可)
./dm_service_installer.sh -t dmmonitor -p confirm -monitor_ini /home/dmdba/dmdata/dmmonitor_auto.ini
-
-
启动服务
-
启动数据库实例(主备库都要)
systemctl start DmServicedmrw
-
启动守护进程(主备库都要)
systemctl start DmWatcherServicedmrw
-
启动监视器(只用监视器服务器)
systemctl start DmMonitorServiceconfirm
至此,主备集群和监控器就启动好了
-
重启顺序
- 主备集群重启有顺序要求
- 关闭主备集群:
- 关闭监视器:
systemctl stop DmMonitorServiceconfirm
- 关闭主库守护进程:
systemctl stop DmWatcherServicedmrw
- 关闭备库守护进程:
systemctl stop DmWatcherServicedmrw
- 关闭主库实例:
systemctl stop DmServicedmrw
- 关闭备库实例:
systemctl stop DmServicedmrw
- 关闭监视器:
- 启动主备集群:
- 启动主库实例:
systemctl start DmServicedmrw
- 启动备库实例:
systemctl start DmServicedmrw
- 启动主库守护进程:
systemctl start DmWatcherServicedmrw
- 启动备库守护进程:
systemctl start DmWatcherServicedmrw
- 启动监视器:
systemctl start DmMonitorServiceconfirm
- 启动主库实例:
- 关闭主备集群:
- 顺序:
- 启动:主备库实例–>主备库守护进程–>监视器
- 关闭:监视器–>主备库守护进程–>主备库实例
- 启动和关闭的顺序一定是相反的!!
验证集群状态
监视器查看
-
配置监视器
-
集群中任意节点都可以配置,一般在备库,配置普通监视器配置文件
vi /home/dmdba/dmdata/dmmonitor_manual.ini
-
添加以下内容:
MON_DW_Confirm = 0 #普通监视器模式 MON_LOG_PATH = /home/dmdba/dmdata/dmmonitor_manual/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32 MB MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间 [GRP_RW] MON_INST_OGUID = 453331 #组 GRP_RW 的唯一 OGUID 值 #以下配置为监视器到组 GRP_RW 的守护进程的连接信息,以“IP:PORT”的形式配置 #IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT MON_DW_IP = 10.10.10.1:52141 MON_DW_IP = 10.10.10.2:52141
-
启动监视器
./dmmonitor /home/dmdba/dmdata/dmmonitor_manual.ini
-
输入
show
命令查看集群状况- 仍然还是关注框里面的参数
-
遇到问题(这里算是一个预见吧)
- 这里就是没有对应的文件或者文件里面没有内容(如果按照上面的步骤走是不会出现的,我是第二天搞的时候用错系统了)
- 这里这个要看好自己配置的普通监视器在哪个服务器上,选择好服务就不会出现了
-
DIsql客户端查看
-
使用DIsql登录主库,创建测试表,插入数据
./disql SYSDBA/SYSDBA@192.168.19.130:5236
-
SQL提示符下执行下面命令创建表和插入数据
create table test(id int); insert into test values (1); commit;
-
-
使用DIsql登录备库,查询测试表验证
./disql SYSDBA/SYSDBA@192.168.19.131:5236
-
SQL提示符下执行查询命令
select * from test;
- 这里备库查询到了数据,表明主库创建的表和插入的数据同步到了备库,主备集群搭建成功
-
-
如果主库插入/更改数据后未提交(commit),在备库查询时,仍然会是未插入/更改之前的数据
-
实验,这里主库插入数据,但不提交
insert into test values (2);
- 主库已经插入数据,但未提交
-
查看备库数据
- 确实没有
-
主库commit提交后再查看备库
- 很好,备库也是成功更新数据了
-
总结
- 本次是进行的实时主备的搭建部署,从前期的准备到后面的实际操作都有讲到,自己也在操作中遇到了问题,同样记录下来了,后面遇到了还能翻出来看看。
- 实时主备主要目的是保障数据库可用性,提高数据安全性。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。主库修改数据产生的Redo日志,通过实时归档机制,在写入联机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。
参考
- [概述 | 达梦技术文档 (dameng.com)](https://eco.dameng.com/document/dm/zh-cn/pm/data-watch-overview.html#2.4.1 主要功能)