达梦数据库主备集群(数据守护)搭建-主库需要停机

环境:
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 ##组名.实例名 

 

posted @   slnngk  阅读(1005)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示