大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、金仓KCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看 PostgreSQL 版本概况及生命周期一览,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!
前 言
前几天写了一个达梦数据库因网卡故障挂起的文章,没有说明主备搭建的过程以及配置文件等信息,今天想着把原来的文档分享出来一起学习。
DMDW 简介
DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。通过部署 DM 数据守护,可以在硬件故障(如磁盘损坏)、自然灾害(地震、火灾)等极端情况下,避免数据损坏、丢失,保障数据安全,并且可以快速恢复数据库服务,满足用户不间断提供数据库服务的要求。
DM 数据守护(DM Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
DM 数据守护系统结构参考图如下,主要由主库、备库、Redo 日志、Redo 日志传输、Redo 日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。
数据库与数据库实例
数据库(Database)是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件),保存在物理磁盘或文件系统中。
数据库实例(Instance)就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。通过数据库实例,可以操作数据库,一般情况下,我们访问、修改数据库都是通过数据库实例来完成的。
本文档将不再严格区分数据库和数据库实例的概念,很多地方会笼统的以库来代替。考虑到数据守护系统中,数据库实例名是唯一的,为了更准确地进行描述,很多情况下我们会以实例 xxx 来标记某一个主库或者备库。
主库
Primary 模式,提供完整数据库服务的实例,一般来说主库是用来直接支撑应用系统的生产库。
备库
Standby 模式,提供只读数据库服务的实例。备库除了用于容灾,还可以提供备份、查询等只读功能,并且备库还支持临时表的 Insert/Delete/Update 操作。
备库支持临时表修改主要基于两个因素:1.临时表数据的修改不会产生 Redo 日志,主库对临时表的修改无法同步到备库;2.可以提供更大灵活性,适应更多应用场景。
根据数据同步情况,备库又可以分为可切换备库和不可切换备库。可切换备库是指,主备库之间数据完全同步,主库发生故障、备库切换为主库后,不会造成任何数据丢失的备库。
Redo 日志
Redo 日志记录物理数据页内容变动情况,是数据库十分重要的一个功能,在数据库系统故障(比如服务器掉电)重启时,利用 Redo 日志可以把数据恢复到故障前的状态。
Redo 日志也是数据守护的实现基础,数据库中 Insert、Delete、Update 等 DML 操作以及 Create TABLE 等 DDL 操作最终都会体现为对某一个或者多个物理数据页的修改,因此备库通过重做 Redo 日志可以与主库数据保持一致。
Redo 日志传输
主备库之间的 Redo 日志传输,以日志包 RLOG_PKG 为单位,主库通过 MAL 系统发送 Redo 日志到备库。各种不同数据守护类型的区别,就在于主库日志包 RLOG_PKG 的发送时机,以及备库收到 Redo 日志后的处理策略。
Redo 日志重演
Redo 日志重演的过程,就是备库收到主库发送的 Redo 日志后,在物理数据页上,重新修改数据的过程。Redo 日志重演由专门的 Redo 日志重演服务完成,重演服务严格按照 Redo 日志产生的先后顺序,解析 Redo 日志、修改相应的物理数据页,并且重演过程中备库会生成自身的 Redo 日志写入联机日志文件。
守护进程
守护进程(dmwatcher)是数据守护系统的核心工具,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。
监视器
监视器(dmmonitor)用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。
集群规划
集群 IP 及端口等信息如下表所示:
主库 | 从库 | 监视器 | |
---|---|---|---|
业务IP | 192.168.216.249 | 192.168.216.250 | 192.168.216.251 |
心跳IP | 10.0.10.249 | 10.0.10.250 | 10.0.10.251 |
数据库名 | DAMENG | DAMENG | |
实例名 | DMSERVER | DMSERVER1 | |
实例端口 | 15236 | 15236 | |
MAL 端口 | 15336 | 15336 | |
MAL守护进程端口 | 15436 | 15436 | |
守护进程端口 | 15536 | 15536 | |
OGUID | 249250 | 249250 | |
守护组 | GRP1 | GRP1 | |
安装目录 | /data/dm8/dmdbms | /data/dm8/dmdbms | /data/dm8/dmdbms |
实例目录 | /data/dm8/data | /data/dm8/data | 无 |
注意:端口冲突。
主备库安装准备
按照单机环境安装好第二台数据库软件(过程略),然后初始化实例。第三台监视器仅安装软件。简要步骤如下:
mkdir -p /data/dm8/data mkdir -p /data/dm8/arch mkdir -p /data/dm8/dmdbms --mkdir -p /home/dmdba/dmdbms groupadd -g 12348 dmdba groupadd -g 12349 dinstall useradd -u 12345 -g dinstall -G dinstall,dmdba -m -d /home/dmdba -s /bin/bash dmdba passwd dmdba chown -R dmdba:dinstall /data/dm8 mkdir /mnt/dm mount /backup/dm8_20240821_x86_rh7_64_ent_8.1.3.26_pack37_inculde_symbols.iso /mnt/dm su - dmdba --第二台第三台安装软件 /mnt/dm/DMInstall.bin -i --仅第二台初始化实例 --不要粘贴如下命令,需要和前面单机安装初始化参数一致 /data/dm8/dmdbms/bin/dminit path=/data/dm8/data db_name=DAMENG instance_NAME=DMSERVER1 sysdba_pwd=JiekeXu_DM8 port_num=15236 extent_size=32 PAGE_SIZE=32 charset=1 case_sensitive=1 log_size=1024 initdb V8 db version: 0x7000c License will expire on 2024-12-25 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL log file path: /data/dm8/data/DAMENG/DAMENG01.log log file path: /data/dm8/data/DAMENG/DAMENG02.log write to dir [/data/dm8/data/DAMENG]. create dm database success. 2024-10-08 18:14:08
主库备份
主库做一个备份,并将备份传递到备库进行恢复。
SQL> BACKUP DATABASE BACKUPSET '/data/dm8/dm_backup/DAMENG/BACKUP_FILE';
scp -P62022 BACKUP_FILE* 192.168.216.250:/data/dm8/dm_backup/DAMENG/BACKUP_FILE
备库恢复
使用 dmrman 三部曲恢复数据。
$ ll /data/dm8/dm_backup/DAMENG/BACKUP_FILE
总用量 29296
-rw-r--r-- 1 dmdba dinstall 21504 10月 8 18:36 BACKUP_FILE_1.bak
-rw-r--r-- 1 dmdba dinstall 29859328 10月 8 18:36 BACKUP_FILE.bak
-rw-r--r-- 1 dmdba dinstall 112128 10月 8 18:36 BACKUP_FILE.meta
--还原操作
/data/dm8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/data/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/data/dm8/dm_backup/DAMENG/BACKUP_FILE'"
dmrman V8
RESTORE DATABASE '/data/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/data/dm8/dm_backup/DAMENG/BACKUP_FILE'
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:02.822
--恢复操作
/data/dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/data/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/data/dm8/dm_backup/DAMENG/BACKUP_FILE'"
dmrman V8
RECOVER DATABASE '/data/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/data/dm8/dm_backup/DAMENG/BACKUP_FILE'
Database mode = 2, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[52544], file_lsn[52544]
[Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 00:00:02.728
--更新数据库 db_magic
/data/dm8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/data/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
dmrman V8
RECOVER DATABASE '/data/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC
Database mode = 2, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[52583], file_lsn[52583]
recover successfully!
time used: 00:00:01.263
主备库参数配置
dm.ini 修改
如下参数在主备库中均要修改,注意主备库实例名不一致。
vim /data/dm8/data/DAMENG/dm.ini --找到参数文件内对应的参数进行修改
INSTANCE_NAME = DMSERVER #实例名,主库与备库实例名不一致
PORT_NUM = 15236 #数据库实例监听端口,默认5236
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间,保持默认
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID ,保持默认,是否允许手工修改服务器的模式、状态和OGUID,1:允许;0:不允许。
# 注:数据守护环境下建议配置为 0,实例处于主机或备机模式后,不允许用户直接通过 SQL 语句修改服务器的模式、状态和 OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间,默认 1 改为 2
MAL_INI = 1 #打开 MAL 系统, 默认 0 修改为 1
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息,默认值
ARCH_INI = 1 # 打开归档配置, 默认 0 修改为 1
dmarch.ini 修改
dmarch.ini 是归档配置文件,在两个主备节点的环境中,数据同步的 ARCH_DEST 互相写对方的实例。主备库归档参数修改如下:
vim /data/dm8/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /data/dm8/arch/DAMENG #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 102400 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DMSERVER1 #实时归档目标实例名,从库这里则为主库实例名
#[ARCHIVE_REALTIME2]
#ARCH_TYPE = REALTIME #实时归档类型
#ARCH_DEST = DMSERVER2 #实时归档目标实例名,从库这里则为主库实例名
dmmal.ini 修改
dmmal.ini 是 MAL 系统的配置文件,各主备库的 dmmal.ini 配置必须完全一致。默认没有 dmmal.ini 文件,需要单独创建并添加以下内容。
vim /data/dm8/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
MAL_TEMP_PATH = /data/dm8/data/DAMENG/malpath/ #临时文件目录
MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB
MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB
MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩
[MAL_INST1]
MAL_INST_NAME = DMSERVER #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 10.0.10.249 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 15336 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.216.249 #实例的对外服务 IP 地址
MAL_INST_PORT = 15236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT = 15436 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 15536 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMSERVER1
MAL_HOST = 10.0.10.250
MAL_PORT = 15336
MAL_INST_HOST = 192.168.216.250
MAL_INST_PORT = 15236
MAL_DW_PORT = 15436
MAL_INST_DW_PORT = 15536
注:若同一网络存在多套主备集群,除实例的对外服务端口5236可以一样,其他端口和 OGUID 要都不一致。如存在多个实例,往下添加即可。
dmwatcher.ini 修改
dmwatcher.ini 是守护进程配置文件,除了异步主备,其他类型的主备必须配置为全局守护类型。在主备两个节点都创建并添加以下内容。
vim /data/dm8/data/DAMENG/dmwatcher.ini [GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 20 #远程守护进程故障认定时间 INST_ERROR_TIME = 20 #本地实例故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_OGUID = 249250 #守护系统唯一 OGUID 值 INST_INI = /data/dm8/data/DAMENG/dm.ini #dm.ini 文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /data/dm8/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
注册服务
使用 root 用户在主备库执行。
-- root 用户主库执行 [root@~]# /data/dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /data/dm8/data/DAMENG/dm.ini -m mount [root@~]# /data/dm8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /data/dm8/data/DAMENG/dmwatcher.ini -- root 用户从库执行 [root@~]# /data/dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMSERVER1 -dm_ini /data/dm8/data/DAMENG/dm.ini -m mount [root@~]# /data/dm8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /data/dm8/data/DAMENG/dmwatcher.ini [root@~]# cd /usr/lib/systemd/system/ [root@ system]# ll Dm* -rw-r--r-- 1 root root 410 10月 8 16:51 DmAPService.service -rw-r--r-- 1 root root 429 10月 9 14:56 DmServiceDMSERVER1.service -rw-r--r-- 1 root root 451 10月 9 14:57 DmWatcherServiceWatcher.service --若要删除自启,可利用如下方式: --[root@~]# /data/dm8/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceDMSERVER --[root@~]# /data/dm8/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
配置确认监视器
在第三台机器 192.168.216.251 上配置确认监视器,存放确认监视器配置文件(确认监视器也包含监控模式的功能),并注册后台自启服务。
由于主库和实时备库的守护进程配置为自动切换模式,因此这里选择配置确认监视器。和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知实时备库接管为新的主库,具有自动故障处理的功能。故障自动切换模式下,必须配置确认监视器,且确认监视器最多只能配置一个。建议单独一个服务器部署监视器,此服务器要求稳定;如和集群放到同一服务器上,建议放到备库。
[dmdba@db3~]$ vim /data/dm8/dmdbms/bin/dmmonitor.ini MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = /data/dm8/dmdbms/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB [GRP1] MON_INST_OGUID = 249250 #组 GRP1 的唯一 OGUID 值 MON_DW_IP = 10.0.10.249:15436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT MON_DW_IP = 10.0.10.250:15436
确认监视器注册服务
/data/dm8/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /data/dm8/dmdbms/bin/dmmonitor.ini
非确认监视器无需注册服务。
非确认监视器
配置非确认监视器:主备集群各节点的 bin 目录中,存放非确认监视器配置文件。
在配置监视器时,一般配置好确认监视器后,建议再配置一个非确认监视器的配置文件,在主备发生切换时,可以通过前台的方式启动非确认监视器进行手动切换。非确认监视器是通过将监视器配置文件中 MON_DW_CONFIRM 参数值修改为 0 来实现,示例如下:
--在各个节点的 bin 目录中配置非确认监视器 [dmdba@db1~]$ vim /data/dm8/dmdbms/bin/dmmonitor_manual.ini MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = /data/dm8/dmdbms/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB [GRP1] MON_INST_OGUID = 249250 #组 GRP1 的唯一 OGUID 值 MON_DW_IP = 10.0.10.249:15436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT MON_DW_IP = 10.0.10.250:15436
监视器的使用
监视器常用命令
命令 | 含义 |
---|---|
list | 查看守护进程的配置信息 |
show global info | 查看所有实例组的信息 |
tip | 查看系统当前运行状态 |
login | 登录监视器 |
logout | 退出登录 |
choose switchover GRP1 | 主机正常:查看可切换为主机的实例列表 |
switchover GRP1.实例名 | 主机正常:使用指定组的指定实例,切换为主机 |
choose takeover GRP1 | 主机故障:查看可切换为主机的实例列表 |
takeover GRP1.实例名 | 主机故障:使用指定组的指定实例,切换为主机 |
choose takeover force GRP1 | 强制切换:查看可切换为主机的实例列表 |
takeover force GRP1.实例名 | 强制切换:使用指定组的指定实例,切换为主机 |
对于在生产环境中配置有确认监视器时,主备只是发生了切换的情况下,再想将主备切换回去时,只需要启动非确认监视器执行切换命令即可。
启动服务及查看信息
启动主备库并修改数据库模式。启动守护进程及监视器进程。
启动数据库并修改参数
##主库机器
[dmdba@db1~]$ /data/dm8/dmdbms/bin/DmServiceDMSERVER start
[dmdba@db1~]$ /data/dm8/dmdbms/bin/disql /:15236 as sysdba
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(249250);
SQL> ALTER DATABASE PRIMARY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
##备库机器
[dmdba@db2~]$ /data/dm8/dmdbms/bin/DmServiceDMSERVER1 start
[dmdba@db2~]$ /data/dm8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.216.250:15236
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(249250);
SQL> ALTER DATABASE STANDBY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
启动守护进程
启动顺序:实例、守护、监控器
##主备库机器
[dmdba@~]$ /data/dm8/dmdbms/bin/DmWatcherServiceWatcher start
--检查进程
ps -ef|grep -i dms|grep -v grep
ps -ef|grep -i dmw|grep -v grep
启动监视器
##后台启动
[dmdba@db3~]$ /data/dm8/dmdbms/bin/DmMonitorServiceMonitor start
##前台启动
[dmdba@db3~]$ /data/dm8/dmdbms/bin/dmmonitor /data/dm8/dmdbms/bin/dmmonitor.ini
## 启动非确认监视器,用来前台查看集群状态
[dmdba@db3~]$ /data/dm8/dmdbms/bin/dmmonitor /data/dm8/dmdbms/bin/dmmonitor_manual.ini
启停集群
##启动
##主/备库机器
[dmdba@~]$ /data/dm8/dmdbms/bin/DmWatcherServiceWatcher start
##停止
##主/备库机器
[dmdba@~]$ /data/dm8/dmdbms/bin/DmWatcherServiceWatcher stop
##主库 机器
[dmdba@db1~]$ /data/dm8/dmdbms/bin/DmServiceDMSERVER stop
##备库机器
[dmdba@db2~]$ /data/dm8/dmdbms/bin/DmServiceDMSERVER1 stop
检查主备集群状态
通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态、以及主备库数据同步情况等信息。同时,监视器 (dmmonitor) 还提供了一系列命令来管理数据守护系统,监视器建议配置在独立于主备所在机器之外的第三台机器上,需要配置 dmmonitor.ini。在数据库安装目录下的 bin 目录下输入以下命令即可启动监视器。
[dmdba@db3 bin]$ cd /data/dm8/dmdbms/bin
[dmdba@db3 bin]$ ./dmmonitor dmmonitor.ini
[monitor] 2024-10-09 17:22:28: DMMONITOR[4.0] V8
[monitor] 2024-10-09 17:22:29: DMMONITOR[4.0] IS READY.
[monitor] 2024-10-09 17:22:29:
#--------------------------------------------------------------------------------#
GET MONITOR CONNECT INFO FROM DMWATCHER(DMSERVER), THE FIRST LINE IS SELF INFO.
DW_CONN_TIME MON_CONFIRM MID MON_IP MON_VERSION
2024-10-09 17:22:29 TRUE 1010381187 ::ffff:10.0.10.251 DMMONITOR[4.0] V8
#--------------------------------------------------------------------------------#
[monitor] 2024-10-09 17:22:29: 收到守护进程(DMSERVER)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-10-09 17:22:29 OPEN OK DMSERVER OPEN PRIMARY VALID 15 53240 53240
[monitor] 2024-10-09 17:22:29: 收到守护进程(DMSERVER1)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-10-09 17:22:29 OPEN OK DMSERVER1 OPEN STANDBY VALID 15 53240 53240
--监视器集群检查:输入 show 命令。可以查看集群的运行状态,如下所示,
--WSTATUS 显示为 open 表示守护进程处于开启状态,
--INST_OK 为 OK 表示数据库处于正常运行状态,
--ISTATUS 为 open 表示数据库处于开启状态。
show
2024-10-09 17:27:00
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 249250 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.0.10.249 15436 2024-10-09 17:26:59 GLOBAL VALID OPEN DMSERVER OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.216.249 15236 OK DMSERVER OPEN PRIMARY 0 0 REALTIME VALID 6044 53240 6044 53240 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.0.10.250 15436 2024-10-09 17:27:00 GLOBAL VALID OPEN DMSERVER1 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.216.250 15236 OK DMSERVER1 OPEN STANDBY 0 0 REALTIME VALID 5989 53240 5989 53240 NONE
DATABASE(DMSERVER1) APPLY INFO FROM (DMSERVER), REDOS_PARALLEL_NUM (1), WAIT_APPLY[FALSE]:
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[6044, 6044, 6044], (RLSN, SLSN, KLSN)[53240, 53240, 53240], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (53240)
主备测试
登录主库创建表插入数据,备库查看。
conn test/JiekeXu_DM8:15236
select table_name from user_tables;
TABLE_NAME
----------
CITY
T_OBJ
create table city_1009 as select * from city;
insert into test.city_1009 values('GS','甘肃',7);
commit;
--备库查看
SQL> insert into test.city_1009 values('GS','甘肃',7);
insert into test.city_1009 values('GS','甘肃',7);
[-710]:试图在STANDBY模式下,修改用户库.
已用时间: 2.582(毫秒). 执行号:0.
SQL> select * from test.city_1009;
行号 CITY_ID CITY_NAME REGION_ID
---------- ------- --------- -----------
1 BJ 北京 1
2 SJZ 石家庄 1
3 SH 上海 2
4 NJ 南京 2
5 GZ 广州 3
6 HK 海口 3
7 WH 武汉 4
8 CS 长沙 4
9 SY 沈阳 5
10 XA 西安 6
11 CD 成都 7
行号 CITY_ID CITY_NAME REGION_ID
---------- ------- --------- -----------
12 GS 甘肃 7
12 rows got
dm_svc.conf 配置
dm_svc.conf 是使用达梦数据库时非常重要的配置文件,它包含了达梦各接口和客户端工具所需要配置的一些参数。通过它可以实现达梦各种集群的读写分离和均衡负载,且必须和接口/客户端工具位于同一台机器上才能生效。
初始 dm_svc.conf 文件由达梦安装时自动生成。在 Linux 平台位于 /etc/ 下,但在某些情况下,所使用的用户没有读取和修改 /etc 目录下文件的权限,这时就需要将 dm_svc.conf 文件放到有权限的目录下,并修改 url 连接串的内容。以 Linux 平台,文件放在 /home/dmdba 目录下为例:
- 在 /home/dmdba 目录下,编辑 dm_svc.conf 文件。
TIME_ZONE=(480) LANGUAGE=(cn) dm=(192.168.216.249:15236) [dm] KEYWORDS=(需要排除的关键字)
- 修改连接串
jdbc:dm://dm?dmsvcconf=/home/dmdba/dm_svc.conf
主备集群配置示例:
##以#开头的行表示是注释#
##全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DMHA=(192.168.216.249:15236,192.168.216.250:15236)
##服务配置
[DMHA]
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
LOGIN_MODE=(1)
jdbc:dm://DMHA
dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,可配置所有的配置项,服务配置区在后,以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区(服务配置区的相同配置项会覆盖全局配置区对应的配置项)。
参数注释:
- 服务名
用于连接数据库的服务名,参数值格式为:
服务名=(IP[:PORT],IP[:PORT],…)。
-
TIME_ZONE
指明客户端的默认时区设置范围为:-779~840M,如 60 对应 +1:00 时区,+480 对于东八区,如果不做配置默认是操作系统的时区。 -
KEYWORDS
该参数可以用于屏蔽数据库关键字,如果数据库关键字在 SQL 语句中以单词的形式存在,无法识别需要加上双引号或者可以通过该参数来屏蔽关键字,建议大小写都写入参数中。
例如:KEYWORDS=(versions,VERSIONS,type,TYPE)。
-
LOGIN_MODE
指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。 -
SWITCH_TIMES
表示以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围 1~9223372036854775807,默认值为 1,可以设置至少 3 次用来避免由于网卡的波动,造成数据库连接测频繁切换。 -
SWITCH_INTERVAL
表示在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。与参数 SWITCH_TIMES、EP_SELECTOR 配合使用,EP_SELECTOR 设置为 0,等待 SWITCH_INTERVAL 后会切换尝试连接下一个服务器,EP_SELECTOR 设置为 1,等待 SWITCH_INTERVAL 后会继续尝试连接该服务器,直到 SWITCH_TIMES 次再切换下一个服务器。 -
EP_SELECTOR
表示连接数据库时采用何种模型建立连接。0:依次选取列表中的不同节点建立连接,使得所有连接均匀地分布在各个节点上;1:选择列表中最前面的节点建立连接,只有当前节点无法建立连接时才会选择下一个节点进行连接。 -
AUTO_RECONNECT
表示连接发生异常或一些特殊场景下连接处理策略。0:关闭连接,1:当连接发生异常时自动切换到其他库,无论切换成功还是失败都会抛一个 SQLEXCEPTION,用于通知上层应用进行事务执行失败时的相关处理;2 配合 EP_SELECTOR=1 使用,如果服务名列表前面的节点恢复了,将当前连接切换到前面的节点上,可以根据应用的实际要求设定。
主备守护集群 switchover 手动切换
登录非确认监视器
/data/dm8/dmdbms/bin/dmmonitor /data/dm8/dmdbms/bin/dmmonitor_manual.ini
检查主备集群状态
show global info
-- 登录监视器 login 用户名:SYSDBA 密码: [monitor] 2024-11-21 17:13:27: 登录监视器成功!
开始切换
-- 当前主库是 DMSERVER,备库是 DMSERVER1,执行下面命令,将主库切换到 DMSERVER1
switchover GRP1.DMSERVER1
###切换时间不超过半分钟,切换后,查看主备状态,主库已切换到 DMSERVER1 实例
[monitor] 2024-11-21 17:26:32: 开始切换实例DMSERVER1
[monitor] 2024-11-21 17:26:32: 通知守护进程DMSERVER切换SWITCHOVER状态
[monitor] 2024-11-21 17:26:32: 守护进程(DMSERVER)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2024-11-21 17:26:33: 切换守护进程DMSERVER为SWITCHOVER状态成功
[monitor] 2024-11-21 17:26:33: 通知守护进程DMSERVER1切换SWITCHOVER状态
[monitor] 2024-11-21 17:26:34: 守护进程(DMSERVER1)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2024-11-21 17:26:35: 切换守护进程DMSERVER1为SWITCHOVER状态成功
[monitor] 2024-11-21 17:26:35: 实例DMSERVER开始执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句
[monitor] 2024-11-21 17:26:35: 实例DMSERVER执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句成功
[monitor] 2024-11-21 17:26:35: 实例DMSERVER1开始执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句
[monitor] 2024-11-21 17:26:35: 实例DMSERVER1执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句成功
[monitor] 2024-11-21 17:26:35: 实例DMSERVER开始执行ALTER DATABASE MOUNT语句
[monitor] 2024-11-21 17:26:35: 实例DMSERVER执行ALTER DATABASE MOUNT语句成功
[monitor] 2024-11-21 17:26:35: 实例DMSERVER1开始执行SP_APPLY_KEEP_PKG()语句
[monitor] 2024-11-21 17:26:35: 实例DMSERVER1执行SP_APPLY_KEEP_PKG()语句成功
[monitor] 2024-11-21 17:26:35: 实例DMSERVER1开始执行ALTER DATABASE MOUNT语句
[monitor] 2024-11-21 17:26:35: 实例DMSERVER1执行ALTER DATABASE MOUNT语句成功
[monitor] 2024-11-21 17:26:35: 实例DMSERVER开始执行ALTER DATABASE STANDBY语句
[monitor] 2024-11-21 17:26:35: 实例DMSERVER执行ALTER DATABASE STANDBY语句成功
[monitor] 2024-11-21 17:26:35: 实例DMSERVER1开始执行ALTER DATABASE PRIMARY语句
[monitor] 2024-11-21 17:26:36: 实例DMSERVER1执行ALTER DATABASE PRIMARY语句成功
[monitor] 2024-11-21 17:26:36: 通知实例DMSERVER1修改所有归档状态无效
[monitor] 2024-11-21 17:26:36: 修改所有实例归档为无效状态成功
[monitor] 2024-11-21 17:26:36: 实例DMSERVER开始执行ALTER DATABASE OPEN FORCE语句
[monitor] 2024-11-21 17:26:36: 实例DMSERVER执行ALTER DATABASE OPEN FORCE语句成功
[monitor] 2024-11-21 17:26:36: 实例DMSERVER1开始执行ALTER DATABASE OPEN FORCE语句
[monitor] 2024-11-21 17:26:36: 实例DMSERVER1执行ALTER DATABASE OPEN FORCE语句成功
[monitor] 2024-11-21 17:26:36: 实例DMSERVER开始执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句
[monitor] 2024-11-21 17:26:36: 实例DMSERVER执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句成功
[monitor] 2024-11-21 17:26:36: 实例DMSERVER1开始执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句
[monitor] 2024-11-21 17:26:36: 实例DMSERVER1执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句成功
[monitor] 2024-11-21 17:26:36: 通知守护进程DMSERVER切换OPEN状态
[monitor] 2024-11-21 17:26:36: 守护进程(DMSERVER)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2024-11-21 17:26:37: 切换守护进程DMSERVER为OPEN状态成功
[monitor] 2024-11-21 17:26:37: 通知守护进程DMSERVER1切换OPEN状态
[monitor] 2024-11-21 17:26:38: 守护进程(DMSERVER1)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2024-11-21 17:26:38: 切换守护进程DMSERVER1为OPEN状态成功
[monitor] 2024-11-21 17:26:38: 通知组(GRP1)的守护进程执行清理操作
[monitor] 2024-11-21 17:26:39: 清理守护进程(DMSERVER)请求成功
[monitor] 2024-11-21 17:26:39: 清理守护进程(DMSERVER1)请求成功
[monitor] 2024-11-21 17:26:39: 实例DMSERVER1切换成功
2024-11-21 17:26:39
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 249250 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.0.10.250 15436 2024-11-21 17:26:39 GLOBAL VALID OPEN DMSERVER1 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.216.250 15236 OK DMSERVER1 OPEN PRIMARY 0 0 REALTIME VALID 7303 66322 7303 66322 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.0.10.249 15436 2024-11-21 17:26:39 GLOBAL VALID OPEN DMSERVER OK 1 1 OPEN STANDBY DSC_OPEN REALTIME INVALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.216.249 15236 OK DMSERVER OPEN STANDBY 0 0 REALTIME INVALID 7302 66146 7302 66146 NONE
DATABASE(DMSERVER) APPLY INFO FROM (DMSERVER1), REDOS_PARALLEL_NUM (1), WAIT_APPLY[FALSE]:
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[7302, 7302, 7302], (RLSN, SLSN, KLSN)[66146, 66146, 66146], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (66146)
#================================================================================#
[monitor] 2024-11-21 17:26:40: 守护进程(DMSERVER1)状态切换 [OPEN-->RECOVERY]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-11-21 17:26:40 RECOVERY OK DMSERVER1 OPEN PRIMARY VALID 16 66322 66322
[monitor] 2024-11-21 17:26:44: 守护进程(DMSERVER1)状态切换 [RECOVERY-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2024-11-21 17:26:44 OPEN OK DMSERVER1 OPEN PRIMARY VALID 16 66322 66322
show global info
2024-11-21 17:27:59
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 249250 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.0.10.250 15436 2024-11-21 17:27:59 GLOBAL VALID OPEN DMSERVER1 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.0.10.249 15436 2024-11-21 17:27:59 GLOBAL VALID OPEN DMSERVER OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
#================================================================================#
如上可以看到,主从切换仅需 12 秒便可以完成,通过服务名连接的会话也没有断开,自动切换到另一个实例,查询实例已经自动变成 DMSERVER1 了。
[dmdba@dba1-249:~]$ disql SYSDBA@DMHA
密码:
服务器[192.168.216.249:15236]:处于主库打开状态
登录使用时间 : 180.335(ms)
密钥过期时间:2024-12-25
disql V8
17:06:44 SYSDBA@DAMENG:15236 SQL> select name,instance_name,status$,mode$ from v$instance;
NAME INSTANCE_NAME STATUS$ MODE$
-------- ------------- ------- -------
DMSERVER DMSERVER OPEN PRIMARY
已用时间: 1.556(毫秒). 执行号:55951204.
17:26:54 SYSDBA@DAMENG:15236 SQL> select name,instance_name,status$,mode$ from v$instance;
服务器[192.168.216.250:15236]:处于主库打开状态
已连接
NAME INSTANCE_NAME STATUS$ MODE$
--------- ------------- ------- -------
DMSERVER1 DMSERVER1 OPEN PRIMARY
已用时间: 6.657(毫秒). 执行号:900.
全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————