一、主备复制搭建:
1、主节点脱机备份
如果数据库服务是打开的,需要关闭两个节点的服务(即关库)
shutdown immediate
[dmdba@DaMengDB1 ~]#cd /dm8/bin
[dmdba@DaMengDB1 bin]# dmrman
dmrman V8
RMAN> BACKUP DATABASE '/data/dm8/DM01/dm.ini' full BACKUPSET '/data/backup/master0205/';
BACKUP DATABASE '/data/dm8/DM01/dm.ini' full BACKUPSET '/data/backup/master0205/';
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[360807]
BACKUP DATABASE [DM01],execute......
CMD CHECK LSN......
BACKUP DATABASE [DM01],collect dbf......
CMD CHECK ......
DBF BACKUP SUBS......
total 1 packages processed...
total 2 packages processed...
total 3 packages processed...
total 4 packages processed...
total 8 packages processed...
total 9 packages processed...
total 10 packages processed...
total 11 packages processed...
DBF BACKUP MAIN......
BACKUPSET [/data/backup/master0205] END, CODE [0]......
META GENERATING......
total 13 packages processed...
total 13 packages processed...
total 13 packages processed!
CMD END.CODE:[0]
backup successfully!
time used: 00:00:01.497
RMAN> exit
time used: 0.004(ms)
执行完毕之后,会生成一个备份文件,通过scp命令传输到从库的/data/backup 目录下面
注:上面的过程使用的是脱机备份,主库是需要关闭的,如果是生产环境,那么我们也可以采用联机备份:
2、备库执行数据库还原
脱机还原:
[dmdba@DaMengDB2 backup]# cd /dm8/bin
[dmdba@DaMengDB2 bin]# dmrman
dmrman V8
RMAN> RESTORE DATABASE '/data/dm8/DM01/dm.ini' FROM BACKUPSET '/data/backup/master1208';
RESTORE DATABASE '/data/DAMENG/dm.ini' FROM BACKUPSET '/data/backup/';
file dm.key not found, use default license!
RESTORE DATABASE CHECK......
RESTORE DATABASE,data collect......
RESTORE DATABASE,database refresh ......
RESTORE BACKUPSET [/data/backup] START......
total 11 packages processed...
total 13 packages processed...
RESTORE DATABASE,UPDATE ctl file......
RESTORE DATABASE,REBUILD key file......
RESTORE DATABASE,CHECK db info......
RESTORE DATABASE,UPDATE db info......
total 13 packages processed...
total 13 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 00:00:02.562
恢复:
RMAN> recover database '/data/dm8/DM01/dm.ini' from backupset '/data/backup/master1208';
recover database '/data/DAMENG/dm.ini' from backupset '/data/backup';
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[360807]
RESTORE RLOG CHECK......
CMD END.CODE:[603],DESC:[no log generates while the backupset [/data/backup] created]
no log generates while the backupset [/data/backup] created
recover successfully!
time used: 804.560(ms)
更新db_magic:
RMAN> recover database '/data/dm8/DM01/dm.ini' update db_magic;
recover database '/data/DAMENG/dm.ini' update db_magic;
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[360807]
EP[0]'s apply_lsn[360807] >= end_lsn[360807]
recover successfully!
time used: 00:00:01.150
3、主从配置文件(配置文件路径无具体说明,都与dm.ini文件路径同级)
修改dm.ini(主备一样)
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI= 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
增加文件dmmal.ini(主备一样)
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DM01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.18.35.114 #MAL系统监听TCP连接的IP地址,即为当前机器的IP
MAL_PORT = 61141 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 10.18.35.114 #实例的对外服务IP地址,即为当前机器的公网IP
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMSERVER
MAL_HOST = 10.18.11.196
MAL_PORT = 61142
MAL_INST_HOST = 10.18.11.196
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
配置 dmarch.ini (备库将实例名修改)
主:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DMSERVER #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /data/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 500000 #单位 Mb,0 表示无限制,范围 1024~4294967294M
备:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DM01 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /data/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 500000 #单位 Mb,0 表示无限制,范围 1024~4294967294M
配置守护进程dmwatcher.ini
主:
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = MANUAL #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /data/dm8/DM01/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
备:
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = MANUAL #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /data/dm8/DM01/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
配置监听dmmonitor.ini
(只需配一个,本例放备库)其中 MON_DW_IP 中的 IP 和 PORT 和dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。
vi dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /data/log/ #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 10.18.35.114:52141
MON_DW_IP = 10.18.11.196:52142
4、启动主从库并设置主备模式
DM 数据库包含以下几种模式:
a. 普通模式(NORMAL): 用户可以正常访问数据库,操作没有限制;
b. 主库模式(PRIMARY): 用户可以正常访问数据库,所有对数据库对象的修改强制 生成 REDO 日志,在归档有效时,发送 REDO 日志到备库;
c. 备库模式(STANDBY): 接收主库发送过来的 REDO 日志并重做。数据对用户只读。
三种模式只能在 MOUNT 状态下设置,模式之间可以相互转换。 对于新初始化的库,首次启动不允许使用 mount 方式,需要先正常启动并正常退出, 然后才允许 mount 方式启动
首先启动主库:
一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,
破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
以 Mount 方式启动主库:
[dmdba@DaMengDB1 DM01]# dmserver /data/dm8/DM01/dm.ini mount
file dm.key not found, use default license!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V8 1-1-78-20.04.28-121039-ENT startup...
Database mode = 0, oguid = 0
License will expire on 2021-04-28
file lsn: 360807
ndct db load finished
ndct fill fast pool finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
SYSTEM IS READY.
[dmdba@DaMengDB1 ~]# disql
disql V8
username:sysdba
password:
Server[LOCALHOST:5236]:mode is normal, state is mount
login used time: 3.017(ms)
设置 OGUID 值。主库修改数据库为 Primary 模式:(先允许手工方式修改实例模式/状态/OGUID)
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
DMSQL executed successfully
used time: 17.953(ms). Execute id is 1.
SQL> sp_set_oguid(453331);
DMSQL executed successfully
used time: 35.520(ms). Execute id is 2.
SQL> alter database primary;
executed successfully
used time: 41.947(ms). Execute id is 0.
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
DMSQL executed successfully
used time: 3.695(ms). Execute id is 3.
从库操作一样(注意文件路径):
以 Mount 方式启动从库:
[dmdba@DaMengDB2 DAMENG]# dmserver /data/dm8/DM01/dm.ini mount
file dm.key not found, use default license!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V8 1-1-78-20.04.28-121039-ENT startup...
Database mode = 0, oguid = 0
License will expire on 2021-04-28
file lsn: 360807
ndct db load finished
ndct fill fast pool finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
SYSTEM IS READY.
[dmdba@DaMengDB2 ~]# disql
disql V8
username:sysdba
password:
Server[LOCALHOST:5236]:mode is normal, state is mount
login used time: 4.529(ms)
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
DMSQL executed successfully
used time: 29.455(ms). Execute id is 1.
SQL> sp_set_oguid(453331);
DMSQL executed successfully
used time: 70.741(ms). Execute id is 2.
SQL> alter database standby;
executed successfully
used time: 92.647(ms). Execute id is 0.
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
DMSQL executed successfully
used time: 35.792(ms). Execute id is 3.
5.启动各个主备库上的守护进程:
[dmdba@DaMengDB1 ~]# dmwatcher /data/dm8/DM01/dmwatcher.ini
DMWATCHER[4.0] V8
DMWATCHER[4.0] IS READY
[dmdba@DaMengDB2 DAMENG]# dmwatcher /data/dm8/DM01/dmwatcher.ini
DMWATCHER[4.0] V8
DMWATCHER[4.0] IS READY
6.备库启动监视器:
[dmdba@root1 ~]$ dmmonitor /data/dm8/DM01/dmmonitor.ini
[monitor] 2021-02-05 16:13:16: DMMONITOR[4.0] V8
[monitor] 2021-02-05 16:13:16: DMMONITOR[4.0] IS READY.
[monitor] 2021-02-07 17:02:29: Received message from(DMSERVER)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2021-02-07 17:02:29 OPEN OK DMSERVER OPEN STANDBY NULL 13 362065 362065
[monitor] 2021-02-07 17:02:29: Received message from(DM01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2021-02-07 17:02:30 OPEN OK DM01 OPEN PRIMARY VALID 13 362065 362065
[monitor] 2021-02-08 10:02:29:
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453331 TRUE MANUAL 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.18.35.114 52141 2021-02-08 10:02:32 GLOBAL VALID OPEN DM01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CONTROL_NODE RTYPE RSTAT PKG_SEQNO FLSN CLSN DW_STAT_FLAG
5236 OK DM01 OPEN PRIMARY 0 0 REALTIME VALID 6990 362081 362081 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.18.11.196 52142 2021-02-08 10:02:28 GLOBAL VALID OPEN DMSERVER OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CONTROL_NODE RTYPE RSTAT PKG_SEQNO FLSN CLSN DW_STAT_FLAG
5236 OK DMSERVER OPEN STANDBY 0 0 REALTIME VALID 6984 362081 362081 NONE
DATABASE(DMSERVER) APPLY INFO FROM (DM01):
DSC_SEQNO[0], (ASEQ, SSEQ, KSEQ)[6990, 6990, 6990], (ALSN, SLSN, KLSN)[362081, 362081, 362081], N_TSK[0], TSK_MEM_USE[0]
关闭过程:关闭确认监视器——关闭备机守护进程——关闭主机守护进程——关闭主机实例服务——关闭备机实例服务
在上面的主备库服务,守护进程和监视器都是我们直接启动的(使用ini文件启动的),页面关闭或者ctrl+c、exit就会断开自动关闭。
二、注册服务
在上面的主从过程,守护进程和监视器都是我们直接启动的,如果命令中断,就无法运行。 因此需要将这些注册到服务里,方便管理。
注册过程用root用户在安装目录script/root下:
[root@DaMengDB1 root]# ./dm_service_installer.sh -help
Usage: dm_service_installer.sh -t service_type [-p service_name_postfix] [-i ini_file] [-d dcr_ini_file] [-m open|mount]
or dm_service_installer.sh [ -s service_file_path ]
or dm_service_installer.sh -h
-t Service Type, include: dmimon,dmap,dmserver,dmwatch,dmrww,dmwmon,dmwatcher,dmmonitor,dmcss,dmcssm,dmasmsvr.
-p Service Name Postfix, is invalid for dmimon,dmap.
-i The path of the ini file, is invalid for dmimon,dmap.
-d The path of dmdcr.ini, is valid for dmserver only, select.
-m Set the start modeof the server, include:open or mount, is valid for dmserver only, select.
-s The path of the service script file, if set this parameter, and ignore other parameter.
-h Help
1.先在主备库创建一个开启mount状态的服务,因为守护进程需要库在mount状态下。
[root@DaMengDB1 root]# cd /dm8/script/root
主库创建mount启动状态的服务:
[root@DaMengDB1 root]# ./dm_service_installer.sh -t dmserver -p masterm -dm_ini /data/dm8/DM01/dm.ini -m mount
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicemasterm.service to /usr/lib/systemd/system/DmServicemasterm.service.
Finished to create the service (DmServicemasterm)
备库创建mount启动状态的服务:
[root@DaMengDB2 root]# ./dm_service_installer.sh -t dmserver -p slavem -dm_ini /data/dm8/DM01/dm.ini -m mount
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceslavem.service to /usr/lib/systemd/system/DmServiceslavem.service.
Finished to create the service (DmServiceslavem)
2.再在主备库创建守护进程和监视进程的服务:
主库创建守护进程服务:
[root@DaMengDB1 root]# ./dm_service_installer.sh -t dmwatcher -p DMWATCHER -watcher_ini /data/dm8/DM01/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceDMWATCHER.service to /usr/lib/systemd/system/DmWatcherServiceDMWATCHER.service.
Finished to create the service (DmWatcherServiceDMWATCHER)
备库创建守护进程服务:
[root@DaMengDB2 root]# ./dm_service_installer.sh -t dmwatcher -p DMWATCHER -watcher_ini /data/dm8/DM01/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceDMWATCHER.service to /usr/lib/systemd/system/DmWatcherServiceDMWATCHER.service.
Finished to create the service (DmWatcherServiceDMWATCHER)
备库创建监视进程服务:
[root@DaMengDB2 root]# ./dm_service_installer.sh -t dmmonitor -p DMMONITOR -monitor_ini /data/dm8/DM01/dmmonitor.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmMonitorServiceDMMONITOR.service to /usr/lib/systemd/system/DmMonitorServiceDMMONITOR.service.
Finished to create the service (DmMonitorServiceDMMONITOR)
启动过程:开主机实例——开主机守护进程——开备机实例——开备机守护进程——打开确认监视器
systemctl start DmServicemasterm
systemctl start DmWatcherServiceDMWATCHER
systemctl start DmServiceslavem
systemctl start DmWatcherServiceDMWATCHER
systemctl start DmMonitorServiceDMMONITOR
关闭过程:关闭确认监视器——关闭备机守护进程——关闭主机守护进程——关闭主机实例服务——关闭备机实例服务
systemctl stop DmMonitorServiceDMMONITOR
systemctl stop DmWatcherServiceDMWATCHER
systemctl stop DmWatcherServiceDMWATCHER
systemctl stop DmServicemasterm
systemctl stop DmServiceslavem