1.2 端口规划
1.3 存储规划
1.4 数据库初始化参数规划
(略)
su - dmdba
vi .bash_profile
source ~/.bash_profile
#################################################
### Dameng Database Environment Configuration ###
export TMP=/tmp
export TMP_DIR=$TMP
export DM_INSTALL_TMPDIR=$TMP
export DM_HOME=/DMDB/app/DM8
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DM_HOME/bin"
export PATH=$DM_HOME/bin:$DM_HOME/tool:$PATH:$HOME/bin
umask 022
### end ###
4.1 主机DMDB1: 初始化数据库实例 GRP1_RWW_01
dminit PATH=/DMDB/data DB_NAME=DMDB INSTANCE_NAME=GRP1_RWW_01 PAGE_SIZE=16 CHARSET=0 CASE_SENSITIVE=1 LENGTH_IN_CHAR=1 LOG_SIZE=128
[dmdba@DMDB1 ~]$ dminit PATH=/DMDB/data DB_NAME=DMDB INSTANCE_NAME=GRP1_RWW_01 PAGE_SIZE=16 CHARSET=0 CASE_SENSITIVE=1 LENGTH_IN_CHAR=1 LOG_SIZE=128
initdb V8
db version: 0x7000b
License will expire on 2021-06-25
log file path: /DMDB/data/DMDB/DMDB01.log
log file path: /DMDB/data/DMDB/DMDB02.log
write to dir [/DMDB/data/DMDB].
create dm database success. 2020-12-03 11:57:04
[dmdba@DMDB1 ~]$ ls -lh /DMDB/data/DMDB
总用量 800K
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 bak
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 ctl_bak
-rw-r--r-- 1 dmdba dinstall 5.0K 12月 3 11:57 dm.ctl
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 DMDB01.log
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 DMDB02.log
-rw-r--r-- 1 dmdba dinstall 49K 12月 3 11:57 dm.ini
-rw-r--r-- 1 dmdba dinstall 808 12月 3 11:57 dminit20201203115701.log
-rw-r--r-- 1 dmdba dinstall 633 12月 3 11:57 dm_service.prikey
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 HMAIN
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 479 12月 3 11:57 sqllog.ini
-rw-r--r-- 1 dmdba dinstall 10M 12月 3 11:57 SYSTEM.DBF
4.2 主机DMDB2: 初始化数据库实例 GRP1_RWW_02
dminit PATH=/DMDB/data DB_NAME=DMDB INSTANCE_NAME=GRP1_RWW_02 PAGE_SIZE=16 CHARSET=0 CASE_SENSITIVE=1 LENGTH_IN_CHAR=1 LOG_SIZE=128
[dmdba@DMDB2 ~]$ dminit PATH=/DMDB/data DB_NAME=DMDB INSTANCE_NAME=GRP1_RWW_02 PAGE_SIZE=16 CHARSET=0 CASE_SENSITIVE=1 LENGTH_IN_CHAR=1 LOG_SIZE=128
initdb V8
db version: 0x7000b
License will expire on 2021-06-25
log file path: /DMDB/data/DMDB/DMDB01.log
log file path: /DMDB/data/DMDB/DMDB02.log
write to dir [/DMDB/data/DMDB].
create dm database success. 2020-12-03 11:57:03
[dmdba@DMDB2 ~]$ ls -lh /DMDB/data/DMDB
总用量 800K
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 bak
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 ctl_bak
-rw-r--r-- 1 dmdba dinstall 5.0K 12月 3 11:57 dm.ctl
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 DMDB01.log
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 DMDB02.log
-rw-r--r-- 1 dmdba dinstall 49K 12月 3 11:57 dm.ini
-rw-r--r-- 1 dmdba dinstall 808 12月 3 11:57 dminit20201203115700.log
-rw-r--r-- 1 dmdba dinstall 633 12月 3 11:57 dm_service.prikey
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 HMAIN
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 479 12月 3 11:57 sqllog.ini
-rw-r--r-- 1 dmdba dinstall 10M 12月 3 11:57 SYSTEM.DBF
4.3 主机DMDB3: 初始化数据库实例 GRP1_RWW_03
dminit PATH=/DMDB/data DB_NAME=DMDB INSTANCE_NAME=GRP1_RWW_03 PAGE_SIZE=16 CHARSET=0 CASE_SENSITIVE=1 LENGTH_IN_CHAR=1 LOG_SIZE=128
[dmdba@DMDB3 ~]$ dminit PATH=/DMDB/data DB_NAME=DMDB INSTANCE_NAME=GRP1_RWW_03 PAGE_SIZE=16 CHARSET=0 CASE_SENSITIVE=1 LENGTH_IN_CHAR=1 LOG_SIZE=128
initdb V8
db version: 0x7000b
License will expire on 2021-06-25
log file path: /DMDB/data/DMDB/DMDB01.log
log file path: /DMDB/data/DMDB/DMDB02.log
write to dir [/DMDB/data/DMDB].
create dm database success. 2020-12-03 11:57:03
[dmdba@DMDB3 ~]$ ls -lh /DMDB/data/DMDB
总用量 800K
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 bak
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 ctl_bak
-rw-r--r-- 1 dmdba dinstall 5.0K 12月 3 11:57 dm.ctl
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 DMDB01.log
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 DMDB02.log
-rw-r--r-- 1 dmdba dinstall 49K 12月 3 11:57 dm.ini
-rw-r--r-- 1 dmdba dinstall 808 12月 3 11:57 dminit20201203115700.log
-rw-r--r-- 1 dmdba dinstall 633 12月 3 11:57 dm_service.prikey
drwxr-xr-x 2 dmdba dinstall 4.0K 12月 3 11:57 HMAIN
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 128M 12月 3 11:57 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 479 12月 3 11:57 sqllog.ini
-rw-r--r-- 1 dmdba dinstall 10M 12月 3 11:57 SYSTEM.DBF
注:root用户执行脚本注册服务
5.1 主机DMDB1:实例服务名DmServiceGRP1_RWW_01
/DMDB/app/DM8/script/root/dm_service_installer.sh -t dmserver -dm_ini /DMDB/data/DMDB/dm.ini -p GRP1_RWW_01
5.2 主机DMDB2:实例服务名DmServiceGRP1_RWW_02
/DMDB/app/DM8/script/root/dm_service_installer.sh -t dmserver -dm_ini /DMDB/data/DMDB/dm.ini -p GRP1_RWW_02
5.3 主机DMDB3:实例服务名DmServiceGRP1_RWW_03
/DMDB/app/DM8/script/root/dm_service_installer.sh -t dmserver -dm_ini /DMDB/data/DMDB/dm.ini -p GRP1_RWW_03
5.4 测试数据库实例服务
分别在每个主机上启停数据库实例服务,保证无出错。
chkconfig --list | grep ^Dm
service DmServiceGRP1_RWW_01 start
service DmServiceGRP1_RWW_02 start
service DmServiceGRP1_RWW_03 start
ps -fu dmdba
service DmServiceGRP1_RWW_01 stop
service DmServiceGRP1_RWW_02 stop
service DmServiceGRP1_RWW_03 stop
5.5 测试登录数据库
分别在每个主机上本地登录数据库实例,保证无出错。
su - dmdba
disql SYSDBA/SYSDBA
SQL> select name,role$,status$,open_count from v$database;
SQL> select instance_name,host_name,status$,mode$,oguid from v$instance;
6.1 DMDB1主库:脱机备份全库
su - dmdba
service DmServiceGRP1_RWW_01 stop
dmrman CTLSTMT="BACKUP DATABASE '/DMDB/data/DMDB/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/DMDB/backup/BACKUP_FILE_01'"
du -sh /DMDB/backup/BACKUP_FILE_01
6.2 DMDB2/DMDB3备库:脱机还原恢复数据库
su - dmdba
service DmServiceGRP1_RWW_02 stop
service DmServiceGRP1_RWW_03 stop
scp -rp 192.168.0.11:/DMDB/backup/BACKUP_FILE_01 /DMDB/backup
ls -lh /DMDB/backup
dmrman CTLSTMT="RESTORE DATABASE '/DMDB/data/DMDB/dm.ini' FROM BACKUPSET '/DMDB/backup/BACKUP_FILE_01'"
dmrman CTLSTMT="RECOVER DATABASE '/DMDB/data/DMDB/dm.ini' FROM BACKUPSET '/DMDB/backup/BACKUP_FILE_01'"
dmrman CTLSTMT="RECOVER DATABASE '/DMDB/data/DMDB/dm.ini' UPDATE DB_MAGIC"
6.3 检查所有备库与主库是否保持数据一致性
su - dmdba
# 一定要以mount方式启动数据库,保证数据库中的数据不被应用或其他操作引起变化。
# 主要是为了保证所有节点的数据库的一致性,防止破坏主备库的数据一致性
dmserver /DMDB/data/DMDB/dm.ini mount
disql SYSDBA/SYSDBA
SQL> select file_LSN, cur_LSN from v$rlog;
行号 FILE_LSN CUR_LSN
---------- -------------------- --------------------
1 37832 37832
已用时间: 6.791(毫秒). 执行号:0.
SQL> select permanent_magic;
行号 PERMANENT_MAGIC
---------- ---------------
1 1626939156
已用时间: 2.407(毫秒). 执行号:1.
7.1 配置dm.ini
### 快速检索出相关项配置 ###
egrep -irn '\s+PORT_NUM' dm.ini
对于完全匹配,请使用-x开关:
grep -x -f A.txt B.txt
如果不想使用grep的正则表达式功能并且需要将搜索模式视为固定字符串,那么请使用-F开关:
grep -xF -f A.txt B.txt
### 范本文本文件dm.ptn begin ###
INSTANCE_NAME
PORT_NUM
DW_INACTIVE_INTERVAL
ALTER_MODE_STATUS
ENABLE_OFFLINE_TS
MAL_INI
ARCH_INI
RLOG_SEND_APPLY_MON
### 范本文本文件dm.ptn end ###
[dmdba@DMDB1 DMDB]$ grep -nf /DMDB/soft/dm.ptn dm.ini | tee /DMDB/soft/dm1.ini.parbak
15: INSTANCE_NAME = GRP1_RWW_01 #Instance name
218: PORT_NUM = 5236 #Port number on which the database server will listen
319: RLOG_SEND_APPLY_MON = 64 #Monitor recently send or apply rlog_buf info
433: DCRS_PORT_NUM = 6236 #Port number on which the database dcrs will listen
435: AP_PORT_NUM = 0 #Port number on which the database ap will listen
454: DW_INACTIVE_INTERVAL = 60 #Time in seconds that used to determine whether DMWATCHER exist
456: ALTER_MODE_STATUS = 1 #Whether to permit database user to alter database mode and status by SQLs, 1: yes, 0: no
457: ENABLE_OFFLINE_TS = 1 #Whether tablespace can be offline
471: DCP_PORT_NUM = 5237 #Port number on which DCP will listen
476: MAL_INI = 0 #dmmal.ini
477: ARCH_INI = 0 #dmarch.ini
## 比较各个节点配置
diff /DMDB/soft/dm1.ini.parbak /DMDB/soft/dm2.ini.parbak
DMDB1主库
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_RWW_01
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
ENABLE_ENCRYPT = 0 #关闭SSL加密通讯
DMDB2备库
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_RWW_02
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
DMDB3备库
#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME = GRP1_RWW_03
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
7.2 配置dmmal.ini
DMDB1主库/DMDB2备库/ DMDB3备库 dmmal.ini配置内容一致
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RWW_01 #实例名和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 10.10.10.11 #MAL系统监听TCP连接的IP地址
MAL_PORT = 5436 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.0.11 #实例的对外服务IP地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 5536 #实例对应的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 5336
[MAL_INST2]
MAL_INST_NAME = GRP1_RWW_02
MAL_HOST = 10.10.10.12
MAL_PORT = 5436
MAL_INST_HOST = 192.168.0.12
MAL_INST_PORT = 5236
MAL_DW_PORT = 5536
MAL_INST_DW_PORT = 5336
[MAL_INST3]
MAL_INST_NAME = GRP1_RWW_03
MAL_HOST = 10.10.10.13
MAL_PORT = 5436
MAL_INST_HOST = 192.168.0.13
MAL_INST_PORT = 5236
MAL_DW_PORT = 5536
MAL_INST_DW_PORT = 5336
7.3 配置dmarch.ini
DMDB1主库
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型:远程归档到GRP1_RWW_02实例主机
ARCH_DEST = GRP1_RWW_02 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = GRP1_RWW_03 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /DMDB/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M
DMDB2备库
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = GRP1_RWW_01 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = GRP1_RWW_03 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /DMDB/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M
DMDB3备库
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = GRP1_RWW_01 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = GRP1_RWW_02 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /DMDB/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M
7.4 配置dmwatcher.ini
DMDB1主库/DMDB2备库/ DMDB3备库 dmwatcher.ini配置内容一致(在没有特殊的改动情况下)
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库检测备库故障恢复的时间间隔
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /DMDB/data/DMDB/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #实例自动重启
INST_STARTUP_CMD = /DMDB/app/DM8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
7.5 配置dmmonitor.ini
DMDB4监视器节点主机(它不需要初始化数据库实例,仅需配置监视配置文件即可)
由于主库和即时备库的守护进程配置为自动切换模式,因此这里选择配置确认监视器。
和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知即时备库接管为新的主库,具有自动故障处理的功能。
注意:故障自动切换模式下,必须配置确认监视器,且确认监视器最多只能配置一个。
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /DMDB/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限制日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453332 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以"IP:PORT"的形式配置
#IP对应dmmal.ini 中的 MAL_HOST,PORT对应dmmal.ini 中的MAL_DW_PORT
MON_DW_IP = 10.10.10.11:5536
MON_DW_IP = 10.10.10.12:5536
MON_DW_IP = 10.10.10.13:5536
### 8.1 各个数据库节点上以mount方式启动数据库(前台方式)**
#一定要以Mount方式启动数据库实例,否则系统启动时会重构回滚表空间,
#成生成Redo日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主
#动备库的数据一致性。数据守护配置结束后,守护进程会自动Open数据库。
# DMDB1 -> DMDB2 --> DMDB3
su - dmdba
dmserver /DMDB/data/DMDB/dm.ini mount
### 8.2 DMDB1主库设置OGUID
# OGUID与配置文件dmwatcher.ini中INST_OGUID相同。
su - dmdba
disql SYSDBA/SYSDBA
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(453332);
SQL> ALTER DATABASE PRIMARY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
### 8.3 DMDB2/DMDB3备库
# OGUID与配置文件dmwatcher.ini中INST_OGUID相同。
su - dmdba
disql SYSDBA/SYSDBA
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(453332);
SQL> ALTER DATABASE STANDBY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
### 9.1 依次启动主备库守护进程
# 守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。
# 守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,
# 守护进程将本地实例Open,并切换为Open状态。
# 依次启动守护进程 DMDB1 -> DMDB2 --> DMDB3
su - dmdba
dmwatcher /DMDB/data/DMDB/dmwatcher.ini
su - dmdba
dmmonitor /DMDB/data/dmmonitor.ini
[dmdba@DMDB4 data]$ dmmonitor /DMDB/data/dmmonitor.ini
[monitor] 2020-12-03 15:54:08: DMMONITOR[4.0] V8
[monitor] 2020-12-03 15:54:08: DMMONITOR[4.0] IS READY.
[monitor] 2020-12-03 15:54:08: 收到守护进程(GRP1_RWW_01)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 15:54:08 OPEN OK GRP1_RWW_01 OPEN PRIMARY VALID 3 39088 39088
[monitor] 2020-12-03 15:54:08: 收到守护进程(GRP1_RWW_02)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 15:54:08 OPEN OK GRP1_RWW_02 OPEN STANDBY VALID 3 39088 39088
[monitor] 2020-12-03 15:54:08: 收到守护进程(GRP1_RWW_03)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 15:54:08 OPEN OK GRP1_RWW_03 OPEN STANDBY VALID 3 39088 39088
show global info
2020-12-03 15:54:21
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453332 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.11 5536 2020-12-03 15:54:21 GLOBAL VALID OPEN GRP1_RWW_01 OK 1 1 OPEN PRIMARY DSC_OPEN TIMELY VALID
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.12 5536 2020-12-03 15:54:20 GLOBAL VALID OPEN GRP1_RWW_02 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY VALID
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.13 5536 2020-12-03 15:54:20 GLOBAL VALID OPEN GRP1_RWW_03 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY VALID
#================================================================================#
## 切记:注册服务使用root用户身份执行。
# DMDB1节点主机
/DMDB/app/DM8/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /DMDB/data/DMDB/dmwatcher.ini -p DW1
# DMDB2节点主机
/DMDB/app/DM8/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /DMDB/data/DMDB/dmwatcher.ini -p DW2
# DMDB3节点主机
/DMDB/app/DM8/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /DMDB/data/DMDB/dmwatcher.ini -p DW3
# DMDB4节点主机:注册监视器服务
/DMDB/app/DM8/script/root/dm_service_installer.sh -t dmmonitor -monitor_ini /DMDB/data/dmmonitor.ini -p DMON1
#测试注册的服务是否正常:启动步骤
service DmServiceGRP1_RWW_01 start
service DmWatcherServiceDW1 start
service DmServiceGRP1_RWW_02 start
service DmWatcherServiceDW2 start
service DmServiceGRP1_RWW_03 start
service DmWatcherServiceDW3 start
service DmMonitorServiceDMON1 start
DMDB1主库
disql SYSDBA/SYSDBA
SQL> create table dmfs as select * from sysobjects;
SQL> select count(1) from dmfs;
行号 COUNT(1)
---------- --------------------
1 1338
已用时间: 7.088(毫秒). 执行号:5.
SQL> select name,instance_name,start_time,status$ from v$instance;
SQL> select name,arch_mode,decode(role$,1,'PRIMARY',2,'STANDBY','Normal') DB_MODE from v$database;
行号 NAME ARCH_MODE DB_MODE
---------- ---- --------- -------
1 DMDB Y PRIMARY
DMDB2/DMDB3备库
disql SYSDBA/SYSDBA
SQL> select count(1) from dmfs;
行号 COUNT(1)
---------- --------------------
1 1338
已用时间: 9.092(毫秒). 执行号:0.
### 登录监视器主机进行操控 ###
# 后台服务已启动,不能再在前台启动监视器,必须停止后重新启动进入前台操作界面。
su - dmdba
service DmMonitorServiceDMON1 stop
dmmonitor /DMDB/data/dmmonitor.ini
[dmdba@DMDB4 ~]$ dmmonitor /DMDB/data/dmmonitor.ini
[monitor] 2020-12-03 16:28:30: DMMONITOR[4.0] V8
[monitor] 2020-12-03 16:28:30: DMMONITOR[4.0] IS READY.
[monitor] 2020-12-03 16:28:30: 收到守护进程(GRP1_RWW_02)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 16:28:30 OPEN OK GRP1_RWW_02 OPEN STANDBY NULL 4 40681 40681
[monitor] 2020-12-03 16:28:30: 收到守护进程(GRP1_RWW_03)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 16:28:30 OPEN OK GRP1_RWW_03 OPEN STANDBY NULL 4 40681 40681
[monitor] 2020-12-03 16:28:30: 收到守护进程(GRP1_RWW_01)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 16:28:31 OPEN OK GRP1_RWW_01 OPEN PRIMARY VALID 4 40681 40681
show global info
2020-12-03 16:30:14
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453332 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.11 5536 2020-12-03 16:30:15 GLOBAL VALID OPEN GRP1_RWW_01 OK 1 1 OPEN PRIMARY DSC_OPEN TIMELY VALID
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.12 5536 2020-12-03 16:30:14 GLOBAL VALID OPEN GRP1_RWW_02 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY VALID
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.13 5536 2020-12-03 16:30:14 GLOBAL VALID OPEN GRP1_RWW_03 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY VALID
#================================================================================#
#=============================================================================================#
list
#-------------------dmwatcher configuration of instance(GRP1_RWW_01)----------------------#
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_INI = /DMDB/data/DMDB/dm.ini
DCR_INI =
INST_OGUID = 453332
INST_STARTUP_CMD = /DMDB/app/DM8/bin/dmserver
INST_AUTO_RESTART = 1
INST_SERVICE_IP_CHECK = 0
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
#-------------------dmwatcher configuration of instance(GRP1_RWW_02)----------------------#
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_INI = /DMDB/data/DMDB/dm.ini
DCR_INI =
INST_OGUID = 453332
INST_STARTUP_CMD = /DMDB/app/DM8/bin/dmserver
INST_AUTO_RESTART = 1
INST_SERVICE_IP_CHECK = 0
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
#-------------------dmwatcher configuration of instance(GRP1_RWW_03)----------------------#
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_INI = /DMDB/data/DMDB/dm.ini
DCR_INI =
INST_OGUID = 453332
INST_STARTUP_CMD = /DMDB/app/DM8/bin/dmserver
INST_AUTO_RESTART = 1
INST_SERVICE_IP_CHECK = 0
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
几个数据库实例之间来回切换
show global info
login
switchover GRP1.GRP1_RWW_03
switchover GRP1.GRP1_RWW_02
switchover GRP1.GRP1_RWW_01
## choose用在多个备库实例的情况下供选择
choose switchover GRP1
switchover GRP1.GRP1_RWW_03
[monitor] 2020-12-03 16:40:17: 开始切换实例GRP1_RWW_03
[monitor] 2020-12-03 16:40:17: 通知守护进程GRP1_RWW_01切换SWITCHOVER状态
[monitor] 2020-12-03 16:40:17: 守护进程(GRP1_RWW_01)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2020-12-03 16:40:17: 切换守护进程GRP1_RWW_01为SWITCHOVER状态成功
[monitor] 2020-12-03 16:40:17: 通知守护进程GRP1_RWW_03切换SWITCHOVER状态
[monitor] 2020-12-03 16:40:17: 守护进程(GRP1_RWW_03)状态切换 [OPEN-->SWITCHOVER]
[monitor] 2020-12-03 16:40:18: 切换守护进程GRP1_RWW_03为SWITCHOVER状态成功
[monitor] 2020-12-03 16:40:18: 实例GRP1_RWW_01开始执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句
[monitor] 2020-12-03 16:40:18: 实例GRP1_RWW_01执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句成功
[monitor] 2020-12-03 16:40:18: 实例GRP1_RWW_03开始执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句
[monitor] 2020-12-03 16:40:18: 实例GRP1_RWW_03执行SP_SET_GLOBAL_DW_STATUS(0, 6)语句成功
[monitor] 2020-12-03 16:40:18: 实例GRP1_RWW_01开始执行ALTER DATABASE MOUNT语句
[monitor] 2020-12-03 16:40:20: 实例GRP1_RWW_01执行ALTER DATABASE MOUNT语句成功
[monitor] 2020-12-03 16:40:20: 实例GRP1_RWW_03开始执行ALTER DATABASE MOUNT语句
[monitor] 2020-12-03 16:40:21: 实例GRP1_RWW_03执行ALTER DATABASE MOUNT语句成功
[monitor] 2020-12-03 16:40:21: 实例GRP1_RWW_01开始执行ALTER DATABASE STANDBY语句
[monitor] 2020-12-03 16:40:21: 实例GRP1_RWW_01执行ALTER DATABASE STANDBY语句成功
[monitor] 2020-12-03 16:40:21: 实例GRP1_RWW_03开始执行ALTER DATABASE PRIMARY语句
[monitor] 2020-12-03 16:40:22: 实例GRP1_RWW_03执行ALTER DATABASE PRIMARY语句成功
[monitor] 2020-12-03 16:40:22: 通知实例GRP1_RWW_03修改所有归档状态无效
[monitor] 2020-12-03 16:40:22: 修改所有实例归档为无效状态成功
[monitor] 2020-12-03 16:40:22: 实例GRP1_RWW_01开始执行ALTER DATABASE OPEN FORCE语句
[monitor] 2020-12-03 16:40:22: 实例GRP1_RWW_01执行ALTER DATABASE OPEN FORCE语句成功
[monitor] 2020-12-03 16:40:22: 实例GRP1_RWW_03开始执行ALTER DATABASE OPEN FORCE语句
[monitor] 2020-12-03 16:40:24: 实例GRP1_RWW_03执行ALTER DATABASE OPEN FORCE语句成功
[monitor] 2020-12-03 16:40:24: 实例GRP1_RWW_01开始执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句
[monitor] 2020-12-03 16:40:24: 实例GRP1_RWW_01执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句成功
[monitor] 2020-12-03 16:40:24: 实例GRP1_RWW_03开始执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句
[monitor] 2020-12-03 16:40:24: 实例GRP1_RWW_03执行SP_SET_GLOBAL_DW_STATUS(6, 0)语句成功
[monitor] 2020-12-03 16:40:24: 通知守护进程GRP1_RWW_01切换OPEN状态
[monitor] 2020-12-03 16:40:24: 守护进程(GRP1_RWW_01)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2020-12-03 16:40:24: 切换守护进程GRP1_RWW_01为OPEN状态成功
[monitor] 2020-12-03 16:40:24: 通知守护进程GRP1_RWW_03切换OPEN状态
[monitor] 2020-12-03 16:40:24: 守护进程(GRP1_RWW_03)状态切换 [SWITCHOVER-->OPEN]
[monitor] 2020-12-03 16:40:24: 切换守护进程GRP1_RWW_03为OPEN状态成功
[monitor] 2020-12-03 16:40:24: 通知组(GRP1)的守护进程执行清理操作
[monitor] 2020-12-03 16:40:24: 清理守护进程(GRP1_RWW_01)请求成功
[monitor] 2020-12-03 16:40:24: 清理守护进程(GRP1_RWW_02)请求成功
2020-12-03 16:40:24
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453332 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.13 5536 2020-12-03 16:40:24 GLOBAL VALID OPEN GRP1_RWW_03 OK 1 1 OPEN PRIMARY DSC_OPEN TIMELY VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RWW_03 OPEN PRIMARY 0 0 TIMELY VALID 3957 40682 3957 42039 NONE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.11 5536 2020-12-03 16:40:25 GLOBAL VALID OPEN GRP1_RWW_01 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY INVALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RWW_01 OPEN STANDBY 0 0 TIMELY INVALID 3956 40681 3956 40681 NONE
DATABASE(GRP1_RWW_01) APPLY INFO FROM (GRP1_RWW_03):
DSC_SEQNO[0], (ASEQ, SSEQ, KSEQ)[3956, 3956, 3956], (ALSN, SLSN, KLSN)[40681, 40681, 40681], N_TSK[0], TSK_MEM_USE[0]
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.12 5536 2020-12-03 16:40:24 GLOBAL VALID OPEN GRP1_RWW_02 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY INVALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RWW_02 OPEN STANDBY 0 0 TIMELY INVALID 3941 40681 3941 40681 NONE
DATABASE(GRP1_RWW_02) APPLY INFO FROM (GRP1_RWW_01):
DSC_SEQNO[0], (ASEQ, SSEQ, KSEQ)[3956, 3956, 3956], (ALSN, SLSN, KLSN)[40681, 40681, 40681], N_TSK[0], TSK_MEM_USE[0]
[monitor] 2020-12-03 16:40:24: 清理守护进程(GRP1_RWW_03)请求成功
[monitor] 2020-12-03 16:40:24: 实例GRP1_RWW_03切换成功
#================================================================================#
[monitor] 2020-12-03 16:40:27: 守护进程(GRP1_RWW_03)状态切换 [OPEN-->RECOVERY]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 16:40:27 RECOVERY OK GRP1_RWW_03 OPEN PRIMARY VALID 5 42039 42039
[monitor] 2020-12-03 16:40:30: 守护进程(GRP1_RWW_02)状态切换 [OPEN-->UNIFY EP]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 16:40:30 UNIFY EP OK GRP1_RWW_02 OPEN STANDBY VALID 5 42039 42039
[monitor] 2020-12-03 16:40:30: 守护进程(GRP1_RWW_02)状态切换 [UNIFY EP-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 16:40:30 OPEN OK GRP1_RWW_02 OPEN STANDBY VALID 5 42039 42039
[monitor] 2020-12-03 16:40:30: 守护进程(GRP1_RWW_03)状态切换 [RECOVERY-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2020-12-03 16:40:30 OPEN OK GRP1_RWW_03 OPEN PRIMARY VALID 5 42039 42039
show global info
2020-12-03 16:42:17
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453332 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.13 5536 2020-12-03 16:42:16 GLOBAL VALID OPEN GRP1_RWW_03 OK 1 1 OPEN PRIMARY DSC_OPEN TIMELY VALID
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.11 5536 2020-12-03 16:42:17 GLOBAL VALID OPEN GRP1_RWW_01 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY VALID
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
10.10.10.12 5536 2020-12-03 16:42:16 GLOBAL VALID OPEN GRP1_RWW_02 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY VALID
#================================================================================#
使用场景: 故障手动切换模式
[dmdba@DMDB1 ~]$ disql SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于主库打开状态
登录使用时间 : 4.852(ms)
上次登录ip : ::1
上次登录时间 : 2020-12-03 16:20:34
登录失败次数 : 0
口令是否过期 : 未过期
disql V8
SQL> select name,arch_mode,decode(role$,1,'PRIMARY',2,'STANDBY','Normal') DB_MODE from v$database;
行号 NAME ARCH_MODE DB_MODE
---------- ---- --------- -------
1 DMDB Y PRIMARY
已用时间: 8.765(毫秒). 执行号:208.
## 杀死主库的实例进程和守护进程
# 一定记住守护进程也要杀死,不然它存在的情况下,会自动拉起它所守护的数据库实例
[root@DMDB1 ~]# ps -fu dmdba
UID PID PPID C STIME TTY TIME CMD
dmdba 5448 1 0 10:26 pts/0 00:00:01 /DMDB/app/DM8/bin/dmap
dmdba 6685 6684 0 12:37 pts/1 00:00:00 -bash
dmdba 7581 1 0 16:03 pts/0 00:00:16 /DMDB/app/DM8/bin/dmserver /DMDB/data/DMDB/dm.ini -noconsole
dmdba 7711 1 0 16:03 pts/0 00:00:14 /DMDB/app/DM8/bin/dmwatcher /DMDB/data/DMDB/dmwatcher.ini
[root@DMDB1 ~]# kill -9 7581 7711
#### 在监视器端执行接管主库命令 ###
# 由实例3接管实例1
login
show
takeover GRP1.GRP1_RWW_03
dm_svc.conf放置地方: WINDOWS: %SystemRoot%\system32 LINUX: /etc
###### dm_svc.conf 文件内容 ######
# 全局配置
# 时区
TIME_ZONE=(+8:00)
LANGUAGE=(en)
dwrw=(192.168.0.11:5236,192.168.0.12:5236,192.168.0.13:5236)
LOGIN_MODE=(3)
#是否进行通信加密
LOGIN_ENCRYPT=0
# 服务配置区:服务配置区中的配置优先级高于全局配置区
[dwrw]
# 指定优先登录的服务器模式.
# 0:优先连接PRIMARY模式的库,NORMAL模式次之,最后选择STANTBY 模式
# 1:只连接主库
# 2:只连接备库
# 3:优先连接STANDBY模式的库,PRIMARY模式次之,最后选择NORMAL模式
# 4:优先连接NORMAL模式的库,PRIMARY模式次之,最后选择STANDBY模式
LOGIN_MODE=(3)
# 在服务器之间切换的次数
SWITCH_TIME=2000
# 在服务器之间切换的时间间隔,单位毫秒
SWITCH_INTERVAL=10
针对JDBC: rwSeparate 是否使用读写分离系统,默认 0;取值(0 不使用,1 使用)。 rwPercent
分发到主库的事务占主备库总事务的百分比,有效值 0~100,默认值 25。
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://dwrw?rwSeparate=1&rwPercent=10</URL>
读写分离集群实现原理:
利用备库提供只读服务、无法修改数据的特性,优先将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。
通过备库“试错”这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,对应用透明。
读写分离集群作用:
由一个主库以及一个或者多个配置了即时(Timely)归档的备库组成,其主要目标是在保障数据库可用性基础上,实现读、写操作的自动分离,进一步提升数据库的业务支撑能力。读写分离集群通过即时归档机制保证主、备库数据一致性,并配合达梦数据库管理系统的各种接口(JDBC、DPI等),将只读操作自动分流到备库,有效降低主库的负载,提升系统吞吐量。