一、准备工作
实时主备系统由主库、实时备库、守护进程和监视器组成。
通过部署实时主备系统,可以及时检测并处理各种硬件故障、数据库实例异常,在主库出现问题时,自动转为备库,确保持续提供数据库服务。
1、前期规划
用途 | 目录路径 |
---|---|
数据库软件安装目录 | /dm8 |
实例安装目录 | /dm8/data |
归档日志存放目录 | /dm8/arch |
备份文件存放目录 | /dm8/bak |
主机名 | ip(内外部网络一致、学习环境不区分) | 实例名 | 服务名 |
---|---|---|---|
dm_1 | 192.168.0.14 | dm_1 | DMSERVER01 |
dm_2 | 192.168.0.13 | dm_2 | DMSERVER02 |
DW_MONITOR | 192.168.0.15 | – | – |
搭建 2 节点主备集群,端口规划如下:
两主机最好是相同用途的端口配置成相同的端口号,实际中也可以按需要修改端口号。
端口号 | 用途 |
---|---|
5236 | 数据库实例监听端口 |
55001 | MAL 系统监听 TCP 连接的端口 |
65001 | 实例本地的守护进程监听 TCP 连接的端口 |
45001 | 实例监听守护进程 TCP 连接的端口 |
2、防火墙关闭
(1)关闭防火墙
查看防火墙状态,如果显示为active,需要关闭防火墙,禁用则开机不启动防火墙。
#查看防火墙状态,如果为active为打开状态
systemctl status firewalld.service
#关闭防火墙
systemctl stop firewalld.service
#禁用,开机不启动防火墙
systemctl disable firewalld.service
(2)关闭SELinux
查看是否开启了SELinux,如果显示为Enforcing,需要改为Disabled,再重启系统使配置生效。
getenforce
vi /etc/selinux/config
# 进入文件后修改 SELINUX = disabled
# 保存退出文件
reboot
3、创建数据库实例
首先需要在备机上创建与主机相同的一套数据库,才能实现主备机的实时数据守护。
(1)在备机上创建数据库实例,脚本如下:
#使用dmdba用户
su - dmdba
#到安装目录的bin目录下
cd /dm8/bin
#使用dminit创建数据库实例
./dminit PATH=/dm8/data DB_NAME=dm_2 INSTANCE_NAME=DMSERVER02 PORT_NUM=5236 PAGE_SIZE=8 EXTENT_SIZE=16 LOG_SIZE=256 CASE_SENSITIVE=1 SYSDBA_PWD=SYSDBA SYSAUDITOR_PWD=SYSDBA
或者也可以通过图形化界面来创建数据库实例(达梦管理工具),详见:达梦数据库:创建数据库实例并连接
(2)初始化的实例必须先启动一次,才能脱机备份。
通过脚本的方式启动刚才创建的数据库实例:
#dmdba用户
cd /dm8/bin
./dmserver path=/dm8/data/dm_2/dm.ini
当出现 “SYSTEM IS READY.” 说明已经启动成功,可以 exit 退出实例,进行下一步备份还原。
二、主机备份、备机还原
主库使用脱机备份
1、查看主库DMAP服务是否已启动
ps -ef|grep dmap
2、未启动则先启动DMAP服务,dmdba 到安装目录的 bin 下执行以下命令:
cd /dm8/bin
./DmAPService start
3、**关闭数据库后,**使用 dmrman 工具脱机备份主库,dmdba 用户到安装目录的 bin 下执行以下命令:
cd /dm8/bin
./dmrman
4、在dmrman下执行主库全库备份:
backup database '/dm8/data/dm_1/dm.ini' full to dmfullbak01 backupset '/dm8/bak/dmfullbak01';
ps:需要归档是打开的!
5、将主库的完全备份,传至备库,进行数据恢复,使主、备库的数据一致。
将主库的完全备份,传至备库,注意提前建好目的路径:
scp -r /dm8/bak/dmfullbak01 192.168.0.13:/dm8/bak/dmfullbak01
会传输 dmfullbak01.bak 和 dmfullbak01.meta 共两个文件到达备库的/dm8/bak/dmfullbak01 文件夹下。
6、关闭备库数据库后,使用 dmrman 工具还原备库,dmdba 用户到安装目录的 bin 下通过 dmrman 工具恢复。
cd /dm8/bin
# 重启DMAP服务
./DmAPService restart
./dmrman
# 启动dmrman工具后执行 restore 还原
restore database '/dm8/data/dm_2/dm.ini' from backupset '/dm8/bak/dmfullbak01';
# 执行 recover 恢复
recover database '/dm8/data/dm_2/dm.ini' from backupset '/dm8/bak/dmfullbak01';
# 执行 recover update db_magic 更新数据库魔数
recover database '/dm8/data/dm_2/dm.ini' update db_magic;
三、主机、备机配置文件
(1)使用 dmdba 用户,修改实例的dm.ini参数:
主库:
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
备库:
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
备库需要打开归档
(2) 配置MAL系统配置文件 dmmal.ini
#dmdba 用户
vi /dm8/data/dm_1/dmmal.ini
编辑如下内容:
MAL_CHECK_INTERVAL = 5 # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 # 判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMSERVER01 # 与dm.ini中的INSTANCE_NAME一致
MAL_HOST = 192.168.0.14 # MAL系统监听TCP内部网络IP
MAL_PORT = 55001 # MAL系统监听 TCP连接的端口
MAL_INST_HOST = 192.168.0.14 # 实例的对外服务 IP地址
MAL_INST_PORT = 5236 # 与dm.ini中的PORT_NUM一致
MAL_DW_PORT = 65001 # 实例对应的守护进程监听TCP端口
MAL_INST_DW_PORT = 45001
[MAL_INST2]
MAL_INST_NAME = DMSERVER02
MAL_HOST = 192.168.0.13
MAL_PORT = 55001
MAL_INST_HOST = 192.168.0.13
MAL_INST_PORT = 5236
MAL_DW_PORT = 65001
MAL_INST_DW_PORT = 45001
主库、备库中,dmmal.ini的文件内容相同!
(3)配置归档配置文件 dmarch.ini
#dmdba 用户
vi /dm8/data/dm_1/dmarch.ini
主库添加如下内容:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = DMSERVER02 #主库填写备库的服务名,备库填写主库的服务名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/arch
ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
主库、备库中,该文件只是在[ARCHIVE_REALTIME]ARCH_DEST参数,写对方的服务名,在[ARCHIVE_LOCAL1]ARCH_DEST 写本机的的归档路径。
(4)配置守护进程配置文件 dmwatcher.ini
#dmdba用户
vi /dm8/data/dm_1/dmwatcher.ini
添加如下内容:
[GRP_P]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm8/data/dm_1/dm.ini # dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
主备库文件内容要相同
四、监视器配置文件
注意:
守护进程配置为自动切换时,必须配置确认监视器。
监视器服务器需安装有 DM 数据库软件,且与主备心跳网络端口开放。
在监视器服务器上,新建确认监视器配置文件 dmmonitor_auto.ini,执行以下命令:
vi /dm8/bin/dmmonitor.ini
添加以下内容:
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm8/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32MB
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP_P]
MON_INST_OGUID = 453331 #组GRP_P的唯一 OGUID 值
#以下配置为监视器到组[GRP_P]的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST
#PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 192.168.0.14:65001
MON_DW_IP = 192.168.0.13:65001
五、启动主备集群、监视器
1、前台方式启动(脚本启动)
(1)启动数据库实例
使用 dmdba 用户,到数据库安装目录的 bin 下执行以下命令。
(主备库都执行)
#用脚本,以mount状态启动
./dmserver /dm8/data/dm_1/dm.ini mount
注意是 mount 配置状态登录,出现 “SYSTEM IS READY.” 即为成功。
(2)另外开一个新的终端,使用 disql 工具连接数据库,修改 oguid,设置主备库模式。
(主备库都执行)
cd /dm8/bin
./disql SYSDBA/SYSDBA
disql中执行:
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(453331);
alter database primary; --主库执行,备库执行: alter database standby;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
(3)启动守护进程
dmdba 用户下,到数据库安装目录的 bin 下执行。
(主备库都执行)
cd /dm8/bin
./dmwatcher /dm8/data/dm_1/dmwatcher.ini
守护进程启动后,会将 Mount 的实例 Open。可以通过disql连接后的状态显示来查看!
(4)监视器启动
在监视器服务器上,使用 dmdba 用户,到数据库安装目录的 bin 下执行以下命令:
# 写对 dmmonitor.ini 的所在路径
./dmmonitor /dm8/bin/dmmonitor.ini
启动后,输入 show 命令查看集群状态。
需要关注的数值:
守护进程状态 WSTATUS 为 OPEN
实例状态 ISTATUS 为 OPEN
归档类型 RTYPE 为 REALTIME
归档状态 RSTAT 为 VALID
可以通过 switchover 命令,进行主备机切换。
以上启动为前台方式启动,仅用户搭建过程中验证配置。
配置没问题后需要将实例、守护进程、确认监视器注册为系统服务,方便后续使用。
2、服务方式启动(注册服务)
注册服务
使用 root 用户,到数据库安装目录的 /script/root 下,执行:
1、注册数据库实例服务(主备库都执行,注意改服务名,ini文件的路径)
./dm_service_installer.sh -t dmserver -p DMSERVER01 -dm_ini /dm8/data/dm_1/dm.ini
#参数含义:
#-t 服务类型
#-p 服务名尾缀
#-dm_ini ini文件路径
2、注册守护进程服务(主备库都执行,注意改服务名,ini文件的路径)
./dm_service_installer.sh -t dmwatcher -p DMSERVER01 -watcher_ini /dm8/data/dm_1/dmwatcher.ini
3、注册监视器服务(只需在监视器服务器上执行)
./dm_service_installer.sh -t dmmonitor -p DW -monitor_ini /dm8/bin/dmmonitor.ini
启动服务
1、启动数据库实例。
systemctl start DmServiceDMSERVER01.service
2、启动守护进程。
systemctl start DmWatcherServiceDMSERVER01.service
3、启动监视器。
systemctl start DmMonitorServiceDW.service
3、主备集群重启的顺序要求
主备集群重启有顺序要求:
1.关闭监视器:systemctl stop DmMonitorServiceDW
2.关闭主库守护进程:systemctl stop DmWatcherServiceDMSERVER01
3.关闭备库守护进程:systemctl stop DmWatcherServiceDMSERVER02
4.关闭主库实例:systemctl stop DmServiceDMSERVER01
5.关闭备库实例:systemctl stop DmServiceDMSERVER02
6.启动主库实例:systemctl start DmServiceDMSERVER01
7.启动备库实例:systemctl start DmServiceDMSERVER02
8.启动主库守护进程:systemctl start DmWatcherServiceDMSERVER01
9.启动备库守护进程:systemctl start DmWatcherServiceDMSERVER02
10.启动监视器:systemctl start DmMonitorServiceDW
注意启动和关闭顺序!!
启动:主备库实例 → 主备库守护进程 → 监视器
关闭:监视器 → 主备库守护进程 → 主备库实例
六、验证集群状态
可以使用disql客户端验证
(1)使用 disql 客户端登录主库,创建测试表,插入数据。
./disql SYSDBA/SYSDBA@192.168.0.14:5236
SQL 提示符下执行以下命令:
create table test(id int);
insert into test values (1);
commit;
(2)使用 disql 客户端登录备库,查询测试表验证。
./disql SYSDBA/SYSDBA@192.168.0.13:5236
SQL 提示符下执行以下命令:
select * from test;
主库数据提交后,查询备库的表数据,两边数据一致,验证集群搭建成功。
七、部分报错及解决方法
(1) [-8029]:server not initialize
can’t backup no initialized database
报错原因:初始化的实例还没有启动一次就直接脱机备份,导致此报错。
解决办法:
先通过前台启动一次初始化实例,再进行脱机备份。
./dmserver path=/dm8/data/dm_1/dm.ini
当出现 “SYSTEM IS READY.” 说明已经启动成功,可以 exit 退出实例,进行下一步备份还原。
(2)[-137]:DM server is running or exist other process which is operating the same database
报错原因:数据库正在运行状态或者存在进程在操作数据库或者数据库服务还未关闭。
解决办法:
关闭数据库、杀死对应进程以及数据库服务。
ps -ef|grep dmserver #如果仍在运行的数据库进程号为1116,则kill掉。
kill -9 1116
systemctl stop DmServiceDMSERVER01.service
(3)[-7169]:Bakres failed to message communicate with DMAP
报错原因:因为DmAPService未启动,或DmAPService出现问题。
解决办法:
打开或者重启DMAP服务。如果无效,需要去查看报错日志。
/dm8/bin/DmAPService start
/dm8/bin/DmAPService restart # 经常会遇到此报错,建议优先使用此句
(4)[-718]: archive log collected not consecutive
报错原因:收集到的归档日志不连续。
解决办法:
① 需要先停止数据库实例,修复归档,重启数据库服务,再执行在线备份。
systemctl stop DmServiceDMSERVER01.service
./dmrman
RMAN> repair archivelog database '/dm8/data/dm_!/dm.ini';
RMAN> backup database '/dm8/data/dm_1/dm.ini' backupset '/DM8/bak/bak01';
RMAN> exit
或者
② 启动相应数据库实例,执行完全检查点,解决刚开归档备份,报错归档日志不连续的问题。
systemctl start DmServiceDMSERVER01.service
./disql SYSDBA/SYSDBA@localhost:5236
SQL> checkpoint(100);
(5) [-8003]
报错原因:缺少本地或者远程归档。
解决办法:
登录数据库实例,创建表及插入数据,创建一个本地或远程归档。
# 登录数据库实例,创建表和插入数据,已存在表及数据可直接开归档。
systemctl start DmServiceDMSERVER01.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=/dm8/arch,file_size=32,space_limit=0';
SQL> alter database open;
SQL> select * from v$dm_arch_ini; # 返回归档日志的信息。
如果在配置归档配置文件 dmarch.ini 时发现有数据时,需要将其原来数据清空或者将此文件移为备份文件,新建一个dmarch.ini 配置文件填上主备搭建需要的数据。
(6)查看监视器时备库的 RSTAT 为 INVALID
报错原因: 主备库没有以 mount 模式启动,系统以 open 模式启动时重构回滚表空间,生成 Redo 日志;导致主备库信息的不一致,从而备库的 RSTAT 是 INVALID 无效状态,此时是无法进行数据同步的。
解决办法:
https://www.cndba.cn/dave/article/3713
也可以这样,停止一切服务,重新执行本文的以下几步:
二、备份与还原
四、启动主备集群
五、验证集群状态
如果配置文件前期配置无误,则不需要修改。
而 /dm8/bak文件夹中的文件可以移除,因为在执行第二步备份与还原又会重新创建的。