在搭建数据守护系统前,应注意数据守护系统中各实例使用的 DM 服务器版本应一致,同时还应注意各实例所在主机的操作系统位数、大小端模式、时区及时间设置都应一致,以及使用同一个用户启动 DM 服务器和守护进程 dmwatcher,以免系统在运行时出现意想不到的错误。
1,虚拟机设置
3个虚拟机都按照安装单机的教程http://t.csdnimg.cn/qLQlz,分别完成如下步骤:
- 安装vmware-tools
- 设置共享文件夹(方便将安装包传输到虚拟机中,指令复制粘贴等)
- 修改系统资源限制
- 修改网卡配置
- 关闭防火墙
- 创建安装用户
1.1,硬件配置
新建3个虚拟机DW_P(安装主库)、 DW_S1(安装备库)、 DW_M(安装监视器),都需要安装dm8单机,所以均设置内存8G,硬盘40G(20G会内存不足报错),P和S1添加2个NAT网卡
1.2,网络设置
修改网卡配置文件,其中P和S1添加2个NAT网卡,ens33作为外网IP用于正常提供数据库服务,ens34作为内网IP用于和数据守护系统的其他组件通信,对应的配置文件都要修改
虚拟机 | 外网服务IP | 内网通信IP |
DW_P | 192.168.37.151 | 192.168.0.141 |
DW_S1 | 192.168.37.152 | 192.168.0.142 |
DW_M | - | 192.168.0.143 |
查看主库DW_P的IP地址
查看备库DW_S1的IP地址
DW_M只有1个NAT网卡ens33,因为192.168.0.xxx是内网地址,所以DW_M无法上网,但是可以和DW_P和DW_S1互相ping通
使用tcpdump命令可以监听到收到的数据包,其中筛选ping对应的icmp包
一定要关闭防火墙,在部署单机的时候没关好像没啥影响,但是部署实时主备时,没关就不能正常运行,因为监视器没办法收到守护进程的广播,没办法将主备库加入守护组中。
关闭防火墙
systemctl stop firewalld
关闭防火墙开机自启动
systemctl disable firewalld
2,准备工作
按照linux安装单机教程进行正常安装,提前规划好路径,3个虚拟机上的dm8都是一样的安装路径,主库和备库需要实例化,路径为CHEN1或者CHEN2,用CHENx统称
安装路径: /home/dmdba/dmdbms
实例路径: /home/dmdba/dmdbms/CHENx
归档目录: /home/dmdba/dmarch
2.1,数据库准备
2.1.1,安装,创建实例
挂载安装包
mkdir /mnt/cdrom
mount /mnt/hgfs/share/dm8_20230105_x86_kylin10_64.iso /mnt/cdrom
主库和备库安装dm8,数据库名CHEN(数据库名必须一样,实例名必须不一样,端口号无所谓)
主库:实例名CHEN1,数据库对外服务的端口号5234
备库:实例名CHEN2,数据库对外服务的端口号5234
su dmdba
./DMInstall.bin -i
cd /home/dmdba/dmdbms/bin
./dminit PATH=/home/dmdba/dmdbms/CHENx INSTANCE_NAME=CHENx DB_NAME=CHEN PORT_NUM=5234
2.1.2,主备库正常启动
主备库创建实例后,第一次启动数据库必须使用dmserver命令进行前台启动,才能完成初始化,不能使用注册服务的后台启动。第一次初始化启动时,不用mount模式,就正常启动。
./dmserver /home/dmdba/dmdbms/CHENx/CHEN/dm.ini
-
2.1.3,主库更新数据库内容
默认用户SYSDBA使用disql命令登录主库CHEN1
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA@192.168.37.151:5234
新建表,插入数据,提交事务
create table users(number char(10), name char(10), password char(10));
insert into users(number,name,password) values('1001','TOM','tom123');
insert into users values('1002','Jerry','jerry123');
commit;
2.2,脱机备份
脱机备份需要主库关闭服务,然后生成备份文件,发给备库,在备库恢复备份之前都不能提供服务
2.2.1,主备库关闭服务
- 关闭后台的注册服务
./DmServerDMSERVER stop
- 关闭前台服务:输入exit回车
2.2.2,生成备份文件
使用dmrman命令在主库生成备份文件
./dmrman
backup database '/home/dmdba/dmdbms/CHEN1/CHEN/dm.ini' full backupset '/home/dmdba/dmbackup/dbbak01';
exit;
或者
./dmrman CTLSTMT="backup database '/home/dmdba/dmdbms/CHEN1/CHEN/dm.ini' full backupset '/home/dmdba/dmbackup/dbbak01'"
2.3.3,传输备份文件
在主库执行scp命令将主库的备份传输到备库
- -r表示递归,将源文件夹下所有文件都传输
- 第一个路径参数/home/dmdba/dmbackup是主库上的源文件目录
- dmdba是备库虚拟机的用户名,之后会需要输入对应登录密码
- 192.168.0.142是备库的内部通信IP地址
- IP地址后的路径参数/home/dmdba/dmbackup是备库的目标存储路径
scp -r /home/dmdba/dmbackup dmdba@192.168.0.142:/home/dmdba/dmbackup
执行完成后,可以在备库对应的文件夹中看到接收的备份文件
2.3.4,备库数据恢复
使用restore和recover命令,依次进行归档还原、redo日志还原、数据库魔数还原。其中脱机备份可以省略第二步,会提示没有产生redo日志
./dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdbms/CHEN2/CHEN/dm.ini' FROM BACKUPSET '/home/dmdba/dmbackup/dbbak01'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/CHEN2/CHEN/dm.ini' FROM BACKUPSET '/home/dmdba/dmbackup/dbbak01'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/CHEN2/CHEN/dm.ini' UPDATE DB_MAGIC"
2.3.5,检查数据是否一致
mount模式启动主备库,登录disql,查看永久魔数和lsn值
x取值1或者2,分别对应主、备库的IP
./dmserver /home/dmdba/dmdbms/CHENx/CHEN/dm.ini mount
./disql SYSDBA/SYSDBA@192.168.37.15x:5234
select permanent_magic;
select file_lsn,cur_lsn from v$rlog;
主库和备库的永久魔数和lsn值必须全部一致,否则说明数据不同步,不能继续安装实时主备,需要重新备份还原。
3,配置实时主备
注意:
- 修改配置文件之前也要记得关闭服务
- 一定要用安装用户dmdba进行配置文件的修改和运行,不能使用root用户,不然之后会出现权限不够等问题
3.1,修改配置文件
3.1.1,dm.ini
主备库的dm.ini只有实例名不一样(以下用x表示,取值1或者2,分别对应主、备库),需要修改以下几个参数
vi /home/dmdba/dmdbms/CHENx/CHEN/dm.ini
INSTANCE_NAME = CHENx
PORT_NUM = 5234
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
MAL_INI = 1
ARCH_INI = 1
3.1.2,dmmal.ini
主备库的dmmal.ini文件完全相同,需要新建文件,自己编辑
vi /home/dmdba/dmdbms/CHENx/CHEN/dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = CHEN1 #主库实例名
MAL_HOST = 192.168.0.141 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5238 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.37.151 #实例的对外服务 IP 地址
MAL_INST_PORT = 5234 #实例的对外服务端口
MAL_DW_PORT = 5239 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5237 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = CHEN2 #备库实例名
MAL_HOST = 192.168.0.142 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5238 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.37.152 #实例的对外服务 IP 地址
MAL_INST_PORT = 5234 #实例的对外服务端口
MAL_DW_PORT = 5239 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5237 #实例监听守护进程 TCP 连接的端口
3.1.3,dmarch.ini
主备库的dmarch.ini文件,只有ARCH_DEST参数不一样,填写对方的实例名,其余参数相同,需要新建文件
vi /home/dmdba/dmdbms/CHENx/CHEN/dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = CHENx #目标实例名 --主库填备库实例名,备库填主库实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dmarch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 4096 #单位 Mb,范围1024~4294967294M(0表示无限制,必须改成非0)
3.1.4,dmwatcher.ini
主备库的dmwatcher.ini文件只有自己的dm.ini文件的路径不同,其余完全相同,需要新建文件,自己编辑,设置数据守护组的OGUID值为754403
vi /home/dmdba/dmdbms/CHENx/CHEN/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 754403 #守护系统唯一 OGUID 值
INST_INI = /home/dmdba/dmdbms/CHENx/CHEN/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动的脚本路径
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
3.2,设置主备库参数
3.2.1,以mount模式启动
主库备库使用dmserver脚本以mount形式启动服务
./dmserver /home/dmdba/dmdbms/CHENx/CHEN/dm.ini mount
3.2.2,设置OGUID
1,主备库使用disql登录
./disql SYSDBA/SYSDBA@192.168.37.15x:5234
2,主备库设置OGUID值,先将文件权限修改为‘可写’
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
sp_set_oguid(754403);
3.2.3,修改数据库模式
一定要先设置OGUID值,然后修改模式。因为修改模式之后,就不能再设置OGUID值了,就无法搭建数据守护了
主库修改为primary模式
alter database primary;
备库修改为standby模式
alter database standby;
然后将文件权限修改为‘不可写’
SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
3.2.4,查看数据库信息
查看归档信息
select arch_mode from v$database;
查看归档日志信息
select arch_name,arch_type,arch_dest from v$DM_arch_ini;
查看OGUID
select oguid from v$instance;
查看MAL系统信息(全局)
select * from v$DM_mal_ini;
3.3,配置守护进程
数据库服务mount模式开启状态下,前台启动守护进程
./dmwatcher /home/dmdba/dmdbms/CHENx/CHEN/dmwatcher.ini
3.4,配置监视器
监视器节点,DW_M,不用创建实例
查看ip addr
配置dmmonitor.ini文件
vi /home/dmdba/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /home/dmdba/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 1024 #不限定日志文件总占用空间(必须改为非0)
[GRP1]
MON_INST_OGUID = 754403 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST, PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.0.141:5239
MON_DW_IP = 192.168.0.142:5239
启动监视器
cd /home/dmdba/dmdbms/bin
./dmmonitor /home/dmdba/dmdbms/bin/dmmonitor.ini
输入help查看可选参数
如果主备库和守护进程运行正常,则打开监视器的时候,会自动连接成功,并显示当前组内成员,还会自动把主备库从mount状态切换到open状态,即主备库可以正常提供读写服务了(mount状态下只能修改数据库设置,不能进行读写数据操作)
输入show查看集群状态
4,主备同步测试
主库插入数据
insert into users values('1003','Mike','mike123');
select * from users;
备库这边可以看到新插入的数据
说明实时主备搭建成功
5,主备切换测试
5.1,主库断网,备库接管
监视器show查看当前守护组状态
关闭主库CHEN1的网络
systemctl stop network
主库的守护进程会报错并自动退出
但服务和守护的两个进程还在,不用杀进程重新开启服务,不用在主备库操作,等网络恢复后实时主备功能会自动还原
disql命令显示连接丢失
备库守护进程show link,发现主库不在列表里面
监视器会自动提示,原主库CHEN1响应超时,自动切换CHEN2为主库,CHEN1为备库
监视器show当前状态
在CHEN2插入一条新数据,成功,说明CHEN2为主库,因为备库不能写只能读
5.2,恢复主库网络
恢复CHEN1的网络
systemctl start network
server和watcher的进程还在的话,会自动重新连接CHEN1
监视器自动显示主备库状态变化
监视器show当前状态
一般数据库服务和守护进程都还是开启的,如果进程没了,可以使用mount模式启动服务器,然后启动守护进程,然后会自动连接上监视器,并且CHEN1会自动切换回主库
但是数据丢了,因为没有commit!
使用disql登录CHEN1,查询发现数据丢失了,不仅是在CHEN2上插入的1004看不到,之前测试同步性时候插入的1003也看不到。因为没有commit,系统突然断网了,数据就没了。
但是可以看到1001和1002,就是一开始脱机备份之前生成了备份文件的。
而且,CHEN2在自动切换成备库之后,和主库CHEN1同步了,也只能看到1001和1002。
所以要记得及时commit数据,并定期备份。
5.3,备库断网,不影响主库
关闭备库CHEN2的网络
systemctl stop network
监视器会提示备库CHEN2连接超时
监视器show当前状态,CHEN2仍然是备库但数据守护失效
5.4,恢复备库网络
恢复CHEN2的网络
systemctl start network
监视器显示,CHEN2守护进程会自动进行数据库的状态恢复
监视器show当前状态,发现一切恢复正常
6,一些补充
6.1,注册服务
注册为系统服务后可以在后台启动数据库,关掉命令行窗口也不会断开服务
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dmdbms/CHEN1/CHEN/dm.ini -p CHEN
cp /home/dmdba/dmdbms/bin/DmServiceCHEN /etc/rc.d/init.d/DmServiceCHEN
ln -s /etc/rc.d/init.d/DmServiceCHEN /etc/rc.d/rc0.d/K02DmServiceCHEN
ln -s /etc/rc.d/init.d/DmServiceCHEN /etc/rc.d/rc1.d/K02DmServiceCHEN
ln -s /etc/rc.d/init.d/DmServiceCHEN /etc/rc.d/rc2.d/S98DmServiceCHEN
ln -s /etc/rc.d/init.d/DmServiceCHEN /etc/rc.d/rc3.d/S98DmServiceCHEN
ln -s /etc/rc.d/init.d/DmServiceCHEN /etc/rc.d/rc4.d/S98DmServiceCHEN
ln -s /etc/rc.d/init.d/DmServiceCHEN /etc/rc.d/rc5.d/S98DmServiceCHEN
ln -s /etc/rc.d/init.d/DmServiceCHEN /etc/rc.d/rc6.d/K02DmServiceCHEN
注册并启动守护进程
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmwatcher -watcher_ini /home/dmdba/dmdbms/CHENx/CHEN/dmwatcher.ini -p CHEN
systemctl start DmWatcherServiceCHEN
6.2,启动服务
- 使用注册服务后台启动,或,命令行前台启动
service DmserviceCHEN start
或
./dmserver /home/dmdba/dmdbms/CHEN1/CHEN/dm.ini
如果发现实例已经在运行了,应该是之前在后台运行的,需要先关掉,再以mount形式启动
查看一下是不是有对应的进程
ps -ef|grep dm.ini
关掉对应的服务,然后就没有对应进程了
./DmServiceCHEN stop
6.3,开启关闭顺序
开启顺序:
实例dmserver-->守护进程dmwatcher-->监视器dmmonitor
关闭守护系统时,必须按照一定的顺序来关闭守护进程和数据库实例。特别是自动切换模式,如果退出守护进程或主备库的顺序不正确,可能会引起主备切换,甚至造成守护进程组分裂。
通过监视器执行 Stop Group 命令关闭数据守护系统,是最简单、安全的方式。命令执行成功后,数据库实例正常关闭。但守护进程并没有真正退出,而是将状态切换为 Shutdown 状态。
Stop Group 命令内部流程如下:
- 通知守护进程切换为 Shutdown 状态
- 通知主库退出
- 通知其他备库退出
如果使用手动方式关闭数据守护系统,请严格按照以下顺序执行:
- 如果启动了确认监视器,先关闭确认监视器(防止自动接管)
- 关闭备库守护进程(防止重启实例)
- 关闭主库守护进程(防止重启实例)
- Shutdown 主库
- Shutdown 备库
关闭顺序:
监视器dmmonitor-->备机守护进程dmwatcher-->主机守护进程dmwatcher-->主机实例-->备机实例
6.4,关闭防火墙
关闭防火墙
systemctl stop firewalld
关闭防火墙开机自启动
systemctl disable firewalld
6.5,使用root用户修改配置文件
进行实时主备部署时,应该切换为安装用户dmdba,不能使用root用户,不然之后会部署失败报错,因为很多文件的读写权限都是root,使用其他用户进行运行时就会出现权限不够等问题。
但是如果不小心忘记切换用户而修改了配置文件,也有补救的办法,那就是事后手动修改文件的所有权,具体改哪些文件,就需要自己去看服务器、守护进程、监视器等的log文件,查看其中的warning和error,然后查看对应目录下文件的权限,然后把所有者为root的修改为dmdba,然后重新启动服务。总之还是有点麻烦,只能作为不方便重新部署的补救办法,最好还是一开始就使用dmdba用户进行部署安装,以免出现其他解决不了的问题。
比如,查看log文件夹发现有文件的用户名和用户组是root,于是把该文件夹的所属用户都修改为root。
vi dm_dmwatcher_CHEN2_202407.log
cd /home/dmdba/dmdbms/log/
ll
cd /home/dmdba/dmdbms/
chown -R dmdba:dinstall log/