文章目录
一、原理知识1.1 实时主备1.2 异步备库1.3 MAL 系统1.4 OGUID1.5 守护进程组1.6 组分裂1.7 脑裂 二、前期安排2.1 环境准备2.2 前期规划 三、备份与还原3.1 主库脱机备份3.2 备库还原 四、添加配置文件4.1 实例配置文件 dm.ini4.2 归档配置文件 dmarch.ini4.3 MAL系统配置文件 dmmal.ini4.4 守护进程配置文件 dmwatcher.ini4.5 定时器配置文件 dmtimer.ini4.6 监视器配置文件 dmmonitor.ini 五、启动集群5.1 启动数据库实例5.2 启动守护进程5.3 启动监视器 六、验证数据同步6.1 主库和实时备库数据同步6.2 主备切换后数据仍然同步6.3 异步备库定时同步数据 总结一、原理知识
1.1 实时主备
实时主备由一个主库以及一个或者多个配置了实时(Realtime)归档的备库组成。主要目的是保障数据库可用性,提高数据安全性。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。
主库修改数据产生的Redo日志,通过实时归档机制,在写入联机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。当主库出现故障时,备库在将所有Redo日志重演结束后,就可以切换为主库对外提供数据库服务。
1.2 异步备库
在实际应用中,如果数据库规模很大,并且对数据的实时性要求不是很严格,则可以配置多个异步备库用于分担统计报表等任务。
异步备库支持多源配置,目的是在实时或即时主备环境中,当主备库切换或者主库故障时,备库接管以后可以继续向同一个异步备库同步数据,因此如果主库配置了异步备库,在所有备库上也需要配置相同的异步备库,备库只有在切换为主库时才会向其同步数据。
1.3 MAL 系统
DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。
1.4 OGUID
数据守护唯一标识码,配置数据守护时,需要由用户指定 OGUID 值。其中数据库的
OGUID 在 MOUNT 状态下由系统函数 SP_SET_OGUID 设置,守护进程和监视器的 OGUID 值在配置文件中设定。
同一守护进程组中的所有数据库、守护进程和监视器,都必须配置相同的 OGUID 值,取值范围为 0~2147483647。
1.5 守护进程组
配置了相同 OGUID 的两个或多个守护进程,构成一个守护进程组。为方便管理,对每个守护进程组进行命名,守护进程组中的所有守护进程和监视器,必须配置相同的组名(如本文的GRP_RW)。
1.6 组分裂
同一守护进程组中,不同数据库实例的数据出现不一致,并且无法通过重演 Redo 日志重新同步数据的情况,我们称为组分裂。
引发组分裂的主要原因包括:
即时归档中,主库在将 Redo 日志写入本地联机 Redo 日志文件之后,发送 Redo日志到备库之前出现故障,导致主备库数据不一致,为了继续提供服务,执行备库强制接管。此时,当故障主库重启后,就会引发组分裂。
故障备库重新完成数据同步之前,主库硬件故障,并且长时间无法恢复;在用户接受丢失部分数据情况下,为了尽快恢复数据库服务,执行备库强制接管,将备库切换为主库。
此时,如果故障主库重启,也会造成组分裂。检测到组分裂后,守护进程会修改控制文件为分裂状态,被分裂出去的数据库需要通过备份还原等技术手段重新恢复。
1.7 脑裂
脑裂是同一个守护进程组中同时出现两个或者多个活动主库,并且这些主库都接收用户请求,提供完整数据库服务。一旦发生脑裂,将无法保证数据一致性,对数据安全造成严重
后果。
造成脑裂的主要原因有两个:网络不稳定或错误的人工干预。
为了避免出现脑裂,建议:
设置 dm.ini 参数 ALTER_MODE_STATUS=0,限制用户进行直接通过 SQL 修改
数据库模式、状态以及 OGUID。提供稳定、可靠的网络环境。配置自动切换数据守护时,将确认监视器部署在独立的第三方机器上,不要与某一个数据库实例部署在一起,避免由于网络问题触发自动故障切换,导致脑裂发生。通过人工干预,将备库切换为主库之前,一定要确认主库已经发生故障,避免主库活动情况下,备库强制接管,人为造成脑裂。
二、前期安排
2.1 环境准备
三台虚拟机,分别作为主库、实时备库、异步备库服务器。一台虚拟机,作为监视器。(可略,可在备库服务器上设置监视器)检查设备参数、操作系统版本、内存空间等情况。创建系统用户(dmdba)及其用户组(dinstall)。修改 dmdba 用户资源限制和环境变量。关闭防火墙和SELinux等。在实际环境为安全保障,可改为开启必要端口即可。安装数据库 DM8 并初始化实例,以前台方式启动。创建所需目录。此处不过多赘述其准备过程,详情可以参考博客:
【官方文档】单机规范化部署
【个人博客】VMware虚拟机 + CentOS7环境配置 + DM8 数据库安装流程
【达梦数据库】DM 实时主备系统部署
如果已经搭建好实时主备系统,可以另外加一台虚拟机搭建异步备库,再根据实际情况修改第四章中各个配置文件参数即可。
2.2 前期规划
本地目录规划
目录路径及其可用空间可以根据业务需求修改,本文仅作学习使用,故而未单独挂载那么多磁盘,可用空间也无需太大。
IP及实例规划
端口规划
不同主机最好是相同用途的端口配置成相同的端口号,实际中也可以按需要修改端口号。端口规划如下:
三、备份与还原
在主库进行脱机备份,然后把备份文件传输到实时备库和异步备库,然后分别在两个备库通过drmman工具进行还原和恢复。此步很重要,主要是达成初始服务器环境数据的完整性和一致性。
3.1 主库脱机备份
主库进行脱机备份,将备份文件分别传输到实时备库和异步备库。
1.初始化的实例必须先启动一次,才能脱机备份。
cd /home/dmdba/dmdbms/bin./dmserver path=/home/dmdba/dmdata/dmrw/dm.ini
当出现 “SYSTEM IS READY.” 说明已经启动成功,可以 exit 退出实例,进行下一步备份还原。
2.查看主库DMAP服务是否已启动。
ps -ef|grep dmap
如图,第一行显示为已启动,进程号为2487。
未启动则先启动DMAP服务
dmdba 到安装目录的 bin 下执行以下命令:
cd /home/dmdba/dmdbms/bin./DmAPService start
3.脱机备份主库
关闭数据库后,使用 dmrman 工具脱机备份主库,dmdba 用户到安装目录的 bin 下执行以下命令:
./dmrman
执行 backup 备份全库
RMAN> backup database '/home/dmdba/dmdata/dmrw/dm.ini' backupset '/home/dmdba/dmbak/bakfull';
这里的报错一般是文件路径出错,检查文件所对应的目录是否正确or是否存在。
如果提示以下报错,则通过 dm.ini 文件修复即可。
[-8216]:Archive log absence, repair archive log with SQL ‘repair archive log …’ in dmrman
RMAN> repair archivelog database '/home/dmdba/dmdata/dmrw/dm.ini';
5.拷贝主库备份到备库
scp -r /home/dmdba/dmbak/bakfull 192.168.163.152:/home/dmdba/dmbakscp -r /home/dmdba/dmbak/bakfull 192.168.163.153:/home/dmdba/dmbak
此处会传输主库的 备份文件到达备库的dmbak文件夹下。
注意要修改正确路径和要修改成备库的public ip地址。
3.2 备库还原
实时备库和异步备库都要进行还原恢复操作。
使用 dmrman 工具还原备库
关闭数据库后,dmdba 用户到安装目录的 bin 下通过 dmrman 工具恢复。
# 重启DMAP服务./DmAPService restart./dmrman# 启动工具后执行 restore 还原RMAN> restore database '/home/dmdba/dmdata/dmrw/dm.ini' from backupset '/home/dmdba/dmbak/bakfull'; # 执行 recover 恢复RMAN> recover database '/home/dmdba/dmdata/dmrw/dm.ini' from backupset '/home/dmdba/dmbak/bakfull';# 执行 recover update db_magic 更新数据库魔数RMAN> recover database '/home/dmdba/dmdata/dmrw/dm.ini' update db_magic;
四、添加配置文件
本章节涉及配置文件均放在/home/dmdba/dmdata/dmrw/目录下。
4.1 实例配置文件 dm.ini
使用 dmdba 用户,执行以下命令,分别修改相应参数值。
vi /home/dmdba/dmdata/dmrw/dm.ini
主库:
INSTANCE_NAME = DM_MF #修改实例名MAL_INI = 1 #打开 MAL 系统ARCH_INI = 1 #打开归档配置TIMER_INI = 1#打开定时器配置,除异步备库外的主备库需要ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUIDENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
实时备库:
INSTANCE_NAME = DM_SYNCMAL_INI = 1ARCH_INI = 1TIMER_INI = 1ALTER_MODE_STATUS = 0ENABLE_OFFLINE_TS = 2
异步备库:
INSTANCE_NAME = DM_ASYNCMAL_INI = 1 ARCH_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2
4.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 = 0#单位 MB,0 表示无限制,范围 1024~4294967294 MB[ARCHIVE_ASYNC]ARCH_TYPE= ASYNC#异步归档类型ARCH_DEST= DM_ASYNC #异步归档目标实例名(主库侧填写异步备库实例名)ARCH_TIMER_NAME = RT_TIMER #定时器名称,和 dmtimer.ini 中的名称一致
实时归档只允许配置一个,即时归档可以配置1-8个,异步归档可以配置1-8个。
实时备库:
[ARCHIVE_REALTIME]ARCH_TYPE= REALTIMEARCH_DEST= DM_MF[ARCHIVE_LOCAL1]ARCH_TYPE= LOCALARCH_DEST= /home/dmdba/dmarch/archARCH_FILE_SIZE = 128ARCH_SPACE_LIMIT = 0[ARCHIVE_ASYNC]ARCH_TYPE= ASYNCARCH_DEST= DM_ASYNCARCH_TIMER_NAME = RT_TIMER
实时备库也需要配置异步归档,这样切换主备后,异步备库仍然可以使用。
异步备库:
[ARCHIVE_LOCAL1]ARCH_TYPE= LOCALARCH_DEST= /home/dmdba/dmarch/archARCH_FILE_SIZE = 128ARCH_SPACE_LIMIT = 0
异步备库只需要配置本地归档即可。
4.3 MAL系统配置文件 dmmal.ini
在实例目录下新建文件 dmmal.ini,使用 dmdba 用户,执行以下命令:
vi /home/dmdba/dmdata/dmrw/dmmal.ini
主库、实时备库、异步备库:
添加以下内容,注意修改实例名、IP和端口。
MAL_CHECK_INTERVAL = 5MAL_CONN_FAIL_INTERVAL = 5[MAL_INST1]MAL_INST_NAME = DM_MFMAL_HOST = 10.0.0.151MAL_PORT = 61141MAL_INST_HOST = 192.168.163.151MAL_INST_PORT = 5236MAL_DW_PORT = 52141MAL_INST_DW_PORT = 33141[MAL_INST2]MAL_INST_NAME = DM_SYNCMAL_HOST = 10.0.0.152MAL_PORT = 61141MAL_INST_HOST = 192.168.163.152MAL_INST_PORT = 5236MAL_DW_PORT = 52141MAL_INST_DW_PORT = 33141[MAL_INST3]MAL_INST_NAME = DM_ASYNCMAL_HOST = 10.0.0.153MAL_PORT = 61141MAL_INST_HOST = 192.168.163.153MAL_INST_PORT = 5236MAL_DW_PORT = 52141MAL_INST_DW_PORT = 33141
主库、实时备库、异步备库的文件内容都要相同。
4.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 #命令行方式启动
主库、实时备库的文件内容都要相同。
异步备库:
[GRP_RW]DW_TYPE = LOCAL #本地守护类型DW_MODE = MANUAL #手动切换模式DW_ERROR_TIME= 10INST_ERROR_TIME = 10INST_OGUID = 453331INST_INI = /home/dmdba/dmdata/dmrw/dm.iniINST_AUTO_RESTART = 1INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
注意组名和 OGUID 要一致。
异步备库不具备故障自动切换等功能,DW_MODE 配置并不起作用,此处配置为 MANUAL 即可。
4.5 定时器配置文件 dmtimer.ini
在实例目录下新建文件 dmtimer.ini,使用 dmdba 用户,执行以下命令:
vi /home/dmdba/dmdata/dmrw/dmtimer.ini
用于定时触发实例发送归档日志到异步备库。
主库、实时备库:
[RT_TIMER] #和 dmarch.ini 中的 ARCH_TIMER_NAME 一致TYPE = 2FREQ_MONTH_WEEK_INTERVAL = 1FREQ_SUB_INTERVAL = 0FREQ_MINUTE_INTERVAL = 0START_TIME = 11:00:00END_TIME = 11:01:00DURING_START_DATE = -7-26 15:00:00DURING_END_DATE = 9999-12-31 23:59:59NO_END_DATE_FLAG = 1DESCRIBE = RT TIMERIS_VALID = 1
此处定时器配置为每天 11:00:00 触发主库和实时备库发送归档日志到异步备库,起始日期时间是 -07-26 的 15:00 。具体可以根据实际情况再做调整。
异步备库:不需要配置。
笔者实验过程中将 START_TIME 和 END_TIME 设置为相同的数值,结果主库和实时备库都没有发送过归档日志到达异步备库,猜测是间隔时间过短,因此设置了一分钟的缓冲时间。
4.6 监视器配置文件 dmmonitor.ini
集群任意节点(一般在备库),配置监视器配置文件 dmmonitor.ini。
本文配置在实时备库服务器上。
实时备库:
vi /home/dmdba/dmdata/dmrw/dmmonitor.ini
添加以下内容:
MON_DW_CONFIRM = 1MON_LOG_PATH = /home/dmdba/dmdata/dmrw/log #监视器日志文件存放路径MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32 MBMON_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_PORTMON_DW_IP= 10.0.0.151:52141MON_DW_IP= 10.0.0.152:52141MON_DW_IP= 10.0.0.153:52141
五、启动集群
5.1 启动数据库实例
使用 dmdba 用户,到数据库安装目录的 bin 下执行以下命令。
主库、实时备库、异步备库:
cd /home/dmdba/dmdbms/bin./dmserver /home/dmdba/dmdata/dmrw/dm.ini mount
注意是 mount 配置状态登录,出现 “SYSTEM IS READY.” 即为成功。
另外开一个新的终端,使用 disql 工具连接数据库,修改模式和 oguid。
主库:
cd /home/dmdba/dmdbms/bin./disql SYSDBA/SYSDBASQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);SQL> sp_set_oguid(453331);#修改 oguidSQL> alter database primary; #修改为 primary 模式SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
实时备库、异步备库:
cd /home/dmdba/dmdbms/bin./disql SYSDBA/SYSDBASQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);SQL> sp_set_oguid(453331);#修改 oguidSQL> alter database standby; #修改为 standby 模式SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
5.2 启动守护进程
dmdba 用户下,到数据库安装目录的 bin 下执行。
主库、实时备库、异步备库:
cd /home/dmdba/dmdbms/bin./dmwatcher /home/dmdba/dmdata/dmrw/dmwatcher.ini
守护进程启动后,会将 Mount 的实例 Open。
5.3 启动监视器
dmdba 用户下,到数据库安装目录的 bin 下执行。
实时备库:
cd /home/dmdba/dmdbms/bin./dmmonitor /home/dmdba/dmdata/dmrw/dmmonitor.ini
监视器启动后可以看到各个主机的启动状态。
六、验证数据同步
6.1 主库和实时备库数据同步
1.主库:使用 disql 客户端登录,创建测试表,插入数据。
./disql SYSDBA/SYSDBA@192.168.163.151:5236SQL> create table test(id int, name varchar2(20));SQL> insert into test values (1, 'one');SQL> select * from test;SQL> commit;
2.实时备库:使用 disql 客户端登录,查询测试表验证。
./disql SYSDBA/SYSDBA@192.168.163.152:5236SQL> select * from test;
如果主库插入/更改数据后未提交(commit),在备库查询时,仍然会是未插入/更改之前的数据。直到主库提交后,才会使主备库数据同步,此时再次查询备库的表数据,两边数据一致。
3.监视器:输入show命令查看集群状态。
此处需要关注的信息有:
主库和实时备库的 FLSN 和 CLSN 的值会随时间增长而同步增长,而异步备库的这两个值一般不变,只有等触发定时器后才会更新。
6.2 主备切换后数据仍然同步
1.监视器:输入 switchover 切换主备
……
等待一段时间,可以看到主库和实时备库的主备模式互相切换了。
监视器:输入show命令查看集群状态。
此时,实时备库为 primary 模式,主库为 standby 模式。
2.实时备库:使用 disql 客户端登录,插入数据。
SQL> exit./disql SYSDBA/SYSDBA@192.168.163.152:5236SQL> insert into test values (2, 'two');SQL> commit;
4.主库:使用 disql 客户端登录,查询测试表验证。
./disql SYSDBA/SYSDBA@192.168.163.151:5236SQL> select * from test;
可以看到主备切换后,实时备库的数据修改后,主库的数据也会同步修改。
5.监视器:再次输入 switchover 切换主备,恢复原来集群状态。
6.3 异步备库定时同步数据
1.查看主库、实时备库设置的dmtimer.ini,定时器设置的时间是:11:00 。
cat /home/dmdba/dmdata/dmrw/dmtimer.ini
2.异步备库:使用 disql 客户端登录,查询测试表验证。( 11:00 之前)
./disql SYSDBA/SYSDBA@192.168.163.153:5236SQL> select * from test;
可以看到,查询不到表格,说明此时主库还未发送归档日志到异步备库,因此两库数据不同步。
3.监视器:输入 show arch send info 命令查看异步备库的归档日志接收信息。
show arch send info GRP_RW.DM_ASYNC
4.异步备库:使用 disql 客户端登录,查询测试表验证。( 11:00 之后)
./disql SYSDBA/SYSDBA@192.168.163.153:5236SQL> select * from test;
可以看到,表格已经可以查询到了,说明此时主库已经发送过归档日志到异步备库,此时异步备库的数据同步了今日 11:00 之前的主库数据。
5.监视器:输入 show arch send info 命令查看异步备库的归档日志接收信息。
show arch send info GRP_RW.DM_ASYNC
6.异步备库:到相应路径查看归档日志。
cd /home/dmdba/dmarch/archls date #查看当前时间
总结
理解原理后,在搭建好主备集群的基础上,可以很容易就添加一个异步备库。搭建过程中要格外注意服务器之间的切换,避免造成误操作。同时应该注意集群启动和关闭顺序。
如果文中有误,欢迎指出,大家共同交流进步!
更多达梦技术资讯,请访问达梦技术社区:
达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心
/
如果觉得《【达梦数据库】DM 实时主备+异步备库部署》对你有帮助,请点赞、收藏,并留下你的观点哦!