搭建MPP主备
-
老规矩先安装各个虚拟机节点上的数据库实例并进行初始化。我这里暂时只做了两个节点。
//初始化中稍微有点不一样的,你需要在每个节点上初始化两个数据库实例,进行交叉主备的安装。
例如节点1上初始化主库EP1和备库EP22实例
节点2上初始化主库EP2和备库EP11实例 -
切换到dmdba用户进行脱机备份还原
备份主库EP01
[dmdba@localhost bin]$ ./dmrman ctlstmt=“backup database ‘/dm/data/DAMENG/dm.ini’ full backupset ‘/dm/data/db_full_01’”
备份主库EP02
[dmdba@localhost bin]$ ./dmrman ctlstmt=“backup database ‘/dm/data/DAMENG/dm.ini’ full backupset ‘/dm/data/db_full_02’”
使用scp把备份集拷贝到相应的节点上
[dmdba@localhost bin]$ scp -r /dm/data/db_full_02 dmdba@192.168.59.135:/dm/data
在节点1上还原备库EP22
[dmdba@localhost bin]$ ./dmrman ctlstmt=“restore database ‘/dm/data/EP22/DAMENG/dm.ini’ from backupset ‘/dm/data/db_full_02’”
[dmdba@localhost bin]$ ./dmrman ctlstmt=“recover database ‘/dm/data/EP22/DAMENG/dm.ini’ from backupset ‘/dm/data/db_full_02’”
[dmdba@localhost bin]$ ./dmrman ctlstmt=“recover database ‘/dm/data/EP22/DAMENG/dm.ini’ update db_magic”
在节点2上还原备库EP11
[dmdba@localhost bin]$ ./dmrman ctlstmt=“restore database ‘/dm/data/EP11/DAMENG/dm.ini’ from backupset ‘/dm/data/db_full_01’”
[dmdba@localhost bin]$ ./dmrman ctlstmt=“recover database ‘/dm/data/EP11/DAMENG/dm.ini’ from backupset ‘/dm/data/db_full_01’”
[dmdba@localhost bin]$ ./dmrman ctlstmt=“recover database ‘/dm/data/EP11/DAMENG/dm.ini’ update db_magic” -
配置主库EP01 dm.ini、dmarch.ini、dmmal.ini、dmmpp.ctl
dm.ini
INSTANCE_NAME = EP01 #实例名总长度不能超过 16
PORT_NUM = 7236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
MPP_INI = 1 #启用 MPP 配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #归档类型
ARCH_DEST = EP11 #归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/data #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 2048 #单位Mb,0表示无限制,范围1024~4294967294M
dmmal.ini
MAL_CHECK_INTERVAL= 30
MAL_CONN_FAIL_INTERVAL= 10
MAL_LOGIN_TIMEOUT= 15
MAL_BUF_SIZE= 100
MAL_SYS_BUF_SIZE= 0
MAL_VPOOL_SIZE= 128
MAL_COMPRESS_LEVEL= 0
[MAL_INST1]
MAL_INST_NAME = EP01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.59.135 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 6237 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.59.135 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 7236 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 8236 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME= EP02
MAL_HOST= 192.168.59.136
MAL_PORT= 6237
MAL_INST_HOST= 192.168.59.136
MAL_INST_PORT= 5236
MAL_DW_PORT = 7236
MAL_INST_DW_PORT = 8236
#添加备库信息
[MAL_INST11]
MAL_INST_NAME= EP11
MAL_HOST= 192.168.59.136
MAL_PORT= 6238
MAL_INST_HOST= 192.168.59.136
MAL_INST_PORT= 6236
MAL_DW_PORT = 7237
MAL_INST_DW_PORT = 8237
[MAL_INST22]
MAL_INST_NAME= EP22
MAL_HOST= 192.168.59.135
MAL_PORT= 6238
MAL_INST_HOST= 192.168.59.135
MAL_INST_PORT= 6236
MAL_DW_PORT = 7237
MAL_INST_DW_PORT = 8237
//这里需要注意的是,同一个服务器下数据库的不通实例的端口号不能一样。
dmmpp.ini
[service_name1]
mpp_seq_no = 0
mpp_inst_name = EP01
[service_name2]
mpp_seq_no = 1
mpp_inst_name = EP02
//由于我们需要的是dmmpp.ctl二进制文件
所以我们需要使用dm自带的dmctlcvt工具转换其为二进制文件
[dmdba@localhost bin]$ ./dmctlcvt type=2 src=/dm/data/DAMENG/dmmpp.ini dest=/dm/data/DAMENG/dmmpp.ctl
该文件需要跟dm.ini在一个文件夹下。
- 拷贝dmmal.ini、dmarch.ini、dmmpp.ctl到各个节点的各个实例中
[dmdba@localhost DAMENG]$ scp dmmal.ini dmarch.ini dmmpp.ctl dmdba@192.168.59.136:/dm/data/DAMENG/
[dmdba@localhost DAMENG]$ scp dmmal.ini dmarch.ini dmmpp.ctl dmdba@192.168.59.136:/dm/data/EP11/DAMENG/
[dmdba@localhost DAMENG]$ cp dmmal.ini dmarch.ini dmmpp.ctl /dm/data/EP22/DAMENG/
-
配置主库EP02参数
修改dm.ini中对应参数
修改dmarch.ini中对应参数
dmmal.ini不用修改 -
配置备库EP11参数
修改dm.ini参数,且确保梳理端口与同节点上的实例端口号不同。
修改dmarch.ini参数
dmmal.ini不用修改 -
配置备库EP22参数
修改dm.ini参数,且确保梳理端口与同节点上的实例端口号不同。
修改dmarch.ini参数
dmmal.ini不用修改 -
配置守护进程
//正常情况下,一个实例一个守护进程。但是我设置的是一台机器两个实例,所以我可以配置一个dmwatcher守护两个实例。
节点1上在主库EP01的DAMENG目录下创建dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45331 #守护系统唯一OGUID值
INST_INI = /dm/data/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
//这一行有点问题,如果要自动启动数据库服务的话,应该改为如下
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver /dm/data/DAMENG/dm.ini
或者(已经注册服务,可以使用)
INST_STARTUP_CMD = service DmServiceEP01
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
[GRP2]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45332 #守护系统唯一OGUID值
INST_INI = /dm/data/EP22/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
//这一行有点问题,如果要自动启动数据库服务的话,应该改为如下
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver /dm/data/EP22/DAMENG/dm.ini
或者(已经注册服务,可以使用)
INST_STARTUP_CMD = service DmServiceEP22
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
在节点2主库EP02上配置dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45332 #守护系统唯一OGUID值
INST_INI = /dm/data/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
//这一行有点问题,如果要自动启动数据库服务的话,应该改为如下
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver /dm/data/DAMENG/dm.ini
或者(已经注册服务,可以使用)
INST_STARTUP_CMD = service DmServiceEP02
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
[GRP2]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45331 #守护系统唯一OGUID值
INST_INI = /dm/data/EP11/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
//这一行有点问题,如果要自动启动数据库服务的话,应该改为如下
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver /dm/data/EP11/DAMENG/dm.ini
或者(已经注册服务,可以使用)
INST_STARTUP_CMD = service DmServiceEP11
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
- 配置监视器
//将两个主备放在一个监视器里面
在节点1 新建/dm/monitor 和 /dm/monitor/log文件夹
[dmdba@localhost DAMENG]$ mkdir /dm/monitor
[dmdba@localhost DAMENG]$ mkdir /dm/monitor/log
[dmdba@localhost DAMENG]$ chown -R dmdba:dinstall /dm/monitor/
新建dmmonitor.ini文件
MON_DW_Confirm = 1 #确认监视器模式
MON_LOG_PATH = /dm/monitor/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 45331 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 192.168.59.135:5236
MON_DW_IP = 192.168.59.136:6236
[GRP2]
MON_INST_OGUID = 45332 #组GRP2的唯一OGUID值
MON_DW_IP = 192.168.59.136:5236
MON_DW_IP = 192.168.59.135:6236
- 开启主备库,更改oguid值,以及数据库状态。
//注意因为是MPP集群下的实时主备,所以如果想启动一个实例,必须把所有实例都mount打开
//或者你可以本地打开
[root@localhost bin]# ./disql SYSDBA/SYSDBA*local@192.168.59.135:5236
更改EP01上的oguid的值,更改其状态为primary。
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);
更改EP11上的oguid的值,并更改其状态为standby。
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);
更改EP02上的oguid的值,更改其状态为primary。
sp_set_para_value(1,‘alter_mode_status’,1)
sp_set_oguid(45332);
alter database primary;
sp_set_para_value(1,‘alter_mode_status’,0);
更改EP22上的oguid的值,并更改其状态为standby。
sp_set_para_value(1,‘alter_mode_status’,1)
sp_set_oguid(45332);
alter database standby;
sp_set_para_value(1,‘alter_mode_status’,0);
- 启动守护进程
节点1
[root@localhost bin]# ./dmwatcher /dm/data/DAMENG/dmwatcher.ini
节点2
[root@localhost bin]# ./dmwatcher /dm/data/DAMENG/dmwatcher.ini
- 分别在两个节点上注册实例服务和守护进程服务。
./dm_service_installer.sh –t dmserver –dm_ini /dm/data/DAMENG/dm.ini -p EP01
./dm_service_installer.sh –t dmwatcher –watcher_ini /dm/data/DAMENG/dmwatcher.ini -p EP01
//注意:由于之后每次启动数据库都要使用mount方式启动数据库服务。
所以,找到注册的服务的位置,我这里是/etc/rc.d/init.d/文件夹,使用vim命令修改服务参数的配置,使其以后每次启动都采用mount方式启动。
启动
service DmServiceEP01 start
service DmWatcherServiceTEST start