达梦数据库主备集群(数据守护)搭建-主库需要停机
环境:
OS:Centos 7
DB:V8
说明:
主库上安装数据库软件和启动数据库,主库在归档模式
从库上只安装了数据库软件
主备库的数据目录一致
说明:
主库上安装数据库软件和启动数据库,主库在归档模式
从库上只安装了数据库软件
主备库的数据目录一致
目录规划(主备一致):
/dmdbms/arch ##归档日志目录
/dmdbms/backup ##dmrman备份目录
/dmdbms/data ##数据目录
/dmdbms/product ##软件安装目录
1.环境准备
服务器 主库IP:192.168.1.134 dm8数据库 实例名:slnngk 端口号:5236
服务器 备库IP:192.168.1.135 dm8数据库 实例名:slnngkbak 端口号:5236
监听器服务器:192.168.1.134(与其中一个节点共用一个机器)
主库instance_name:slnngk
备库 instance_name: slnngkbak
2.主库需要配置归档
若未安装主库的可以使用如下语句进行安装主库
[root@localhost ~]# su - dmdba
[dmdba@localhost ~]$ cd /dmdbms/product/bin
/dmdbms/product/bin/dminit path=/dmdbms/data charset=1 case_sensitive=0 length_in_char=0 db_name=slnngk instance_name=slnngk SYSDBA_PWD="dameng123" SYSAUDITOR_PWD="dameng123"
注册服务
su - root
[root@localhost root]#cd /dmdbms/product/script/root
[root@localhost root]# ./dm_service_installer.sh -t dmserver -dm_ini /dmdbms/data/slnngk/dm.ini -p slnngk
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceslnngk.service to /usr/lib/systemd/system/DmServiceslnngk.service.
Finished to create the service (DmServiceslnngk)
启动主库
[root@localhost root]#systemctl start DmServiceslnngk.service
[root@localhost root]#systemctl status DmServiceslnngk.service
注意这里的实例名与备库要区分
若已经在归档模式的,可以省略该步骤
disql sysdba/dameng123
alter database mount;
alter database add archivelog 'dest=/dmdbms/arch,TYPE=local,FILE_SIZE=2048';
alter database archivelog;
alter database open;
3.初始化备库
因为备库目前只是安装了数据库软件,没有安装数据库,是新的库,可以进行初始化(字符集跟主库保持一致)
[root@localhost ~]# su - dmdba
[dmdba@localhost ~]$ cd /dmdbms/product/bin
[dmdba@localhost ~]$/dmdbms/product/bin/dminit path=/dmdbms/data charset=1 case_sensitive=0 length_in_char=0 db_name=slnngk instance_name=slnngkbak SYSDBA_PWD="dameng123" SYSAUDITOR_PWD="dameng123"
说明:
a.db_name需要给主库一致
b.instance_name 不能与主库相同
c.其他参数需要跟主库保持一致,charset=1 case_sensitive=0 length_in_char=0,若不知道主库的这些信息,可以在主库的data目录下找到初始化的日志文件dminit20240321133803.log 该文件记录了主库安装时的参数信息
d.这个时候可以创建系统服务,我们这里数据库使用的服务名都统一使用:DmServiceslnngk,与主库一致,方便维护
su - root
[root@localhost root]#cd /dmdbms/product/script/root
[root@localhost root]# ./dm_service_installer.sh -t dmserver -dm_ini /dmdbms/data/slnngk/dm.ini -p slnngk
4.关闭主库,以 dmrman 备份数据库
关闭数据库
[dmdba@localhost ~]$ disql sysdba/dameng123
SQL> shutdown immediate;
或是使用操作系统命令关闭
systemctl stop DmServiceslnngk.service
这个时候查看服务情况
systemctl status DmServiceslnngk.service
[root@localhost dmdbms]# su - dmdba
[dmdba@localhost ~]$ dmrman
dmrman V8
RMAN>backup database '/dmdbms/data/slnngk/dm.ini' backupset '/dmdbms/backup';
注意备份目录需要是空目录
备份完成后先不要启动数据库
5.将备份文件复制到备库对应目录下(如果是root用户,复制成功需要将备份文件设置属于dmdba:dinstall用户组)
我这里是使用dmdba账号进行scp传输的
scp -r /dmdbms/backup/* dmdba@192.168.1.135:/dmdbms/backup/
6.备库使用dmrman执行数据库还原
这个时候备库是没有启动的,疑惑备库原来初始化的数据目录下的文件是否可以删除掉?
备库前车初始化的文件可以删除,若之前备库是正在运行的,需要先停掉
systemctl stop DmServiceslnngk.service
[dmdba@host02 DAMENG]$ cd /dmdbms/data/slnngk
[dmdba@host02 DAMENG]$ rm dm_service.prikey
[dmdba@host02 DAMENG]$ rm -rf HMAIN
[dmdba@host02 DAMENG]$ rm MAIN.DBF
[dmdba@host02 DAMENG]$ rm ROLL.DBF
[dmdba@host02 DAMENG]$ rm sqllog.ini
[dmdba@host02 DAMENG]$ rm TEMP.DBF
[dmdba@host02 DAMENG]$ rm -rf trace
[dmdba@host02 DAMENG]$ rm *.log
好像新版本的需要保留SYSTEM.DBF文件,否则提示如下错误
RMAN> restore database '/dmdbms/data/DAMENG/dm.ini' from backupset '/dmdbms/bak';
restore database '/dmdbms/data/DAMENG/dm.ini' from backupset '/dmdbms/bak';
file dm.key not found, use default license!
/dmdbms/data/DAMENG/SYSTEM.DBF not exist
保留如下目录和文件即可,其他的都可以删除掉
[dmdba@host02 DAMENG]$ ls -al
total 10324
drwxr-xr-x 4 dmdba dinstall 78 Mar 21 17:48 .
drwxr-xr-x 3 dmdba dinstall 20 Mar 21 17:47 ..
drwxr-xr-x 2 dmdba dinstall 6 Mar 21 17:47 bak
drwxr-xr-x 2 dmdba dinstall 42 Mar 21 17:47 ctl_bak
-rw-r--r-- 1 dmdba dinstall 5632 Mar 21 17:47 dm.ctl
-rw-r--r-- 1 dmdba dinstall 75709 Mar 21 17:47 dm.ini
-rw-r--r-- 1 dmdba dinstall 10485760 Mar 21 17:47 SYSTEM.DBF
[root@localhost ~]# su - dmdba
[dmdba@localhost ~]$ dmrman
dmrman V8
按顺序执行3个命令:
restore database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
recover database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
recover database '/dmdbms/data/slnngk/dm.ini' update db_magic;
[root@host135 backup]# su - dmdba
Last login: Wed Aug 10 15:15:23 CST 2022 on pts/5
[dmdba@host135 ~]$ dmrman
dmrman V8
RMAN> restore database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
restore database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
file dm.key not found, use default license!
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:05][Remaining:00:00:00]
restore successfully.
time used: 00:00:05.941
RMAN> recover database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
recover database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[37510], file_lsn[37510]
no log generates while the backupset [/dmdbms/backup] created
recover successfully!
time used: 469.501(ms)
RMAN> recover database '/dmdbms/data/slnngk/dm.ini' update db_magic;
recover database '/dmdbms/data/slnngk/dm.ini' update db_magic;
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[37510], file_lsn[37510]
recover successfully!
time used: 00:00:01.409
这个时候备库先不要启动
7.配置集群文件
7.1 vim /dmdbms/data/slnngk/dm.ini #主备库实例都需更改下面参数
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
7.2 vim /dmdbms/data/slnngk/dmmal.ini #主备库配置必须完全一致
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = SLNNGK #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.1.134 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.1.134 #实例的对外服务 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 = SLNNGKBAK
MAL_HOST = 192.168.1.135
MAL_PORT = 61141
MAL_INST_HOST = 192.168.1.135
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
在主库上创建然后scp到备库
scp /dmdbms/data/slnngk/dmmal.ini dmdba@192.168.1.135:/dmdbms/data/slnngk/
7.3 vim /dmdbms/data/slnngk/dmarch.ini
主库:
若主库上已经配置了本地归档的,那么只需要添加ARCHIVE_REALTIME部分
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = SLNNGKBAK #实时归档目标实例名,这里是备库的实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdbms/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0 表示无限制,范围 1024~4294967294M
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
备库:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = SLNNGK #实时归档目标实例名,这里是主库的实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdbms/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 2048 #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位Mb,0 表示无限制,范围 1024~4294967294M
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
7.4 配置/dmdbms/data/slnngk/dmwatcher.ini #主备库配置一致
[GRP1]
DW_TYPE = GLOBAL ##全局守护类型
DW_MODE = AUTO ##手工切换 MANUAL AUTO必须部署一个确认监视器 这里即使配置了AUTO,但是需要配置确认监视器(参数值为1)才会自动切换
DW_ERROR_TIME = 10 ##远程守护进程故障认定时间
INST_RECOVER_TIME = 60 ##主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 ##本地实例故障认定时间
INST_OGUID = 453332 ##守护系统唯一 OGUID 值 这个值可以设置其他的,下面执行命令的时候需要与该值保持一致sp_set_oguid(453332)
INST_INI = /dmdbms/data/slnngk/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 ##打开实例的自动启动功能
INST_STARTUP_CMD = /dmdbms/product/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 ##指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 ##指定备库重演日志的时间阀值,默认关闭
7.5 vim /dmdbms/data/slnngk/dmmonitor.ini
#生产环境如果是自动切换需单独一台服务器配置监视器,我这里部署在其中一台实例上面,部署在主库:192.168.1.134上面
MON_DW_Confirm = 1 ## 0表示普通监视器 ,最多配置8个,1 确认监视器模式
MON_LOG_PATH = /dmdbms/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 = 192.168.1.135:52141
MON_DW_IP = 192.168.1.134:52141
注意这里的日志目录需要存在,不存在需要提前创建好
[root@host134 backup]# su - dmdba
[dmdba@host134 ~]$ mkdir -p /dmdbms/log
8.以 Mount方式启动主备库启动主库
[root@localhost dmdbms]# su - dmdba
[dmdba@host134 ~]$ cd ~
[dmdba@host134 ~]$ nohup dmserver /dmdbms/data/slnngk/dm.ini mount>dmserver.log &
启动备库
[root@host135 backup]#su - dmdba
[dmdba@host135 ~]$cd ~
[dmdba@host135 ~]$nohup dmserver /dmdbms/data/slnngk/dm.ini mount>dmserver.log &
#一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志;
##启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库
若这个时候使用系统命令启动数据库,数据库状态是open状态,而不是mount状态
[root@host01 root]# systemctl start DmServiceslnngk.service
[dmdba@host01 DAMENG]$ disql hxl/dameng123
Server[LOCALHOST:5236]:mode is normal, state is open
login used time : 3.999(ms)
disql V8
SQL>
9.启动命令行工具 disql,登录主备库设置 OGUID 值和数据库模式。
9.1 主库
disql sysdba/dameng123
sp_set_oguid(453332);
alter database primary;
9.2 备库
disql sysdba/dameng123
sp_set_oguid(453332);
alter database standby;
这个时候主备库的数据状态是在mount状态的:
select status$,mode$ from v$instance;
主库:
SQL> select status$,mode$ from v$instance;
LINEID STATUS$ MODE$
---------- ------- -------
1 MOUNT PRIMARY
used time: 2.057(ms). Execute id is 1.
备库:
SQL> select status$,mode$ from v$instance;
LINEID STATUS$ MODE$
---------- ------- -------
1 MOUNT STANDBY
used time: 2.160(ms). Execute id is 1.
10.注册守护进程(DmWatcher)
主从同步可以不需要守护进程,但是主从切换需要启动守护进行
主库:192.168.1.134
su - root
[root@host134 root]# cd /dmdbms/product/script/root
[root@host134 slnngk]#./dm_service_installer.sh -t dmwatcher -p GRP1 -watcher_ini /dmdbms/data/slnngk/dmwatcher.ini
备库2:192.168.1.135
su - root
[root@host135 root]# cd /dmdbms/product/script/root
[root@host135 slnngk]#./dm_service_installer.sh -t dmwatcher -p GRP1 -watcher_ini /dmdbms/data/slnngk/dmwatcher.ini
启动守护进程
每个实例都启动(root账号)
192.168.1.134
[root@host134 dmdba]#systemctl start DmWatcherServiceGRP1
192.168.1.135
[root@host135 dmdba]#systemctl start DmWatcherServiceGRP1
或是使用命令后台执行(主备库都一样执行)
su - dmdba
cd ~
nohup dmwatcher /dmdbms/data/slnngk/dmwatcher.ini>dmwatcher.log &
这个时候守护进程会把数据库从mount状态启动到open状态,目前主备库是open状态了
SQL> select status$,mode$ from v$instance;
LINEID STATUS$ MODE$
---------- ------- -------
1 OPEN PRIMARY
从库:
SQL> select status$,mode$ from v$instance;
LINEID STATUS$ MODE$
---------- ------- -------
1 OPEN STANDBY
used time: 4.518(ms). Execute id is 100.
SQL>
11.注册数据库服务
我们这里2个数据库使用的服务名都统一使用:DmServiceslnngk
su - root
[root@localhost root]#cd /dmdbms/product/script/root
[root@localhost root]# ./dm_service_installer.sh -t dmserver -dm_ini /dmdbms/data/slnngk/dm.ini -p slnngk
11.数据验证
创建表空间和用户
su - dmdba
disql sysdba/dameng123
create tablespace tps_hxl datafile '/dmdbms/data/slnngk/tps_hxl01.DBF' size 1024 autoextend on maxsize 32768; ##这里单位是M,文件目录存储在/dmdata/dmdb/DAMENG,这里设置文件最大值,不设置的话就是16TB
create user hxl identified by dameng123 default tablespace tps_hxl default index tablespace tps_hxl;
grant dba to hxl;
从库查询
SQL> select tablespace_name from SYS.DBA_TABLESPACES;
LINEID TABLESPACE_NAME
---------- ---------------
1 SYSTEM
2 ROLL
3 TEMP
4 MAIN
5 TPS_HXL
6 MAIN
6 rows got
SQL> select username from SYS.DBA_USERS;
LINEID USERNAME
---------- ----------
1 SYSAUDITOR
2 HXL
3 SYSSSO
4 SYSDBA
5 SYS
used time: 25.592(ms). Execute id is 102.
主库建表写入数据
disql hxl/dameng123
create table tb_test(id number,name varchar(32));
insert into tb_test values(1,'name1');
insert into tb_test values(2,'name2');
insert into tb_test values(3,'name3');
insert into tb_test values(4,'name4');
insert into tb_test values(5,'name5');
insert into tb_test values(6,'name6');
insert into tb_test values(7,'name7');
insert into tb_test values(8,'name8');
insert into tb_test values(9,'name9');
insert into tb_test values(10,'name10');
commit;
注意这里需要commit,否则的的话要等很久从库才能查得到这些数据
从库查询
[dmdba@host135 ~]$ disql hxl/dameng123
Server[LOCALHOST:5236]:mode is standby, state is open
login used time : 3.146(ms)
disql V8
SQL> select * from tb_test;
LINEID ID NAME
---------- -- ------
1 1 name1
2 2 name2
3 3 name3
4 4 name4
5 5 name5
6 6 name6
7 7 name7
8 8 name8
9 9 name9
10 10 name10
10 rows got
used time: 3.369(ms). Execute id is 200.
SQL>
12.注册监控器(若不需要自动切换的话,可以不需要注册监控器,该部分省略)
若监视器使用单独机器部署的话,只需要安装数据库软件和配置好dmmonitor.ini文件(该文件目录可自定义,但需要放在DM_HOME目录下,我尝试放到tmp目录,系统监视服务无法启动)即可,不需要初始化数据库的
我这里是在192.168.1.134上面执行
su - root
[root@host134 root]# cd /dmdbms/product/script/root
[root@localhost ~]# ./dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdbms/data/slnngk/dmmonitor.ini
启动监控器
[root@host134 root]# systemctl start DmMonitorServiceMonitor
13.使用监视器
在监视器上执行如下命令,我这里是在192.168.1.134机器上执行
1.登陆监视器模式
[dmdba@host134 ~]$ dmmonitor /dmdbms/data/slnngk/dmmonitor.ini
Exist multiple CONFIRM dmmonitor, can only startup one!
这里是因为使用上面的系统命令启动了,提示有多个监听服务,使用其中一个启动即可,或是使用下面的方式登录监控服务器
这里提示只能配置一个确认监视器,我们拷贝下一份dmmonitor.ini,将MON_DW_Confirm修改为0,改成普通监视器
[dmdba@host134 ~]$ cp /dmdbms/data/slnngk/dmmonitor.ini /dmdbms/data/slnngk/dmmonitor0.ini
vi /dmdbms/data/slnngk/dmmonitor0.ini
如下项修改为0
MON_DW_Confirm = 0 ## 0表示普通监视器 ,最多配置8个,1 确认监视器模式
或是直接修改配置文件dmmonitor.ini,不需要重启动监控服务的(DmMonitorServiceMonitor).
[dmdba@host134 ~]$ dmmonitor /dmdbms/data/slnngk/dmmonitor0.ini
[monitor] 2022-08-11 10:49:00: DMMONITOR[4.0] V8
[monitor] 2022-08-11 10:49:01: DMMONITOR[4.0] IS READY.
[monitor] 2022-08-11 10:49:01: Received message from(SLNNGKBAK)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-08-11 10:49:01 OPEN OK SLNNGKBAK OPEN STANDBY NULL 3 39324 39324
[monitor] 2022-08-11 10:49:02: Received message from(SLNNGK)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2022-08-11 10:49:02 OPEN OK SLNNGK OPEN PRIMARY VALID 3 39325 39326
14.切换命令:
在任何安装有dmmonitor.ini配置文件的机器上都可以登录监视服务器
[dmdba@host02 ~]$ dmmonitor /dmdbms/data/DAMENG/dmmonitor.ini
login ##输入命令
username:sysdba ##账号
password: ##密码
choose switchover GRP1 ##常规切换,主备库完好的情况
choose takeover GRP1 ##故障切换
switchover DAMENGBAK ##正常切换到另外的实例
takeover GRP1.DAMENGBAK ##组名.实例名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?