【达梦数据库】DM 实时主备系统部署


前言

实时主备系统由主库、实时备库、守护进程和监视器组成。通过部署实时主备系统,可以及时检测并处理各种硬件故障、数据库实例异常,确保持续提供数据库服务。

本文主要介绍在Linux系统中规范化部署达梦数据库主备集群的过程,以供学习参考。


一、前期安排

1.1 虚拟机创建

设备参数

搭建DM主备集群需要准备3台服务器,一台主库服务器,一台备库服务器,一台监视器服务器。
主备服务器需要安装有DM数据库软件,且配置有两张网卡。监视器服务器需安装有 DM 数据库软件,且与主备心跳网络(对内通讯IP)端口开放。

本文是在VMware 16 Pro 下创建三台虚拟机,必需虚拟机参数如下。

设备摘要
内存1GB
处理器1
硬盘(SCSI)20GB(预先分配)
CD/DVD (IDE)自动检测
网络适配器NAT
网络适配器 2自定义(VMnet2)

其中内存、处理器、硬盘、网卡可以根据业务需求修改其参数大小。初期创建时没有创建第二张网卡可以后续再添加。

如何添加第二张网卡,可以参考 VMware虚拟机配置网卡和共享磁盘步骤图解 的第一节进行网卡配置。

操作系统版本

  • 本文使用 CentOS Linux release 7.9.2009 (Core),即CentOS 7。
  • DM 数据库安装在 Linux 操作系统所需条件:glibc 2.3 以上,内核 2.6,预先安装 UnixODBC,系统性能监控等组件。

1.2 前期规划

本地目录规划

目录路径及其可用空间可以根据业务需求修改,本文仅作学习使用,故而未单独挂载那么多磁盘,可用空间也无需太大。

用途目录路径备注
数据库软件安装目录/home/dmdba/dmdbms可用空间>50 GB(视情况而定)
实例安装目录/home/dmdba/dmdata单独挂载性能最好的磁盘(建议 SSD)
归档日志存放目录/home/dmdba/dmarch单独挂载磁盘
备份文件存放目录/home/dmdba/dmbak单独挂载磁盘

IP及实例规划

主机名public ipprivate ip实例名
DM_MONITOR192.168.163.150/DM_MONITOR
DM_MF192.168.163.15110.0.0.151DM_MF
DM_SYNC192.168.163.15210.0.0.152DM_SYNC

端口规划

搭建 2 节点主备集群,端口规划如下:
两主机最好是相同用途的端口配置成相同的端口号,实际中也可以按需要修改端口号。

端口用途
5236数据库实例监听端口
61141MAL 系统监听 TCP 连接的端口
52141实例本地的守护进程监听 TCP 连接的端口
33141实例监听守护进程 TCP 连接的端口

防火墙集群之间需开放以上所有端口,集群对客户端只需要开通数据库实例监听端口。

例如检测端口5236是否开放:(回车后没有返回即为端口开放可以使用)

netstat -ano | grep 5236

1.3 前期准备

用户与组

DM 数据库不应该使用 root 用户安装和维护。需要在安装之前为 DM 数据库创建一个专用的系统用户 (dmdba) 和用户组 (dinstall),并设置系统用户dmdba的密码。

groupadd dinstall
useradd  -g dinstall -m -d /home/dmdba -s /bin/bash  dmdba
passwd dmdba

用户资源限制

执行命令,修改 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

用户环境变量

执行命令,修改 dmdba 用户环境变量:

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

1.4 防火墙设置

关闭防火墙

查看防火墙状态,如果显示为active,需要关闭防火墙,禁用则开机不启动防火墙。

systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service

关闭SELinux

查看是否开启了SELinux,如果显示为Enforcing,需要改为Disabled,再重启系统使配置生效。

getenforce
vi /etc/selinux/config     
# 进入文件后修改 SELINUX = disabled
# 保存退出文件
reboot

1.5 安装数据库

安装步骤可参考:
【官方文档】单机规范化部署

【个人博客】VMware虚拟机 + CentOS7环境配置 + DM8 数据库安装流程

安装完成需要调整 dm.ini 文件参数,进行参数优化。(可跳或者最后在做,不影响集群部署)

1.6 初始化实例

软件安装目录:/home/dmdba/dmdbms/bin,实例初始化目录:/home/dmdba/dmdata,初始化脚本如下:

./dminit path=/home/dmdba/dmdata db_name=dmrw page_size=32

初始化的实例必须先启动一次,才能脱机备份。

./dmserver path=/home/dmdba/dmdata/dmrw/dm.ini

