在搭建主备集群时可能会遇到下面的错误,这里分享一下我遇到错误和解决方法,
当然如果你有更好的解决方法,也欢迎分享。或则有描述不对的地方也感谢批评指正,我们共同探讨和学习。
环境信息
系统信息: kylin v10(麒麟V10)
数据库版本:Dameng v8(达梦V8)
CPU架构: X86
许可类型: 开发版
> dmserver dm.ini
file dm.key not found, use default license!
Can not open ini file /var/lib/dameng/DMDB/dmmal.ini!
MAL sys initialization failed!
dmserver startup failed, code = -140 [Can not access INI file]
nsvr_ini_file_read failed, [code: -140]
解决方法:
当数据库配置文件dm.ini
中配置了 MAL_INI = 1 数据库在启动时会在同目录读取dmmal_.ini配置,所以需要将该配置文件
创建处理,按下面格式编写配置文件。如果不配置集群也可以禁用mal服务。
# 修改dm.ini配置,禁用dml服务:即将MAL_INI=1改为0
sed /mal_ini/Is/1/0/ -i .bak dm.ini
# 修改后再次启动数据库即可
主备配置示例
# dmmal.ini
mal_check_interval = 5 # mal链路检测时间间隔
mal_conn_fail_interval = 5 # 判定mal链路断开的时间
[mal_inst1]
mal_inst_name = GRP1_RT_01 # 实例名,和dm.ini中的instance_name一致
mal_host = IP1 # mal系统监听tcp连接的ip地址
mal_port = 5237 # mal系统监听tcp连接的端口
#mal_inst_host = IPA1 # 实例的对外服务ip地址
mal_inst_port = 5236 # 实例的对外服务端口,和dm.ini中的port_num一致
mal_dw_port = 5240 # 实例本地的守护进程监听tcp连接的端口
mal_inst_dw_port= 5238 # 实例监听守护进程tcp连接的端口
[mal_inst2]
mal_inst_name = GRP1_RT_02 # 实例名,和dm.ini中的instance_name一致
mal_host = IP2 # mal系统监听tcp连接的ip地址
mal_port = 5237 # mal系统监听tcp连接的端口
#mal_inst_host = IPA2 # 实例的对外服务ip地址
mal_inst_port = 5236 # 实例的对外服务端口,和dm.ini中的port_num一致
mal_dw_port = 5240 # 实例本地的守护进程监听tcp连接的端口
mal_inst_dw_port= 5238 # 实例监听守护进程tcp连接的端口
配置完后再次启动数据库服务即可
> dmserver dm.ini
file dm.key not found, use default license!
self instance(INSTANCE01) not found in /var/lib/dameng/DMDB/dmmal.ini
Read /var/lib/dameng/DMDB/dmmal.ini error.
MAL sys initialization failed!
dmserver startup failed, code = -9501 [MAL sys has not configured or server is not enterprise version]
nsvr_ini_file_read failed, [code: -9501]
当配置dmmal.ini文件后,再次启动数据库会报错dmmal未配置或不是企业版
这是因为当前数据库实例名没有在dmmal配置文件中进行注册及对应起来,需要重新检查实例名是否填写正确
只需要将对于实例名填写到dmmal.ini,实例名在报错第3行括号内
提示:
请在数据库实例存储目录执行下面命令!
# 将dm.ini配置的实例名填写到dmmal.ini
sed -rn '/INSTANCE_NAME/s/.+=\s(\S+).*/3,\/name\/s\/(name).+\/\\1\\t= \1\//p' dm.ini | sed -rf - -i .bak dmmal.ini
完整的配置示例请参考 错误2 中的 主备配置示例 配置示例
> dmserver dm.ini
file dm.key not found, use default license!
Validate dmarch.ini error, code=-811
dmserver startup failed, code = -811 [Local archive config not exist]
nsvr_ini_file_read failed, [code: -811]
当在dm.ini配置了 ARCH_INI = 1 时,数据库启动时会检查dmarch.ini配置文件,若未配置本地归档或配置不正确,会出报本
地归档配置不存在,可根据自身需求关闭归档或更正配置
禁用本地归档方法
提示:
请在数据库实例存储目录执行下面命令!
# 修改dm.ini配置:当arch_ini配置为1时修改成0
sed /arch_ini/Is/1/0/ -i .bak dm.ini
# 禁用后再次启动数据库则不在检查dmarch.ini配置文件
归档配置示例:
# 若需求配置主备,取消注释并补充缺失值
#[archive_realtime]
#arch_type = realtime # 实时归档类型
#arch_dest = <目标实例名> # 实时归档目标实例名
# 本地归档配置
[archive_local]
arch_type = local # 本地归档类型
arch_dest = <归档存放路径> # 本地归档文件存放路径
arch_file_size = 128 # 单位mb,本地单个归档文件最大值
arch_space_limit = 0 # 单位mb,0表示无限制,范围1024~2147483647m
> dmserver dm.ini
file dm.key not found, use default license!
Instance GRP1_RT_02 cannot find in dmmal.ini
Validate dmarch.ini error, code=-808
dmserver startup failed, code = -808 [Invalid archive config destination]
nsvr_ini_file_read failed, [code: -808]
当配置实时归档时,需要指定目的归档的实例名,并且该实例名需要在dmmal.ini配置文件中存在,否则会报此错误
解决办法,先根据规划检查dmmal.ini配置的实例名是否正确,再依据dmmal.ini内的实例名来更正dmarch.ini配置
配置前请先确认dmmal.ini配置与实际情况一致,也根据情况按照错误3的禁用归档方式进行停用归档。
提示:
请在数据库实例存储目录执行下面命令!
# 运行下面命令将获取到目标实例名列表
grep -oP 'name\s*=\s*\K[A-Z0-9_-]+' dmmal.ini | grep -v $(awk '/INSTANCE_NAME/{print $3}' dm.ini)
# 根据实际情况替换dmarch.ini中的arch_dest值
# 示例命令: sed /arch_dest/Is/错误实例名/目标实例名/ -i dmarch.ini
# 如:报错第3行 `Instance GRP1_RT_02 cannot find in dmmal.ini` 中的 GRP1_RT_02 为错误实例名,
# 运行上面命令打印 INSTANCE02 ,则可执行下面命令
sed /arch_dest/Is/GRP1_RT_02/INSTANCE02/ -i .bak dmarch.ini
# 执行完命令后再次启动数据库服务器即可
disql SYSDBA/Dameng123@dm01.vm.lan. [-70028]:创建SOCKET连接失败. disql V8 用户名:
先检查客户端与服务端的网络,按照下面步骤进行排查,首选在客户端上进行排查。
提示:
请在数据库实例存储目录执行下面命令!
# 在客户端上检查与服务器的网络是否可达
ping dm01.vm.lan -c 4
# 在客户端上检查服务器端口是否可用
telent dm01.vm.lan 5236
在服务器上检查数据库运行情况
# 检查数据库进程是否在运: 若没有则没有运行,重新启动一下数据库就可以了
ps aux | grep dmserver
# 检查数据库端口是否监听: 若没监听则可是数据库还在启动过程中,可以检查一下运行日志,有些情况则是客户端连接时端口和服务器端口不一致导致
sudo netstat -tnlp | grep dmserver
sudo ss -tnlp | grep dmserver
# 检查防火墙是否开启: 若防火墙开启要检查相应端口是否放通,也可关停防火墙
sudo systemd status firewalld.service
sudo firewall-cmd --list-all
# 检查数据库运行实例,确保日志输出`SYSTEM IS READY.`,只有当运行打印该日志,才能确保数据库实例启动成功
> dmserver dm.ini
...运行打印省略...
systables desc init success.
ndct_db_load_info finished, code:0.
nsvr_process_before_open begin.
nsvr_process_before_open success.
SYSTEM IS READY.
# 查看日志文件:根据实际情况调整下列中文,根据数据库启动时间查看是否存在该行日志,若存在才能确定数据库启动完毕。
> grep "SYSTEM IS READY." /数据库安装目录/log/dm_实例名_20250101.log
2025-01-01 00:01:00.554 [INFO] database P0000007536 T0000000000000007536 SYSTEM IS READY.
2025-01-01 00:01:00.554 [INFO] database P0000007536 T0000000000000007536 [for dem]SYSTEM IS READY.
若防火墙拦截,可以关闭防火墙或添加规则解决这个问题
# 禁用并关闭防火墙
sudo systemctl disable --now firewalld.service
# 或者添加放通规则:这里使用默认端口5236
sudo firewall-cmd --add-port=5236/tcp
# 永久规则:重启服务器后也生效
sudo firewall-cmd --add-port=5236/tcp --permanent
> dmserver dm.ini
...省略输出...
DM Database Server 64 V8 03134284294-20241225-255012-20119 startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2025-12-25
Database first startup failed, reinitialize database please!
Floating point exception (core dumped)
当数据库首次启动时若未完全初始化完毕进程被结束,则会发生该错误,若是新环境重新初始化实例就可以了,
如果是已有实例,只能重新通过备份还原方式修复数据库。
> dmserver dm.ini mount
DM Database Server 64 V8 03134284294-20241225-255012-20119 startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2025-12-25
dmserver startup in mount status with not initialized database
当数据库未初始化完成,尝试进入启动mount状态时会报此错误,只需将去除mount参数,启动后再进入mount即可。
文章
阅读量
获赞