DM技术交流QQ群:940124259
面对24小时不间断的业务系统,如遇到数据库进程异常退出(某个特殊bug触发)或OOM killer,是否能快速自动恢复服务?为此给我们带来了一些思考,DM8数据库是否有像MySQL数据库的守护进程mysql_safe进程保护机制?只能自己写脚本实时监测数据库状态和进程是否异常,便立即处理?
答案:达梦数据库有提供类似于mysql_safe的数据守护机制,因此完全没必要费心思自己编写脚本。
达梦数据库提供一种数据守护集群的技术,利用dmwatcher守护进程实时监测数据库状态和进程,能够自动拉起dmserver进程并重新打开数据库,继续对外提供服务。虽然数据守护主要运用于数据库守护集群,但它也可以变型运用于单机数据库,为单机库提供实例保护和自我恢复功能。
守护进程核心参数说明dmwatcher.ini
数据库版本:1-2-192-2023.05.17-190669-20033-ENT
数据守护版本:v4.0
[LOCAL_DW_DMLOG] # 守护组标识名称(个人习惯:LOCAL_DW_实例名),不超过16个字符即可。
DW_MODE=MANUAL # 手工模式(单机库)
DW_TYPE=LOCAL # 本地守护(单机库)
INST_ERROR_TIME=10 # 实例故障认定时间阀值
INST_OGUID=20231230 # 目标实例的守护唯一标识
INST_INI=/dmdata/DMLOG/dm.ini # 数据库实例dm.ini路径
INST_STARTUP_CMD=/opt/dmdbms/bin/dmserver # 自拉起命令或服务脚本
INST_AUTO_RESTART=1 # 自动拉起开关
将dmwatcher.ini放在config_path路径下
注意:root账户执行脚本注册。注册脚本位于数据库软件的安装主目录script下。
/opt/dmdbms/script/root/dm_service_installer.sh -t watcher_ini /dmdata/DMLOG/dmwatcher.ini -p DMLOG
systemctl list-unit-files |grep DmW
配置文件统一存放于config_path路径。config_path查看方法见2.2.1
MAL_CHECK_INTERVAL = 5 # 链路检测间隔时间,单位秒。
MAL_CONN_FAIL_INTERVAL = 5 # 链路连接异常认定时长,单位秒。
[MAL_INST0]
mal_inst_name=DMLOG # 实例名,必须于dm.ini文件中参数instance_name取值相同。
mal_inst_host=192.168.1.120 # 对外提供数据库服务的实例地址。
mal_inst_port=5236 # 对外提供数据库服务的实例端口。
mal_inst_dw_port=7236 # 守护进程监测本地实例的监听端口,故障认定、状态检测
mal_host=192.168.1.120 # 内部链路监听地址。
mal_port=8236 # 内部链路监听端口。
mal_dw_port=9236 # 本地守护进程监听端口,远程守护/监听器相互之间通讯端口
注意:
1)如果数据库已经开启归档,可省略本步骤。
2)归档空间上限space_limit设定根据实际情况。
3)如果不想因开启归档占用磁盘空间,可以忽略alter database add archivelog 步骤,它会产生一个大小为0的dmarch.ini配置文件(空内容),则以后数据库是不会实际产生任何归档日志的输出,但归档的开关对于实例守护是关键步骤,动作必做。
比如:我的测试环境单机库dmarch.ini
-- 配置归档和OGUID
SQL> alter database mount ;
SQL> SP_SET_OGUID(20231230);
SQL> alter database add archivelog 'type=local, dest=/dmdata/DMLOG/dmarch,file_size=128, space_limit=10240';
SQL> alter database archivelog ;
SQL> alter database open ;
确认查看数据库是否开启归档,两种方法
1)select arch_mode from v$database;
2)show parameter arch_ini
通常情况下,单机库是没开启mal内部链路。
-- 修改此静态参数后,重启数据库才能生效
SQL> ALTER SYSTEM SET 'MAL_INI' = 1 SPFILE;
SQL> SELECT SF_GET_PARA_VALUE(1,'MAL_INI'), INSTANCE_NAME, OGUID FROM V$INSTANCE;
su - dmdba
DmServiceDMLOG restart
su - dmdba
DmWatcherSerivceDMLOG start
ps -ef | grep dmw
通过kill模拟dmserver异常故障,dmwatcher守护进程会自动拉起dmserver服务。