达梦数据库
不论是新安装的还是现有的服务修改为主备模式步骤都是一样的。
只有企业版支持集群,这点需要注意。
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.ini1 2 3 4 5 6 7 8
| INSTANCE_NAME = DM_MASTER
PORT_NUM = 5236 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1
|
vi /home/dmdba/dmdata/DAMENG/dmmal.ini,备库配置和这个保持一致。
dmmal.ini1 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_CONN_FAIL_INTERVAL = 5
[MAL_INST1] MAL_INST_NAME = DM_MASTER MAL_HOST = 10.0.0.1 MAL_PORT = 6236 MAL_INST_HOST = 10.0.0.1 MAL_INST_PORT = 5236 MAL_DW_PORT = 7236 MAL_INST_DW_PORT = 8236
[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.ini1 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 ARCH_SPACE_LIMIT = 0
|
数据守护配置,vi /home/dmdba/dmdata/DAMENG/dmwatcher.ini,组名 GRP1 可以随意命名,但要和备库保持一致。
dmwatcher.ini1 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 INST_INI = /home/dmdba/dmdata/DAMENG/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);
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.ini1 2 3 4 5 6 7 8
| INSTANCE_NAME = DM_S1
PORT_NUM = 5236 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 MAL_INI = 1 ARCH_INI = 1
|
vim /home/dmdba/dmdata/DAMENG/dmmal.ini,备库配置和主库保持一致。
dmmal.ini1 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_CONN_FAIL_INTERVAL = 5
[MAL_INST1] MAL_INST_NAME = DM_MASTER MAL_HOST = 10.0.0.1 MAL_PORT = 6236 MAL_INST_HOST = 10.0.0.1 MAL_INST_PORT = 5236 MAL_DW_PORT = 7236 MAL_INST_DW_PORT = 8236
[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.ini1 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 ARCH_SPACE_LIMIT = 0
|
数据守护配置,vi /home/dmdba/dmdata/DAMENG/dmwatcher.ini,组名 GRP1 可以随意命名,但要和主库保持一致
dmwatcher.ini1 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 INST_INI = /home/dmdba/dmdata/DAMENG/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);
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.ini1 2 3 4 5 6 7 8 9 10 11 12 13
| MON_DW_CONFIRM = 1 MON_LOG_PATH = /home/dmdba/dmdbms/log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 32 MON_LOG_SPACE_LIMIT = 0
[GRP1] MON_INST_OGUID = 453331
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
./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.conf1 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 选项,否则会出现 “服务器模式不匹配” 的异常。或者也可以使用局部参数配置。