DM 数据守护(DM Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
DM 数据守护系统结构主要由主库、备库、Redo 日志、Redo 日志传输、Redo 日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。
集群规划
| 主库 | 实时备库 | |
|---|---|---|
| 业务 IP / 心跳 IP | 192.168.244.140 | 192.168.244.141 |
| 实例名 | DW1_01 | DW1_02 |
| 实例端口 | 5236 | 5236 |
| MAL 端口 | 5336 | 5336 |
| MAL 守护进程端口(监视器连接用) | 5436 | 5436 |
| 守护进程端口(守护实例发指令用) | 5536 | 5536 |
| INST_OGUID | 9527 | 9527 |
| 守护组 | GDW1 | GDW1 |
| 安装路径 | /dm/dmdbms | /dm/dmdbms |
| 实例路径 | /dm/data/data | /dm/data/data |
| 归档路径 | /dm/data/arch | /dm/data/arch |
| 归档上限 | 1024 | 1024 |
| 监视器 | 192.168.244.142 |
主库、备库、监视器都需要安装DM8数据库软件
dm8dw01
[dmdba@dm8dw01 bin]$ /dm/dmdbms/bin/dminit PATH=/dmdata/data INSTANCE_NAME=DW1_01 PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
前台启动一下:
./dmserver /dmdata/data/DAMENG/dm.ini
dm8dw02
[dmdba@dm8dw02 ~]$ /dm/dmdbms/bin/dminit PATH=/dmdata/data INSTANCE_NAME=DW1_02 PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
前台启动一下:
./dmserver /dmdata/data/DAMENG/dm.ini
dm8dw01
脱机备份DW1_01数据库
/dm/dmdbms/bin/dmrman CTLSTMT="BACKUP DATABASE '/dmdata/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dmdata/dmbak/BACKUP_FILE_20280806'"
把BACKUP_FILE_20280806发到dm8dw02备库去,然后备份还原:
[dmdba@dm8dw01 dmbak]$ scp -r /dmdata/dmbak/BACKUP_FILE_20280806/ dmdba@192.168.244.141:/dmdata/dmbak/
在dm8dw02上恢复数据库
/dm/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE_20280806'"
/dm/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE_20280806'"
/dm/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
检查数据一致性
这里只能前台启动,(./dmserver /dmdata/data/DAMENG/dm.ini mount)因为数据守护集群是通过收发redo日志,重演redo日志来实现的,而后台启动会生成redo日志,造成主库和备库不是同一版本
dm8dw01和dm8dw02
[dmdba@dm8dw01 DAMENG]$ vim /dmdata/data/DAMENG/dm.ini
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
dm8dw01
[dmdba@dm8dw01 DAMENG]$ vim /dmdata/data/DAMENG/dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = DW1_02 --填写备库实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch/
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
dm8dw02
[dmdba@dm8dw02 DAMENG]$ vim /dmdata/data/DAMENG/dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = DW1_01 --填写主库实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch/
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 1024
dm8dw01和dm8dw02
vim /dmdata/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = DW1_01
MAL_HOST = 192.168.244.140
MAL_PORT = 5336
MAL_INST_HOST = 192.168.244.140
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
[MAL_INST2]
MAL_INST_NAME = DW1_02
MAL_HOST = 192.168.244.141
MAL_PORT = 5336
MAL_INST_HOST = 192.168.244.141
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
dm8dw01和dm8dw02
vim /dmdata/data/DAMENG/dmwatcher.ini
[GDW1]
DW_TYPE = GLOBAL
DW_MODE = AUTO --故障自动切换模式
DW_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 20
INST_OGUID = 9527
INST_INI = /dmdata/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm/dmdbms/bin/DmServiceDW start
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
dm8dw03
vim /dm/dmdbms/dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /dm/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 1024
[GDW1]
MON_INST_OGUID = 9527
MON_DW_IP = 192.168.244.140:5436
MON_DW_IP = 192.168.244.141:5436
dm8dw01
cd /dm/dmdbms/bin
./dmserver /dmdata/data/DAMENG/dm.ini mount
./disql sysdba/Dameng123
sp_set_oguid(9527);
alter database primary; --主库
Dm8dw02
cd /dm/dmdbms/bin
./dmserver /dmdata/data/DAMENG/dm.ini mount
./disql sysdba/Dameng123
sp_set_oguid(9527);
alter database standby; --备库
dm8dw01和dm8dw02
[dmdba@dm8dw01 bin]$ cd /dm/dmdbms/bin
[dmdba@dm8dw01 bin]$ ./dmwatcher /dmdata/data/DAMENG/dmwatcher.ini
dmwatcher V8
DMWATCHER[4.0] IS READY
[dmdba@dm8dw02 bin]$ cd /dm/dmdbms/bin
[dmdba@dm8dw01 bin]$ ./dmwatcher /dmdata/data/DAMENG/dmwatcher.ini
dmwatcher V8
DMWATCHER[4.0] IS READY
dm8dw03
[dmdba@dm8dw03 bin]$ cd /dm/dmdbms/bin
[dmdba@dm8dw03 bin]$ ./dmmonitor /dm/dmdbms/dmmonitor.ini
dm8dw01
[root@dm8dw01 ~]# cd /dm/dmdbms/script/root/
[root@dm8dw01 root]# ./dm_service_installer.sh -t dmserver -p dw1_01 -dm_ini /dmdata/data/DAMENG/dm.ini
[root@dm8dw01 root]# ./dm_service_installer.sh -t dmwatcher -p dw1_01 -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
dm8dw02
[root@dm8dw02 ~]# cd /dm/dmdbms/script/root/
[root@dm8dw01 root]# ./dm_service_installer.sh -t dmserver -p dw1_02 -dm_ini /dmdata/data/DAMENG/dm.ini
[root@dm8dw01 root]# ./dm_service_installer.sh -t dmwatcher -p dw1_02 -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
dm8dw03
[root@dm8dw03 ~]# cd /dm/dmdbms/script/root/
[root@dm8dw03 root]# ./dm_service_installer.sh -t dmmonitor -p GDW1 -monitor_ini /dm/dmdbms/dmmonitor.ini
在主库上创建test表,并插入几条数据,提交,然后在备库上查询test,可以获取对应的数据。
停止监听器->停止守护进程(先备后主)->停止数据库实例(先主后备)
[dmdba@dm8dw03 bin]$ ./DmMonitorServiceGDW1 stop
[dmdba@dm8dw02 bin]$ ./DmWatcherServicedw1_02 stop
[dmdba@dm8dw01 bin]$ ./DmWatcherServicedw1_01 stop
[dmdba@dm8dw01 bin]$ ./DmServicedw1_01 stop
[dmdba@dm8dw02 bin]$ ./DmServicedw1_02 stop
启动数据库实例(主备没有顺序要求)->启动守护进程(先主后备)->启动监听器
[dmdba@dm8dw01 bin]$ ./DmServicedw1_01 start
[dmdba@dm8dw02 bin]$ ./DmServicedw1_02 start
[dmdba@dm8dw01 bin]$ ./DmWatcherServicedw1_01 start
[dmdba@dm8dw02 bin]$ ./DmWatcherServicedw1_02 start
[dmdba@dm8dw03 bin]$ ./DmMonitorServiceGDW1 start
文章
阅读量
获赞
