达梦数据库

不论是新安装的还是现有的服务修改为主备模式步骤都是一样的。

只有企业版支持集群,这点需要注意。

DM 数据库有标准版、企业版和安全版三个版本,不同版本的功能支持是不同的,可以参见官方 版本说明

除此之外,也可以选择使用版,一年免费期,试用版功能上没有任何限制。

集群模式

达梦有几种集群模式:数据守护与读写分离集群、共享存储集群MPP。后两个浪子没有使用过,本文不讲解,可以自行查阅官方文档。

数据守护与读写分离集群

数据守护集群(Data Watch),DM 数据守护提供多种解决方案,可以配置成实时主备,并且 DSC 也支持配置成数据守护集群。

  • 实时主备由一个主库以及一个或者多个配置了实时(Realtime) 归档的备库组成,其主要目的是保障数据库可用性,提高数据安全性。
  • DMDSC(DM Data Shared Cluster,共享存储集群) 主备与单节点主备功能一致,DMDSC 主备支持 DMDSC 集群和单节点之间互为主备库,一般建议将 DMDSC 集群部署为主库,将单节点部署为备库。

DM 数据守护 (Data Watch) 的实现原理非常简单:将主库(生产库)产生的 REDO 日志传输到备库,备库接收并重新应用 REDO 日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 REDO 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。

DM 数据守护系统主要由主库、备库、REDO 日志、REDO 日志传输、REDO 日志重演、守护进程 (dmwatcher)、监视器 (dmmonitor) 组成。

主库:Primary 模式,提供完整数据库服务的实例,一般来说主库是用来直接支撑应用系统的生产库。
备库:Standby 模式,提供只读数据库服务的实例。根据数据同步情况,备库又可以分为可切换备库和不可切换备库。可切换备库是指,主备库之间数据完全同步,主库发生故障、备库切换为主库后,不会造成任何数据丢失的备库。

守护进程 (dmwatcher) 是数据守护系统的核心工具,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。

监视器 (dmmonitor) 用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。

主备/数据守护集群搭建

主备集群的搭建使用数据守护集群模式,先了解几个组件:

instance:dm 数据库服务
dmwatcher:守护进程,是数 据库实例 和 监视器 之间信息流转的桥梁
dmmonitor:监视器,用来接收守护进程的消息,并向守护进程发送命令;主备切换、备库接管等操作都是通过监视器命令进行

数据库实例与监视器之间没有直接的消息交互;守护进程解析并执行监视器发起的各种命令,并在必要时通知数据库实例执行相应的操作。
DMDSC 集群的自动重启由 dmcss 检测执行,单机的自动重启由守护进程检测执行(手动停止 dm 服务后,如果守护进程在运行,它会帮你拉起服务)。

可以使用 select * from SYS."V$LICENSE" 查询是否支持集群搭建:CLUSTER_TYPE 为 1111。

备份

下文假设 dm 安装在 /home/dmdba/dmdbms 目录下,dm 的用户为 dmdba,数据目录为 /home/dmdba/dmdata.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 主库备份
su - dmdba
mkdir /home/dmdba/dmback
./dmrman CTLSTMT="BACKUP DATABASE '/home/dmdba/dmdata/DAMENG/dm.ini' FULL TO FULL_BACKUP_FILE BACKUPSET '/home/dmdba/dmback'"

# 传输到备库
scp -r /home/dmdba/dmback 备库:/home/dmdba/

su - dmdba
cd /home/dmdba/dmdbms/bin
# 备库恢复
./dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/home/dmdba/dmback'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/home/dmdba/dmback'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"

DB_MAGIC 是达梦数据库中的魔数,所以可以直接使用,具体信息可以问问搜索引擎。

主库配置

vim /home/dmdba/dmdata/DAMENG/dm.ini,修改以下几项内容:

dm.ini
1
2
3
4
5
6
7
8
# 实例名称,默认是 DMSERVER,安装时可以指定,这里可以修改
INSTANCE_NAME = DM_MASTER
# 如果使用的是默认值,可以不修改
PORT_NUM = 5236
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例信息 模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 # 不允许备库OFFLINE表空间
MAL_INI = 1 # 开启 MAL 系统
ARCH_INI = 1 # 开启归档