当出现 “SYSTEM IS READY.” 说明已经启动成功,可以 exit 退出实例,进行下一步备份还原。


二、备份与还原

2.1 主库脱机备份

1.查看主库DMAP服务是否已启动

ps -ef|grep dmap

在这里插入图片描述
如图,第一行显示为已启动,进程号为2487。

2.未启动则先启动DMAP服务,dmdba 到安装目录的 bin 下执行以下命令:

./DmAPService start

3.关闭数据库后,使用 dmrman 工具脱机备份主库,dmdba 用户到安装目录的 bin 下执行以下命令:

./dmrman

4.执行 backup 全库。

backup database '/home/dmdba/dmdata/dmrw/dm.ini' backupset '/home/dmdba/dmbak/bakfull'; 

2.2 备库还原

1.拷贝主库备份到备库合适目录,在主库执行以下命令:

scp -r /home/dmdba/dmbak/bakfull 192.168.163.152:/home/dmdba/dmbak

注意要修改正确路径和要修改成备库的public ip地址。
此处会传输 bakfull.bak 和 bakfull.meta 共两个文件到达备库的dmbak文件夹下。

2.关闭数据库后,使用 dmrman 工具还原备库,dmdba 用户到安装目录的 bin 下通过 dmrman 工具恢复。

# 重启DMAP服务
./DmAPService restart

./dmrman
# 启动工具后执行 restore 还原
restore database '/home/dmdba/dmdata/dmrw/dm.ini' from backupset '/home/dmdba/dmbak/bakfull'; 

# 执行 recover 恢复
recover database '/home/dmdba/dmdata/dmrw/dm.ini' from backupset '/home/dmdba/dmbak/bakfull';
 
# 执行 recover update db_magic 更新数据库魔数
recover database '/home/dmdba/dmdata/dmrw/dm.ini' update db_magic;

在这里插入图片描述


三、添加配置文件

3.1 配置实例配置文件 dm.ini

1.修改实例的 dm.ini 文件参数
使用 dmdba 用户,执行以下命令:

vi /home/dmdba/dmdata/dmrw/dm.ini

2.主库修改以下参数值:

INSTANCE_NAME = DM_MF
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2

3.备库修改以下参数值:

INSTANCE_NAME = DM_SYNC
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2

3.2 配置归档配置文件 dmarch.ini

在实例目录下新建文件 dmarch.ini,使用 dmdba 用户,执行以下命令:

vi /home/dmdba/dmdata/dmrw/dmarch.ini

主库添加以下内容:

