在两台机器上创建两个实例名不同的数据库实例,为他们注册服务并启动。
进入主库实例的数据目录,编辑 dm.ini 文件。
cd /dmdata/data/DMDWDB
vi dm.ini
确保以下参数被正确设置或添加:
INSTANCE_NAME = GRP1_RT_01
PORT_NUM = 5236
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
· INSTANCE_NAME :数据库实例的唯一名称,用于在集群内部标识自己。 这是集群内通信和配置的关键标识,主库和备库的实例名必须不同。
· PORT_NUM :数据库实例的服务端口,供客户端(如disql)连接使用。 定义了外部连接数据库的入口,与MAL_INST_PORT共同配合,区分外部服务和内部通信。
· ALTER_MODE_STATUS :0表示禁止手动修改数据库的模式、状态和OGUID。 防止人为误操作破坏集群的稳定状态,是集群的标准配置。
· ENABLE_OFFLINE_TS :2表示禁止在备库上执行 OFFLINE 表空间的操作。 强制保证主、备库的表空间结构完全一致,确保数据同步不会因结构差异而失败。
· MAL_INI :1表示开启 MAL 系统(DM Adaptation Layer)。 这是集群节点间进行网络通信的通道,开启后数据库才会读取 dmmal.ini 配置文件。
· ARCH_INI :1表示开启归档功能。 主库需要开启归档功能产生日志,备库需要开启以接收并重演日志,才能实现数据同步。
创建 dmarch.ini 文件。
vi /dmdata/data/DMDWDB/dmarch.ini
写入以下内容,其中 ARCH_DEST 指向备库的实例名:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch/
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
本地归档(LOCAL)负责本地的日志存储和恢复,而实时归档(REALTIME)负责将日志同步给备库,两者共同确保了数据在本地和集群内的安全性与一致性。
这是集群节点间通信的配置文件,主库和备库内容完全相同。
vi /dmdata/data/DMDWDB/dmmal.ini
写入以下内容(注意替换成本地IP):
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.10.123
MAL_PORT = 5336
MAL_INST_HOST = 192.168.10.123
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.10.156
MAL_PORT = 5336
MAL_INST_HOST = 192.168.10.156
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
MAL_CHECK_INTERVAL:全局参数,表示系统主动检查与其他实例的MAL连接是否正常的时间间隔。
MAL_CONN_FAIL_INTERVAL: 判定MAL链路断开的时间。在一次检测中,如果连接尝试超过这一时间没有响应,就会被认定为链路断开。
MAL_INST_NAME :实例名,必须和 dm.ini 配置文件中的 INSTANCE_NAME 参数保持一致。
MAL_HOST :MAL系统监听的IP地址,通常用于实例间的内部通信(心跳网络)。
MAL_PORT :MAL系统监听的端口,与 MAL_HOST 配合,用于MAL层的网络通信。
MAL_INST_HOST :数据库实例对外服务的IP地址,客户端连接时使用的IP。
MAL_INST_PORT :数据库实例对外服务的端口,必须和 dm.ini 中的 PORT_NUM 一致,客户端连接时使用的端口。
MAL_DW_PORT :实例对应的守护进程(dmwatcher)监听端口,用于守护进程之间的通信。
MAL_INST_DW_PORT :实例监听来自守护进程(dmwatcher)连接的端口,是数据库实例和本地守护进程通信的接口。
各端口在集群网络中的作用如下图所示
vi /dmdata/data/DMDWDB/dmwatcher.ini
写入以下内容,注意 INST_OGUID 需要唯一且主备一致:
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 20
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 45331
INST_INI = /dmdata/data/DMDWDB/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
DW_TYPE :守护类型。GLOBAL表示全局守护类型,用于主备或读写分离集群;如果是LOCAL则用于单机或本地守护。
DW_MODE 故障切换模式。AUTO表示自动切换模式,当主库故障时,监视器会自动将备库切换为新主库;MANUAL则为手动切换。
DW_ERROR_TIME :远程守护进程故障认定时间。守护进程检测到与其他节点的守护进程通信中断,持续超过此时间后,会认定远程守护进程或网络出现故障。
INST_ERROR_TIME :本地实例故障认定时间。守护进程检测到本机的数据库实例无响应,持续超过此时间后,会认定本地数据库实例发生故障,并可能触发切换流程。
INST_RECOVER_TIME :实例恢复检查间隔。主库守护进程在启动实例恢复时,每隔60秒检查一次恢复是否完成。
INST_OGUID :集群唯一标识符。同一个数据守护集群中的所有节点,此值必须保持一致,用于确保实例属于同一个集群。
INST_INI :数据库实例配置文件路径。指向该节点数据库实例的 dm.ini 文件,守护进程通过此路径启动或管理数据库。
INST_AUTO_RESTART :实例自动重启开关。1表示开启,当数据库实例异常退出时,守护进程会自动尝试将其重新启动;0则关闭此功能。
INST_STARTUP_CMD :数据库启动命令。守护进程用于自动启动数据库实例的完整命令行路径,一般指向达梦安装目录下的 dmserver 可执行文件
关闭主库服务, 脱机备份主库,使用dmrman工具创建备份集(名称:BACKUP_FILE1;目录:BACKUP_FILE_01),使用 scp 命令将备份目录拷贝到备库机器上,并从备份还原备库(要关闭备库服务)。
# 切换到主库bin目录执行备份
cd /home/dmdba/dmdbms/bin
./dmrman CTLSTMT="BACKUP DATABASE '/dmdata/data/DMDWDB/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dmdata/dmbak/BACKUP_FILE_01'"
#使用 scp 命令将备份目录拷贝到备库机器上。
scp -r /dmdata/dmbak/BACKUP_FILE_01 dmdba@192.168.10.156:/dmdata/dmbak/
切换到备库bin目录下执行以下操作
1、RESTORE DATABASE … FROM BACKUPSET …数据文件从备份集拷贝到备库的数据目录,还原数据文件的物理结构;(还原)
./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DMDWDB/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE_01'"
2、RECOVER DATABASE … FROM BACKUPSET …重做备份集中包含的归档日志,将数据库恢复到备份结束时的一致性状态;(恢复)
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDWDB/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE_01'"
3、RECOVER DATABASE … UPDATE DB_MAGIC重置数据库的日志序列,让它可以作为一个独立的数据库启动。
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DMDWDB/dm.ini' UPDATE DB_MAGIC"
修改备库的配置文件————备库的dmmal.ini 和 dmwatcher.ini 文件与主库完全一样,可以直接用scp命令拷贝;dm.ini文件的INSTANCE_NAME 参数修改为备库的名称(GRP1_RT_02),其余和主库一样;dmarch.ini文件的ARCH_DEST 参数修改指向主库(GRP1_RT_01),其余和主库一样。
cd /home/dmdba/dmdbms/bin
./dmserver /dmdata/data/DMDWDB/dm.ini mount
连接主库:
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA@192.168.100.101:5236
在 disql 工具中执行以下SQL:
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45331);
alter database primary;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
连接备库:
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA@192.168.100.102:5236
在 disql 工具中执行以下SQL:
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(45331);
alter database standby;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
#在主备库的bin目录下执行以下命令
./dmwatcher /dmdata/data/DMDWDB/dmwatcher.ini
*主库上创建表格并插入数据,备库上可以查询到主库中的数据
主库:
CREATE TABLE test_sync (id int, name varchar(50));
INSERT INTO test_sync VALUES (1, 'Sync Test');
备库:
SELECT * FROM test_sync;
上述操作设置了 ip地址为192.168.10.156的数据库(GRP1_RT_01)为主库(primary);ip地址为192.168.10.123(GRP1_RT_02)的数据库为备库(standby)。
修改dmmonitor.ini文件
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] #组名必须与 dmwatcher.ini 中定义的一致
MON_INST_OGUID = 45331
MON_DW_IP = 192.168.10.156:5436
MON_DW_IP = 192.168.10.123:5436
MON_DW_CONFIRM :确认监视器模式:1 表示开启故障自动切换
MON_LOG_PATH :日志存放路径
MON_LOG_INTERVAL :记录系统状态到日志的时间间隔
MON_LOG_FILE_SIZE : 单个日志文件大小,单位MB
MON_LOG_SPACE_LIMIT :日志总空间限制,0表示无限制
MON_INST_OGUID :必须与主备库设置的 OGUID 和 dmwatcher.ini 中的一致
MON_DW_IP :数据库的IP和守护进程端口(主备库都要写)
在bin目录下执行./dmmonitor,可以看到主备库的信息。
监视器输出相关信息。
1、 检测到主库故障,触发自动接管 Check primary instance error, start to auto takeover
2、 通知守护进程切换为接管状态 switch [OPEN->TAKEOVER]
3、 执行接管准备(应用保持包) SP_APPLY_KEEP_PKG()
4、 将备库切换为 MOUNT 状态 ALTER DATABASE MOUNT
5、 将备库切换为 PRIMARY 模式 ALTER DATABASE PRIMARY
6、 强制打开数据库 ALTER DATABASE OPEN FORCE
7、 守护进程切换为 OPEN 状态 switch [TAKEOVER->OPEN]
最终提示keover success表示备库接管成功。
在监视器窗口输入show命令,可以看到ip地址为192.168.10.123的GRP1_RT_02变成了主库。
需要登录监视器监控的数据库的用户验证身份执行手动切换主备集群操作。
login
'用户名'
'密码'
switchover GRP1.GRP1_RT_01
执行show命令看到主备库切换回来了。
文章
阅读量
获赞