vi /home/dmdba/dmdata/DAMENG/dmmal.ini,备库配置和这个保持一致。

dmmal.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MAL_CHECK_INTERVAL = 5      # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 # 判定MAL链路断开的时间

# 如果是多个节点,就编写多个
[MAL_INST1] # 每个实例信息
MAL_INST_NAME = DM_MASTER # 实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.0.0.1 # MAL 系统监听 TCP 连接的IP地址
MAL_PORT = 6236 # MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.0.0.1 # dm 服务的连接 ip
MAL_INST_PORT = 5236 # dm 服务的连接端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 7236 # 实例本地的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 8236 # 实例监听守护进程TCP连接的端口

[MAL_INST2]
MAL_INST_NAME = DM_S1
MAL_HOST = 10.0.0.2
MAL_PORT = 6236
MAL_INST_HOST = 10.0.0.2
MAL_INST_PORT = 5236
MAL_DW_PORT = 7236
MAL_INST_DW_PORT = 8236

vi /home/dmdba/dmdata/DAMENG/dmarch.ini

dmarch.ini
1
2
3
4
5
6
7
8
9
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档
ARCH_DEST = DM_S1 # 归档目标实例名,这里填写为备机

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL # 本地归档类型
ARCH_DEST = /home/dmdba/dmdata/DAMENG/dmarch # 本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~2147483647M

数据守护配置,vi /home/dmdba/dmdata/DAMENG/dmwatcher.ini,组名 GRP1 可以随意命名,但要和备库保持一致。

dmwatcher.ini
1
2
3
4
5
6
7
8
9
10
11
12
[GRP1]
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/DAMENG/dm.ini # 实例的 dm.ini 文件路径
INST_AUTO_RESTART = 1 # 实例是否自动重启
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #自启动命令路径
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭

以 mount 方式启动主库服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmserver /home/dmdba/dmdbms/dmdata/DAMENG/dm.ini mount

# 打开新的会话执行
su - dmdba
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA

# 将手动修改模式的功能打开(如果是普通配置模式,无需执行)
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
# 设置 OGUID
SQL>sp_set_oguid(453331);
# 设置为主库模式
SQL>alter database primary;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

如果是刚安装的新服务,使用 disql 进入 bash 时就是普通模式,不需要更改模式。具体视实际情况而定。

备库配置

vim /home/dmdba/dmdata/DAMENG/dm.ini,修改以下几项内容:

dm.ini
1
2
3
4
5
6
7
8
# 实例名称,默认是 DMSERVER,安装时可以指定,这里可以修改
INSTANCE_NAME = DM_S1
# 如果使用的是默认值,可以不修改
PORT_NUM = 5236
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例信息 模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 # 不允许备库OFFLINE表空间
MAL_INI = 1 # 开启 MAL 系统
ARCH_INI = 1 # 开启归档

vim /home/dmdba/dmdata/DAMENG/dmmal.ini,备库配置和主库保持一致。

dmmal.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MAL_CHECK_INTERVAL = 5      # MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 # 判定MAL链路断开的时间

# 如果是多个节点,就编写多个
[MAL_INST1] # 每个实例信息
MAL_INST_NAME = DM_MASTER # 实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.0.0.1 # MAL 系统监听 TCP 连接的IP地址
MAL_PORT = 6236 # MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.0.0.1 # dm 服务的连接 ip
MAL_INST_PORT = 5236 # dm 服务的连接端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 7236 # 实例本地的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 8236 # 实例监听守护进程TCP连接的端口

[MAL_INST2]
MAL_INST_NAME = DM_S1
MAL_HOST = 10.0.0.2
MAL_PORT = 6236
MAL_INST_HOST = 10.0.0.2
MAL_INST_PORT = 5236
MAL_DW_PORT = 7236
MAL_INST_DW_PORT = 8236

vim /home/dmdba/dmdata/DAMENG/dmarch.ini

dmarch.ini
1
2
3
4
5
6
7
8
9
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME # 实时归档
ARCH_DEST = DM_MASTER # 归档目标实例名,这里填写为主机

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL # 本地归档类型
ARCH_DEST = /home/dmdba/dmdata/DAMENG/dmarch # 本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~2147483647M

