达梦数据库主备集群(数据守护)搭建
概述
DM 数据守护(Data Watch)提供数据库的高可用性和读写分离机制:主库(生产库)产生的 Redo日志传输到备库,备库接收并重新应用Redo日志,从而实现备库与主库的数据同步。DM数据守护的功能是监控数据库状态,获取主、备库数据同步情况,切换主备库为 Redo 日志传输与重演过程中出现的各种异常情况提供解决方案。
实时主备
实时主备由一个主库以及一个或者多个配置了实时(Realtime)归档的备库组成,其主要目的是保障数据库可用性,提高数据安全性。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。主库修改数据产生的Redo日志,通过实时归档机制,在写入联机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。当主库出现故障时,备库在将所有Redo日志重演结束后,就可以切换为主库对外提供数据库服务
环境搭建步骤:
主库: 139.59.177.10
备库: 139.59.177.12
监控器: 139.59.177.14
数据库名 实例名 PORT_NUM MAL_INST_DW_PORT MAL_HOST MAL_PORT MAL_DW_PORT
DMDW GRP1_RT_01 5246 45101 139.59.177.10 55101 65101
DMDW GRP1_RT_03 5246 45121 139.59.177.12 55121 65121
1. 主备库安装CentOS 7.6以及DM8软件
2. 主库: 使用dbca.sh创建数据库(db_name:DMDW, instance_name: GRP1_RT_01, port: 5246)
3. 启动主库
4. 确认主库可以访问: disql sysdba/dameng123:5246
5. 关闭实例准备冷备份:
DmServiceGRP1_RT_01 stop
创建 /dm8/backup 目录
dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/DMDW/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/backup/'"
6. scp -r BACKUP_FILE_01 dmdba@/dm8/backup
7. 修改主库$DM_HOME/data/DMDW/dm.ini
INSTANCE_NAME = GRP1_RT_01
PORT_NUM = 5246
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64
8. 添加$DM_HOME/data/DMDW/dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 139.59.177.10
MAL_PORT = 55101
MAL_INST_HOST = 139.59.177.10
MAL_INST_PORT = 5246
MAL_DW_PORT = 65101
MAL_INST_DW_PORT = 45101
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 139.59.177.12
MAL_PORT = 55121
MAL_INST_HOST = 139.59.177.12
MAL_INST_PORT = 5246
MAL_DW_PORT = 65121
MAL_INST_DW_PORT = 45121
9. 添加$DM_HOME/data/DMDW/dmarch.ini - mkdir -p /dm8/arch
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02 --此值为备库的实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
10. 添加$DM_HOME/data/DMDW/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /dm8/data/DMDW/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
11. 启动主库:
./dmserver /dm8/data/DMDW/dm.ini mount
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453331); --主备的数据库uid必须保持一致
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL>alter database primary;
12. 11. 生产库可以注册主库的数据库和watcher服务,登录root
cd /dm8/script/root
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DMDW/dm.ini -p GRP1_RT_01
./dm_service_installer.sh -t dmwatcher -p DMWATCHER -watcher_ini /dm8/data/DMDW/dmwatcher.ini -m mount -p GRP1_RT_01
备库:
1. 安装DM8数据库软件&初始化实例:
dminit path=/dm8/data db_name=DMDW instance_name=GRP1_RT_02 port_num=5246
2. 启动DMAP service
DmAPService start - 注意如果在restore时报不能与dmap服务通信, 需要重启此服务。
3. dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/DMDW/dm.ini' FROM BACKUPSET '/dm8/backup'"
4. dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DMDW/dm.ini' FROM BACKUPSET '/dm8/backup'"
5. dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DMDW/dm.ini' UPDATE DB_MAGIC"
6. 修改备库$DM_HOME/data/DMDW/dm.ini
INSTANCE_NAME = GRP1_RT_02
PORT_NUM = 5246
DW_INACTIVE_INTERVAL = 60
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
RLOG_SEND_APPLY_MON = 64
7. 添加$DM_HOME/data/DMDW/dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 139.59.177.10
MAL_PORT = 55101
MAL_INST_HOST = 139.59.177.10
MAL_INST_PORT = 5246
MAL_DW_PORT = 65101
MAL_INST_DW_PORT = 45101
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 139.59.177.12
MAL_PORT = 55121
MAL_INST_HOST = 139.59.177.12
MAL_INST_PORT = 5246
MAL_DW_PORT = 65121
MAL_INST_DW_PORT = 45121
8. 添加$DM_HOME/data/DMDW/dmarch.ini - mkdir -p /dm8/arch
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01 --此值为主库的实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
9.添加$DM_HOME/data/DMDW/dmwatcher.ini
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /dm8/data/DMDW/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
RLOG_APPLY_THRESHOLD = 0
10. 以 Mount 方式启动备库
./dmserver /dm8/data/DMDW/dm.ini mount
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453331); --与主库的DBUID一致
SQL>alter database standby;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
11. 生产库可以注册备库的数据库和watcher服务,登录root
cd /dm8/script
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DMDW/dm.ini -m mount -p GRP1_RT_02
./dm_service_installer.sh -t dmwatcher -p DMWATCHER -watcher_ini /dm8/data/DMDW/dmwatcher.ini -m mount -p GRP1_RT_02
启动守护进程
1. 主库: ./dmwatcher /dm8/data/DMDW/dmwatcher.ini
2. 备库:./dmwatcher /dm8/data/DMDW/dmwatcher.ini
如果在OS中已经注册守护进程,可以通过systemctl启动。
主库:systemctl start DmWatcherServiceGRP1_RT_01
备库:systemctl start DmWatcherServiceGRP1_RT_02
监视器:
1. 监视器可以运行在独立的服务器,也可以在主库或者备库服务器上运行。 此测试在备库上启动监视器进程。
$DM_HOME/data/DMDW/dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /dm8/data/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 139.59.177.10:65101
MON_DW_IP = 139.59.177.12:65121
2. 启动监视器:
./dmmonitor $DM_HOME/data/DMDW/dmmonitor.ini
此命令窗口为前置, 可以在此输入命令如show查看主库状态。 help查看所有帮助
3. 生产库一般需要注册此服务,登录root
cd /dm8/script/root
./dm_service_installer.sh -t dmmonitor -p DMMONITOR -monitor_ini /dm8/data/dmmonitor.ini
systemctl start DmMonitorServiceDMMONITOR
测试主备数据同步
1. 在主库中执行以下操作, 创建一个用户john,授权后创建表,然后插入测试数据, 查看此操作是否自动复制到备库。
[dmdba@dm01 ~]$ disql sysdba/dameng123:5246
SQL> create user john identified by dameng123;
executed successfully
used time: 46.563(ms). Execute id is 500.
SQL> grant create table to john;
executed successfully
used time: 3.412(ms). Execute id is 501.
SQL> connect john/dameng123:5246
Server[LOCALHOST:5246]:mode is primary, state is open
login used time : 6.001(ms)
SQL> select user();
LINEID USER()
---------- ------
1 JOHN
used time: 2.515(ms). Execute id is 600.
SQL> select sysdate;
LINEID SYSDATE
---------- -------------------
1 2021-05-05 10:08:13
used time: 0.498(ms). Execute id is 601.
SQL> create table t (id int primary key, name varchar(10));
executed successfully
used time: 5.786(ms). Execute id is 602.
SQL> insert into t values (10,'test');
affect rows 1
used time: 0.930(ms). Execute id is 603.
SQL> insert into t values (20,'test');
affect rows 1
used time: 0.355(ms). Execute id is 604.
SQL> commit;
executed successfully
used time: 2.211(ms). Execute id is 605.
2. 登录备库, 确认用户john和表的数据已经成功被复制。
[dmdba@dm02 ~]$ disql sysdba/dameng123:5246
Server[LOCALHOST:5246]:mode is standby, state is open
login used time : 8.167(ms)
disql V8
SQL> select * from john.t;
LINEID ID NAME
---------- ----------- ----
1 10 test
2 20 test
used time: 36.336(ms). Execute id is 0.