达梦主从部署(主库在线备份)
环境:
OS:Centos 7
DB:V8
主备库都已经安装好了数据库软件和数据库实例
主库:192.168.1.135 5236
备库:192.168.1.134 5236
监视器:192.168.1.135
-------------------------------------------------------------------------主库操作----------------------------------------------------------------
1.确保主库是否在归档模式
SQL> select name,arch_mode from v$database;
LINEID NAME ARCH_MODE
---------- ------ ---------
1 slnngk Y
used time: 1.576(ms). Execute id is 710.
若主库不在归档模式,需要配置为归档模式
2.确保主库存在dmmal.ini文件
若该文件不存在需要进行手工创建
文件内容如下:
[dmdba@localhost slnngk]$ more dmmal.ini
#DaMeng Database Mail Configuration file
#this is comments
MAL_CHECK_INTERVAL = 5
MAL_COMBIN_BUF_SIZE = 0
MAL_SEND_THRESHOLD = 2048
MAL_CONN_FAIL_INTERVAL = 5
MAL_LOGIN_TIMEOUT = 15
MAL_BUF_SIZE = 100
MAL_SYS_BUF_SIZE = 0
MAL_VPOOL_SIZE = 128
MAL_COMPRESS_LEVEL = 0
MAL_TEMP_PATH =
[MAL_INST1]
MAL_INST_NAME = SLNNGK
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_LINK_MAGIC = 0
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = SLNNGKBAK
MAL_HOST = 192.168.1.134
MAL_PORT = 61141
MAL_INST_HOST = 192.168.1.134
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
MAL_LINK_MAGIC = 0
MAL_INST_DW_PORT = 33141
说明,若已经存在dmmal.ini文件,但是没有对方节点的部分,如这里的MAL_INST2,那么可以通过调用存储过程的方式修改
如下:
[dmdba@localhost arch]$ disql sysdba/dameng123
SQL>SF_MAL_CONFIG(1,0); ##设置配置状态
SQL>SF_MAL_INST_ADD('MAL_INST2','SLNNGKBAK','192.168.1.134',61141,'192.168.1.134',5236,52141,0,33141); ##新增备库节点信息
SQL>SF_MAL_CONFIG_APPLY(); ##将MAL配置生效
SQL>SF_MAL_CONFIG(0,0); ##取消配置状态
发现我这里还报错误,原因是需要提前配置好dmmal.ini(至少包括自己部分),同时需要在dm.ini参数中打开MAL_INI=1,然后重启数据库.
SQL> SF_MAL_CONFIG(1,0);
SF_MAL_CONFIG(1,0);
[-9501]:MAL sys has not configured or server is not enterprise version.
3.修改dm.ini文件
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
上面这几个参数也可以使用存储过程进行修改
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SP_SET_PARA_VALUE(1, 'ENABLE_OFFLINE_TS', 2);
SP_SET_PARA_VALUE(2, 'MAL_INI', 1); ## 该参数配置了dmmal.ini文件的话,会自动设置为1
SP_SET_PARA_VALUE(2, 'ARCH_INI', 1);## 该参数设置了归档模式,会自动设置为1
获取参数值:
select SF_GET_PARA_VALUE(1,'MAL_INI');
select SF_GET_PARA_VALUE(1,'ALTER_MODE_STATUS');
select SF_GET_PARA_VALUE(1,'ENABLE_OFFLINE_TS');
4.主库添加远程归档(这里需要在mount模式下才能修改,说明主库是需要重启了的)
SQL>alter database mount;
SQL>alter database add archivelog 'DEST= SLNNGKBAK, TYPE= REALTIME';
SQL>alter database open;
这个时候主库的dmarch.ini会自动添加了配置项
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdbms/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 204800
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = SLNNGKBAK
5.配置 dmwatcher.ini #主备库配置一致
[GRP1]
DW_TYPE = GLOBAL ##全局守护类型
DW_MODE = AUTO ##手工切换设置为MANUAL 自动切换设置为AUTO,自动切换模式必须部署一个确认监视器(参数值为1)才会自动切换
DW_ERROR_TIME = 10 ##远程守护进程故障认定时间
INST_RECOVER_TIME = 60 ##主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 ##本地实例故障认定时间
INST_OGUID = 453332 ##守护系统唯一 OGUID 值
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 ##指定备库重演日志的时间阀值,默认关闭
6.备份主库(联机备份在disql下进行)
disql sysdba/dameng123
SQL> backup database full backupset '/dmdbms/backup';
executed successfully
used time: 00:00:04.066. Execute id is 1000.
7.将备份集scp拷贝到备库
su - dmdba
scp /dmdbms/backup/backup.bak dmdba@192.168.1.134:/dmdbms/backup/
scp /dmdbms/backup/backup_1.bak dmdba@192.168.1.134:/dmdbms/backup/
scp /dmdbms/backup/backup.meta dmdba@192.168.1.134:/dmdbms/backup/
--------------------------------------------------------备库上的操作------------------------------------------------
1.停掉备库
若之前已经部署安装了的,需要将备库实例停掉
systemctl stop DmServiceslnngk.service
若备库还没有安装数据库的需要进行初始化数据库
[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
这里可以尝试是否可以启动
systemctl start DmServiceslnngk
systemctl stop DmServiceslnngk
2.恢复
该步骤需要将备库停掉(若启动了的话)
进入到数据目录,删除不需要的文件,注意某些版本需要保留SYSTEM.DBF文件,我这里的版本可以不需要该文件
[dmdba@host02 DAMENG]$ cd /dmdbms/data/slnngk
[dmdba@host02 DAMENG]$ rm *.log
[dmdba@host02 DAMENG]$ rm *.DBF
[dmdba@host02 DAMENG]$ rm dm_service.prikey
[dmdba@host02 DAMENG]$ rm -rf HMAIN
[dmdba@host02 DAMENG]$ rm -rf trace
[dmdba@host02 DAMENG]$ rm sqllog.ini
最后数据目录的文件如下:
[dmdba@host02 DAMENG]$ ls -al
total 68
drwxr-xr-x 4 dmdba dinstall 60 Mar 27 15:28 .
drwxr-xr-x 3 dmdba dinstall 20 Mar 27 15:17 ..
drwxr-xr-x 2 dmdba dinstall 6 Mar 27 15:17 bak
drwxr-xr-x 2 dmdba dinstall 78 Mar 27 15:18 ctl_bak
-rw-r--r-- 1 dmdba dinstall 5632 Mar 27 15:18 dm.ctl
-rw-r--r-- 1 dmdba dinstall 59755 Mar 27 15:17 dm.ini
执行恢复命令
[dmdba@host02 DAMENG]$ dmrman
RMAN> restore database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
RMAN> recover database '/dmdbms/data/slnngk/dm.ini' from backupset '/dmdbms/backup';
RMAN> recover database '/dmdbms/data/slnngk/dm.ini' update db_magic;
3.修改dm.ini文件
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
INSTANCE_NAME= SLNNGKBAK #备库的实例名不能与主库一样 该参数可以不需要配置
3.配置dmmal.ini文件
将主库的该文件拷贝到备库相应的位置,该文件主备库要一致
主库上执行:
scp /dmdbms/data/slnngk/dmmal.ini dmdba@192.168.1.134:/dmdbms/data/slnngk/
4.配置归档文件
主备库的归档日志是一样的,只是需要修改实时归档的arch_dest指向对方
vi dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdbms/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 204800
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = SLNNGK
5.配置 dmwatcher.ini #主备库配置一致
可以从主库拷贝一份过来
[GRP1]
DW_TYPE = GLOBAL ##全局守护类型
DW_MODE = AUTO ##手工切换设置为MANUAL 自动切换设置为AUTO,自动切换模式必须部署一个确认监视器(参数值为1)才会自动切换
DW_ERROR_TIME = 10 ##远程守护进程故障认定时间
INST_RECOVER_TIME = 60 ##主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 ##本地实例故障认定时间
INST_OGUID = 453332 ##守护系统唯一 OGUID 值
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.mount方式启动备库
su - dmdba
nohup dmserver /dmdbms/data/slnngk/dm.ini mount>dmserver.log &
不知道服务的方式如何启动到mount
systemctl start DmServiceslnngk.service
----------------------------------------------------主备库的操作--------------------------------------------
1.启动命令行工具 disql,登录主备库设置 OGUID 值和数据库模式.
A.主库
disql sysdba/dameng123
alter database mount;
sp_set_oguid(453332);
alter database primary;
B.备库
disql sysdba/dameng123
sp_set_oguid(453332);
alter database standby;
这个时候数据库是在mount状态的:
SQL> select status$,mode$ from v$instance;
LINEID status$ mode$
---------- ------- -------
1 MOUNT PRIMARY
used time: 1.370(ms). Execute id is 801.
SQL> select status$,mode$ from v$instance;
LINEID status$ mode$
---------- ------- -------
1 MOUNT STANDBY
2.注册 dmwatcher 服务
(root账号下执行)
主库
[root@host01 root]# cd /dmdbms/product/script/root
[root@host01 root]#/dmdbms/product/script/root/dm_service_installer.sh -t dmwatcher -p GRP1 -watcher_ini /dmdbms/data/slnngk/dmwatcher.ini
服务方式启动
systemctl start DmWatcherServiceGRP1
备库
[root@host02 root]# cd /dmdbms/product/script/root
[root@host02 root]# /dmdbms/product/script/root/dm_service_installer.sh -t dmwatcher -p GRP1 -watcher_ini /dmdbms/data/slnngk/dmwatcher.ini
systemctl start DmWatcherServiceGRP1
3.验证
从库:
SQL> select status$,mode$ from v$instance;
LINEID STATUS$ MODE$
---------- ------- -------
1 OPEN STANDBY
used time: 4.518(ms). Execute id is 100.
4.数据验证
主库上建表并写入数据
[dmdba@localhost ~]$ disql hxl/dameng123
create table tb_test01
(
id number,
name varchar(32)
);
insert into tb_test01 values(1,'name1');
insert into tb_test01 values(2,'name2');
insert into tb_test01 values(3,'name3');
insert into tb_test01 values(4,'name4');
insert into tb_test01 values(5,'name5');
commit;
从库上登陆查看:
[dmdba@localhost ~]$ disql hxl/dameng123
SQL> select * from tb_test01;
LINEID ID NAME
---------- -- -----
1 1 name1
2 2 name2
3 3 name3
4 4 name4
5 5 name5
used time: 3.782(ms). Execute id is 200.
5.将备库以服务的方式启动
之前我们是使用命令的方式启动备库到mount状态的
su - dmdba
nohup dmserver /dmdbms/data/slnngk/dm.ini mount>dmserver.log &
我们需要改成服务的方式启动
停掉备库
[dmdba@localhost ~]$ disql sysdba/dameng123
SQL> shutdown immediate;
executed successfully
used time: 0.555(ms). Execute id is 0.
这里停掉了,但是过一会儿,dmwatcher会把dmserver进程重新拉起来,然后打开数据到open状态
采用杀掉进程的方式
[root@localhost log]# ps -ef|grep slnngk
dmdba 14335 1 0 14:31 ? 00:00:02 /dmdbms/product/bin/dmwatcher path=/dmdbms/data/slnngk/dmwatcher.ini -noconsole
dmdba 15376 1 0 14:43 ? 00:00:04 /dmdbms/product/bin/dmserver /dmdbms/data/slnngk/dm.ini mount
root 19333 7733 0 15:22 pts/3 00:00:00 grep --color=auto slnngk
kill -9 14335
kill -9 15376
然后使用服务的方式启动(root账号):
systemctl start DmServiceslnngk.service ##实例进程
systemctl start DmWatcherServiceGRP1 ##watcher进程
说明:
我们在部署从库的时候,主库是对外提供服务的,部署从库这段时间生成的数据(如创建表空间,添加表空间)是会自动同步到从库的!!!
--------------------------------------------------------------模拟破坏主库-----------------------------------------------------
1.把主库直接关机或是杀掉主库进程
[root@localhost ~]# ps -ef|grep slnngk
dmdba 27457 1 0 14:30 ? 00:00:02 /dmdbms/product/bin/dmwatcher path=/dmdbms/data/slnngk/dmwatcher.ini -noconsole
dmdba 27879 1 0 14:34 ? 00:00:04 /dmdbms/product/bin/dmserver /dmdbms/data/slnngk/dm.ini mount
kill -9 27879
kill -9 27457
[root@localhost ~]# ps -ef|grep slnngk
root 32313 6195 0 15:13 pts/7 00:00:00 grep --color=auto slnngk
2.查看备库的状态
[dmdba@localhost ~]$ disql sysdba/dameng123
SQL> select status$,mode$ from v$instance;
LINEID STATUS$ MODE$
---------- ------- -------
1 OPEN STANDBY
used time: 2.256(ms). Execute id is 200.
我们这里配置的是手动方式,备库不会自动切换到主库的
DW_MODE = MANUAL ##手工切换 AUTO自动切换模式必须部署一个确认监视器
3.重新启动主库
systemctl start DmServiceslnngk.service ##实例进程
systemctl start DmWatcherServiceGRP1 ##watcher进程
Server[LOCALHOST:5236]:mode is primary, state is open
login used time : 3.186(ms)
disql V8
SQL> select status$,mode$ from v$instance;
LINEID STATUS$ MODE$
---------- ------- -------
1 OPEN PRIMARY
used time: 4.125(ms). Execute id is 500.
这个时候重启后原来的主库角色没有改变.
--------------------------------------------------------配置监视器--------------------------------------------------
我这里是在其中一台机器上部署监视器,地址为:192.168.1.135
$vi /dmdbms/data/slnngk/dmmonitor.ini
MON_DW_CONFIRM= 1 #1为确认监控器 0 为普通监控器 我这里配置为0,因为我配置的是手工模式,若是配置AUTO模式,需要配置1 确认监控器 否则从库停掉的话,主库在挂起模式SUSPEND
MON_LOG_PATH= /dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL= 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE= 512 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT=0 #不限定日志文件总占用空间
[GRP1] ##注意这里的组名必须跟dmwatcher.ini定义的保持一致
MON_INST_OGUID = 453332 #组 GRP_RW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_RW 的守护进程的连接信息,以"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
2.注册服务
[root@localhost ~]# /dmdbms/product/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdbms/data/slnngk/dmmonitor.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmMonitorServiceMonitor.service to /usr/lib/systemd/system/DmMonitorServiceMonitor.service.
Finished to create the service (DmMonitorServiceMonitor)
3.启动服务
[root@localhost ~]#systemctl start DmMonitorServiceMonitor
4.手工启动查看
su - dmdba
[dmdba@localhost log]$ dmmonitor /dmdbms/data/slnngk/dmmonitor.ini
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-07-15 判断某个目录下半小时内是否有新文件
2021-07-15 centos 多路径下挂载磁盘目录
2021-07-15 rac多路径下添加lun(centos 7)