数据守护配置,vi /home/dmdba/dmdata/DAMENG/dmwatcher.ini,组名 GRP1 可以随意命名,但要和主库保持一致

dmwatcher.ini
1
2
3
4
5
6
7
8
9
10
11
12
[GRP1]
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/DAMENG/dm.ini # 实例的 dm.ini 文件路径
INST_AUTO_RESTART = 1 # 实例是否自动重启
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver # 启动命令路径
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭

mount 启动备库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmserver /home/dmdba/dmdata/DAMENG/dm.ini mount

su - dmdba
cd /home/dmdba/dmdbms/bin

./disql SYSDBA/SYSDBA
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
# 设置 OGUID
SQL>sp_set_oguid(453331);
# 修改数据库模式
SQL>alter database standby;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

备库启动守护进程

1
2
3
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmwatcher /home/dmdba/dmdbms/dmdata/DAMENG/dmwatcher.ini

监视器配置

监视器一般单独部署(这是官方推荐的做法),也可以和主库/备库部署到一起。本文浪子将监视器和主库配置在同一台服务器上,并且配置故障自动切换,停止主库和主库的守护进程,monitor 可以帮我们把备库切换为主库(monitor 监控向备库的守护进程发送指令,守护进程具体执行)。

一个数据守护集群,只能配置一个确认监视器。如果同时启动多个确认监视器,后启动的确认监视器将报错并自动退出。

vim /home/dmdba/dmdata/DAMENG/dmmonitor.ini

dmmonitor.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
; 确认监视器模式,1 自动切换主备模式(故障转移),0 只监视模式
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dmdbms/log # 监视器日志文件存放路径
MON_LOG_INTERVAL = 60 # 每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 # 每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 ##不限定日志文件总占用空间

; 监视器监视的组名
[GRP1]
MON_INST_OGUID = 453331 # 组GRP1的唯一OGUID值
; 监视器监视的服务,以 ip:port 形式配置,分别对应 dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT
MON_DW_IP = 192.168.159.102:7236
MON_DW_IP = 192.168.159.103:7236

启动监视器

1
2
3
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmmonitor /home/dmdba/dmdata/DAMENG/dmmonitor.ini

注册服务

1
2
3
4
5
6
7
8
9
10
11
su - root
cd /home/dmdba/dmdbms/script/root
# -p 指定服务名称的后缀
./dm_service_installer -t dmserver -dm_ini /home/dmdba/dmdata/DAMENG/dm.ini -p server
./dm_service_installer -t dmwatcher -watcher_ini /home/dmdba/dmdata/DAMENG/dmwatcher.ini -p watcher
./dm_service_installer -t dmmonitor -monitor_ini /home/dmdba/dmdata/DAMENG/dmmonitor.ini -p monitor

# 启动服务
systemctl start DmServiceserver
systemctl start DmWatcherServicewatcher
systemctl start DmMonitorServicemonitor

启动顺序:主实例、备实例、主守护、备守护、监听器
关闭顺序:监听器、备守护、备实例、主守护、主实例

守护进程会在服务实例停止时自动尝试拉起实例,所以需要先停止守护进程,再关闭实例服务,启动正好相反。

应用的 jdbc 连接

vim /etc/dm_svc.conf,编辑完成之后重新启动 dm server

dm_svc.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
TIME_ZONE=(480)
LANGUAGE=(CN)

DMSERVER=(ip:port,ip:port,ip:port...)
LOGIN_MODE=(1)

# 局部参数配置
[DMSERVER]
# 1 只连接主库
# 2 只连接备库
# 3 有限 standby,primary 次之,最后是 normal
# 4优先连接 normal,primary 次之,最后是 standby
LOGIN_MODE=(1)

DMSERVER 这个名字可以随便定义,只需要确保 jdbc 连接使用这个名字。这样当 dm 主备故障自动切换时,应用程序不至于挂掉,也会自动切换。
LOGIN_MODE 为 1 表示只能连接主库。这是主备集群的配置。

注意,如果本地是单机模式,线上是集群模式,本地应用通过 jdbc 连接线上的时候需要注释掉全局的 LOGIN_MODE 选项,否则会出现 “服务器模式不匹配” 的异常。或者也可以使用局部参数配置。


本站由 江湖浪子 使用 Stellar 1.32.2 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。