[ARCHIVE_REALTIME]
ARCH_TYPE     = REALTIME  #实时归档类型
ARCH_DEST     = DM_SYNC   #实时归档目标实例名(主库侧填写备库实例名)
[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_MF  #实时归档目标实例名(备库侧填写主库实例名)
[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

3.3 配置MAL系统配置文件 dmmal.ini

在实例目录下新建文件 dmmal.ini,使用 dmdba 用户,执行以下命令:

vi /home/dmdba/dmdata/dmrw/dmmal.ini

主备库文件内容要相同,添加以下内容:

MAL_CHECK_INTERVAL   = 5  # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL  = 5  # 判定 MAL链路断开的时间
[MAL_INST1]
  MAL_INST_NAME = DM_MF  #与 dm.ini中的 INSTANCE_NAME一致
  MAL_HOST     = 10.0.0.151  # MAL系统监听 TCP 内部网络 IP
  MAL_PORT     = 61141  # MAL系统监听 TCP连接的端口
  MAL_INST_HOST   = 192.168.163.151  #实例的对外服务 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_SYNC  #与 dm.ini中的 INSTANCE_NAME 一致
  MAL_HOST      = 10.0.0.152  # MAL系统监听 TCP内部网络 IP
  MAL_PORT          = 61141  # MAL系统监听 TCP连接的端口
  MAL_INST_HOST         = 192.168.163.152  #实例的对外服务 IP地址
  MAL_INST_PORT         = 5236  #与 dm.ini中的 PORT_NUM一致
  MAL_DW_PORT  = 52141  #实例对应的守护进程监听 TCP端口
  MAL_INST_DW_PORT = 33141

3.4 配置守护进程配置文件 dmwatcher.ini

在实例目录下新建文件 dmwatcher.ini,使用 dmdba 用户,执行以下命令:

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  #命令行方式启动

四、启动主备集群

4.1 前台方式启动

1.启动数据库实例

使用 dmdba 用户,到数据库安装目录的 bin 下执行以下命令。
(主备库都执行)

./dmserver /home/dmdba/dmdata/dmrw/dm.ini mount

注意是 mount 配置状态登录,出现 “SYSTEM IS READY.” 即为成功。

另外开一个新的终端,使用 disql 工具连接数据库,修改 oguid
(主备库都执行)

./disql SYSDBA/SYSDBA
# 连接成功后修改 oguid
sp_set_oguid(453331);

主库修改数据库模式为 primary,执行以下命令:

alter database primary;

备库修改数据库模式为 standby,执行以下命令:

alter database standby;

2.启动守护进程

dmdba 用户下,到数据库安装目录的 bin 下执行。
(主备库都执行)

./dmwatcher /home/dmdba/dmdata/dmrw/dmwatcher.ini

守护进程启动后,会将 Mount 的实例 Open。

在这里插入图片描述


3.启动确认监视器

注意事项:

  • 守护进程配置为自动切换时,必须配置确认监视器。
  • 监视器服务器需安装有 DM 数据库软件,且与主备心跳网络端口开放。

在监视器服务器上,新建确认监视器配置文件 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.0.0.151:52141
 MON_DW_IP     = 10.0.0.152:52141

使用 dmdba 用户,到数据库安装目录的 bin 下执行以下命令:

./dmmonitor /home/dmdba/dmdata/dmmonitor_auto.ini

4.输入 show 命令查看集群状态。

在这里插入图片描述

需要关注的数值:

  • 守护进程状态 WSTATUSOPEN
  • 实例状态 ISTATUSOPEN
  • 归档类型 RTYPEREALTIME
  • 归档状态 RSTATVALID

以上启动为前台方式启动,仅用户搭建过程中验证配置。配置没问题后需要将实例,守护进程和确认监视器注册为系统服务,方便后续使用。

4.2 服务方式启动

注册服务

使用 root 用户,到数据库安装目录的 script/root 下,执行。

1.注册守护进程服务(主备库都执行)。

./dm_service_installer.sh -t dmwatcher -p dmrw -watcher_ini /home/dmdba/dmdata/dmrw/dmwatcher.ini

2.注册数据库实例服务(主备库都执行)。

./dm_service_installer.sh -t dmserver -p dmrw -dm_ini /home/dmdba/dmdata/dmrw/dm.ini

3.注册监视器服务(只需在监视器服务器上执行)。

./dm_service_installer.sh -t dmmonitor -p confirm -monitor_ini /home/dmdba/dmdata/dmmonitor_auto.ini

启动服务

1.启动数据库实例。

systemctl start DmServicedmrw

2.启动守护进程。

systemctl start DmWatcherServicedmrw

3.启动监视器。

systemctl start DmMonitorServiceconfirm

4.3 重启顺序

主备集群重启有顺序要求:

1.关闭监视器:systemctl stop DmMonitorServiceconfirm
2.关闭主库守护进程:systemctl stop DmWatcherServicedmrw
3.关闭备库守护进程:systemctl stop DmWatcherServicedmrw
4.关闭主库实例:systemctl stop DmServicedmrw
5.关闭备库实例:systemctl stop DmServicedmrw

6.启动主库实例:systemctl start DmServicedmrw
7.启动备库实例:systemctl start DmServicedmrw
8.启动主库守护进程:systemctl start DmWatcherServicedmrw
9.启动备库守护进程:systemctl start DmWatcherServicedmrw
10.启动监视器:systemctl start DmMonitorServiceconfirm

注意启动和关闭顺序!!

启动:主备库实例 → 主备库守护进程 → 监视器

关闭:监视器 → 主备库守护进程 → 主备库实例


五、验证集群状态

5.1 监视器查看

如果有单独设置监视器服务器,则可以跳过此步的监视器配置。

1.配置监视器

集群任意节点(一般在备库),配置普通监视器配置文件 dmmonitor_manual.ini。

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.0.0.151:52141
 MON_DW_IP     = 10.0.0.152:52141

2.启动监视器

./dmmonitor /home/dmdba/dmdata/dmmonitor_manual.ini

在这里插入图片描述

3.输入 show 命令查看集群状态。

在这里插入图片描述

**需要关注的数值:依旧是 WSTATUS (OPEN)、ISTATUS (OPEN)、RTYPE (REALTIME)、RSTAT (VALID) 。

5.2 disql客户端验证

1.使用 disql 客户端登录主库,创建测试表,插入数据。

./disql SYSDBA/SYSDBA@192.168.163.151:5236

SQL 提示符下执行以下命令:

create table test(id int);
insert into test values (1);
commit;

2.使用 disql 客户端登录备库,查询测试表验证。

./disql SYSDBA/SYSDBA@192.168.163.152:5236

SQL 提示符下执行以下命令:

select * from test;

如果主库插入/更改数据后未提交(commit),在备库查询时,仍然会是未插入/更改之前的数据。直到主库提交后,才会使主备库数据同步,此时再次查询备库的表数据,两边数据一致。


六、报错解决


6.1 [-8029]:server not initialize

can’t backup no initialized database
报错原因:初始化的实例还没有启动一次就直接脱机备份,导致此报错。
解决办法:

先通过前台启动一次初始化实例,再进行脱机备份。

./dmserver path=/home/dmdba/dmdata/dmrw/dm.ini

当出现 “SYSTEM IS READY.” 说明已经启动成功,可以 exit 退出实例,进行下一步备份还原。


6.2 [-137]:DM server is running or exist other process which is operating the same database

报错原因:数据库正在运行状态或者存在进程在操作数据库或者数据库服务还未关闭。
解决办法:

关闭数据库、杀死对应进程以及数据库服务。

ps -ef|grep dmserver  #如果仍在运行的数据库进程号为1135,则kill掉。
kill -9 1135
systemctl stop DmServicedmrw.service

6.3 [-7169]:Bakres failed to message communicate with DMAP

报错原因:因为DmAPService未启动,或DmAPService出现问题。
解决办法:

打开或者重启DMAP服务。如果无效,需要去查看报错日志。

./DmAPService start
./DmAPService restart  # 经常会遇到此报错,建议优先使用此句

6.4 [-718]: archive log collected not consecutive

报错原因:收集到的归档日志不连续。
解决办法:

① 需要先停止数据库实例,修复归档,重启数据库服务,再执行在线备份。

systemctl stop DmServicedmrw.service
./dmrman
RMAN> repair archivelog database ‘/home/dmdba/dmdata/dmrw/dm.ini’;
RMAN> backup database '/home/dmdba/dmdata/dmrw/dm.ini' backupset '/home/dmdba/dmbak/bakfull';
RMAN> exit

或者
② 启动相应数据库实例,执行完全检查点,解决刚开归档备份,报错归档日志不连续的问题。

systemctl start DmServicedmrw.service
./disql SYSDBA/SYSDBA@localhost:5236
SQL> checkpoint(100);

6.5 [-8003]

报错原因:缺少本地或者远程归档。
解决办法:

登录数据库实例,创建表及插入数据,创建一个本地或远程归档。

# 登录数据库实例,创建表和插入数据,已存在表及数据可直接开归档。
systemctl start DmServicedmrw.service
./disql SYSDBA/SYSDBA@localhost:5236
SQL> create table T1(id int,name varchar(20));
SQL> insert into T1 values (1,’AAA’),(2,’BBB’),(3,’CCC’);
SQL> commit;
SQL> select * from T1;

# 开启归档日志
SQL> alter database mount;
SQL> alter database archivelog;
SQL> select arch_mode from v$database;  # 返回为当前的arch_mode为Y。
SQL> alter database add archivelog 'type=local,dest=/home/dmdba/dmarch,file_size=64,space_limit=10240';
SQL> alter database open;
SQL> select * from v$dm_arch_ini;  # 返回归档日志的信息。

如果后续在 3.2 配置归档配置文件 dmarch.ini 时发现有数据时,需要将其原来数据清空或者将此文件移为备份文件,新建一个dmarch.ini 配置文件填上主备搭建需要的数据。


6.6 查看监视器时备库的 RSTAT 为 INVALID

在这里插入图片描述

报错原因: 主备库没有以 mount 模式启动,系统以 open 模式启动时重构回滚表空间,生成 Redo 日志;导致主备库信息的不一致,从而备库的 RSTAT 是 INVALID 无效状态,此时是无法进行数据同步的。
解决办法:

参考资料:DM7 达梦 数据库 数据守护(Data Watch) (16) – DW 备库 RSTAT 状态 INVALID 解决方法

笔者自己的解决办法则是,停止一切服务,重新执行本文的以下几步:
二、备份与还原
四、启动主备集群 的 4.1 或者 4.2
五、验证集群状态

如果配置文件前期配置无误,则不需要修改。
而 /home/dmdba/dmbak/bakfull 文件夹中的文件可以移除,因为在执行第二步备份与还原又会重新创建的。


总结

本文主要介绍在CentOS7(Linux 系统)规范化部署 DM 主备集群的过程。实际操作过程要随时注意执行当前语句的用户及路径,尽量用dmdba用户去执行。

如果文中有误,欢迎指出,大家共同交流进步!

更多达梦技术资讯,请访问达梦技术社区:
达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心
https://eco.dameng.com/

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值