日常工作中,为了防止误操作,或者可能因为故障导致数据的丢失,或者天灾,以防遭遇“不测”,常常对数据进行备份,接下来介绍一个环境–主备机的搭建,这个环境当主机有故障时可以切换备机进行使用,防止数据的缺失。
第一步:数据准备
注意事项:
主备机要同一版本的数据库,然后安装,查看主备机的版本
主机:
SQL> select * from v$version;
行号 BANNER
1 DM Database Server x64 V7.6.0.197-Build(2019.09.12-112648)ENT
2 DB Version: 0x7000a
已用时间: 10.567(毫秒). 执行号:1.
SQL>
备机:
SQL> select * from v$version;
行号 BANNER
1 DM Database Server x64 V7.6.0.197-Build(2019.09.12-112648)ENT
2 DB Version: 0x7000a
已用时间: 506.718(毫秒). 执行号:1.
SQL>
准备数据的时候为了确保两个库的数据保持一致,所以可以利用备份还原方式将主库的数据还原到备库,或者通过拷贝数据文件将数据拷贝到备库里。
第二步:检查一致性
查询永久魔数
SQL> select file_lsn,cur_lsn from
v$rlog;
行号 FILE_LSN CUR_LSN
1 81988 81988
已用时间: 2.982(毫秒). 执行号:2.
SQL>
SQL> select file_lsn,cur_lsn from
v$rlog;
行号 FILE_LSN CUR_LSN
1 81988 81988
已用时间: 12.591(毫秒). 执行号:2.
SQL>
SQL> select PERMANENT_MAGIC;
行号 PERMANENT_MAGIC
1 1913193310
已用时间: 4.882(毫秒). 执行号:3.
SQL>
SQL> select PERMANENT_MAGIC;
行号 PERMANENT_MAGIC
1 1913193310
已用时间: 5.316(毫秒). 执行号:3.
SQL>
确保LSN和永久魔数都一致的情况下,检查完毕后关闭主备数据库服务。如果不一致说明主备库数据不一致,那么就要重新数据准备。
第三步:主机数据库配置参数
dm.ini 修改以下的参数 ,这个文件是数据库初始化文件一般是在数据文件的目录下
INSTANCE_NAME = DM1
PORT_NUM = 42141#数据库实例监听端口
DW_PORT = 43141 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME =60 #接收守护进程消息超时时间
ALTER_MODE_STATUS= 1 #允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS= 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
编辑主库的dmmal.ini文件,放于dm.ini的同一目录下
vi dmmal.ini
MAL_CHECK_INTERVAL= 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL= 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DM1 #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 192.168.73.3#MAL系统监听TCP连接的IP地址
MAL_PORT = 61141#MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.73.3#实例的对外服务IP地址
MAL_INST_PORT = 42141#实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = DM2
MAL_HOST = 192.168.73.4
MAL_PORT = 61142
MAL_INST_HOST = 192.168.73.4
MAL_INST_PORT = 42142
MAL_DW_PORT = 52142
编辑dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE =REALTIME #实时归档类型
ARCH_DEST = DM2 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL#本地归档类型
ARCH_DEST = /home/DM7/bin/dmdata/DAMENG/arch#本地归档文件存放路径
ARCH_FILE_SIZE =128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M
复制一份到备机,然后修改ARCH_DEST根据实际情况修改。
编辑dmwatcher.ini文件
[GROUP_A]
DW_TYPE =REALTIME #实时守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME =10 #远程守护进程故障认定时间
INST_RECOVER_TIME= 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME =10 #本地实例故障认定时间
INST_OGUID =453331 #守护系统唯一OGUID值
INST_INI = /home/DM7/bin/dmdata/DAMENG/dm.ini
#dm.ini配置文件路径
INST_AUTO_RESTART= 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/DM7/bin/dmserver #命令行方式启动
dmwatcher.ctl:
同一个守护进程组,必须使用同一份dmwatcher.ctl。因此,只需要使用dmctlcvt工具生成一份dmwatcher.ctl文件,然后分别拷贝到各个数据库目录下即可。
在配置完成dmwatcher.ini后,使用dmctlcvt工具生成dmwatcher.ctl:
./dmctlcvt t2dwctl ./dmdata/DAMENG/dmwatcher.ini ./dmdata/DAMENG/
注意:dmwatcher.ini:中设置了[GROUP_A],所以对应的转换会生成GROUP_A/dmwatcher.ini
第四步:启动数据库服务并设置数据守护唯一标识码OGUID
以mount方式启动主机:
./dmserver …/data/DAMENG/dm.ini mount
设置数据守护唯一标识码OGUID:
sp_set_oguid(453331);改值为dmwatch.ini中INST_OGUID值
修改数据库模式:
ALTER DATABASE PRIMARY;
第五步:备机数据库配置参数
dm.ini:
INSTANCE_NAME = DM2
#实例名,建议使用“组名_守护类型_序号”的命名方式,总长度不能超过16
PORT_NUM = 42142#数据库实例监听端口
DW_PORT = 43142 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME =60 #接收守护进程消息超时时间
ALTER_MODE_STATUS= 1 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS= 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
dmmal.ini(和主数据库完全一致)
MAL_CHECK_INTERVAL= 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL= 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DM1 #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 192.168.73.3#MAL系统监听TCP连接的IP地址
MAL_PORT = 61141#MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.73.3#实例的对外服务IP地址
MAL_INST_PORT = 42141#实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = DM2
MAL_HOST = 192.168.73.4
MAL_PORT = 61142
MAL_INST_HOST = 192.168.73.4
MAL_INST_PORT = 42142
MAL_DW_PORT = 52142
dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE =REALTIME #实时归档类型
ARCH_DEST = DM1 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL#本地归档类型
ARCH_DEST = /home/DM7/bin/dmdata/DAMENG/arch
#本地归档文件路径
ARCH_FILE_SIZE =128 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M
dmwatcher.ini
[GROUP_A]
DW_TYPE= REALTIME #实时守护类型
DW_MODE= AUTO #自动切换模式
DW_ERROR_TIME= 10 #远程守护进程故障认定时间
INST_RECOVER_TIME= 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME= 10 #本地实例故障认定时间
INST_OGUID= 453331 #守护系统唯一OGUID值
INST_INI= /home/DM7/bin/dmdata/DAMENG/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART= 1 #打开实例的自动启动功能
INST_STARTUP_CMD
= /home/DM7/bin/dmserver #命令行方式启动
dmwatcher.ctl
同一个守护进程组,必须使用同一份dmwatcher.ctl文件,这里直接拷贝配置主库时已经生成的dmwatcher.ctl到本地数据文件目录/home/DM7/bin/dmdata/DAMENG。
第六步:启动数据库服务并设置数据守护唯一标识码OGUID
以mount方式启动备机:
./dmserver
…/data/DAMENG/dm.ini mount
可以修改为后台启动,就是将DmService修改一下
INI_PATH=/home/DM7/bin/dmdata/DAMENG/dm.ini
START_MODE=mount
设置备机数据守护唯一识别码
sp_set_oguid(453331);
–如果不设置就获取不到守护进程
修改数据库模式为备机模式
SP_SET_PARA_VALUE(1,‘ALTER_MODE_STATUS’, 1);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1,‘ALTER_MODE_STATUS’, 0);
第七步:配置监视器
监视器支持两种运行模式:监控模式和确认模式。监视器运行模式由配置文件 (dmmonitor.ini)的 MON_DW_CONFIRM参数来确定。MON_DW_CONFIRM参数的默认
值是0,表示监控模式;MON_DW_CONFIRM参数值为1时,表示监视器运行在确认模式下。
MON_DW_Confirm= 1 #确认监视器模式
MON_LOG_PATH =d:\dmdbms\data\DAMENG\log\ #监视器日志文件存放路径
MON_LOG_INTERVAL= 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE= 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT= 0 #不限定日志文件总占用空间
[GROUP_A]
MON_INST_OGUID= 453331 #组GRP1的唯一OGUID
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 192.168.73.3:52141
MON_DW_IP = 192.168.73.4:52142
第八步:启动主备机的守护进程
可以设置为后台启动
ls ./service_template/
找出DmWatcherService进行配置修改
以下是前台启动
启动主机DW_P上的守护进程。
./dmwatcher ./dmdata/DAMENG/dmwatcher.ini
启动备机DW_S上的守护进程。
./dmwatcher ./dmdata/DAMENG/dmwatcher.ini
注意:主机和副机的防火墙都需要关闭
Linux7 关闭防火墙的命令:systemctl stop firewalld
Systemctl status firewalld是查看防火墙的状态
第八步:启动监视器
这个是搭建在window下的
dmmonitor.exe …\data\DAMENG\dmmonitor.ini
Linux下的监视器是这样启动
./dmmonitor ./dmdata/DAMENG/dmmonitor.ini
环境搭建基本上完成。
测试:
主机创建表,插入数据,在备机查看是否同步。备机插入数据失败。
SQL> select * from test;
行号 ID NAME
1 1 22
2 2 222
3 3 333
4 4 444
5 4 444
SQL> insert into test values(6,‘666’);
影响行数 1
已用时间: 1.257(毫秒). 执行号:11.
SQL> commit;
操作已执行
已用时间: 4.579(毫秒). 执行号:12.
SQL>
SQL> select * from test;
行号 ID NAME
1 1 22
2 2 222
3 3 333
4 4 444
5 4 444
6 6 666
6 rows got
备机插入数据会报错误
SQL> insert into test values(7,‘777’);
insert into test values(7,‘777’);
第1 行附近出现错误[-2018]:STANDBY模式下不支持对非临时表或含有lob类型列的表进行增删改操作.
已用时间: 0.981(毫秒). 执行号:0.
SQL>