环境:
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
2.主库需要配置归档
若未安装主库的可以使用如下语句进行安装主库
[root@localhost ~]# su - dmdba
[dmdba@localhost ~]$ cd /dmdbms/product/bin
[dmdba@localhost ~]$./dminit path=/dmdbms/data charset=1 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 ~]$./dminit path=/dmdbms/data charset=1 db_name=slnngk instance_name=slnngkbak SYSDBA_PWD="dameng123" SYSAUDITOR_PWD="dameng123"
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执行数据库还原
这个时候备库是没有启动的,疑惑备库原来初始化的数据目录下的文件是否可以删除掉?
备库前车初始化的文件可以删除
[dmdba@host135 slnngk]$cd /dmdbms/data/slnngk
[dmdba@host135 slnngk]$ rm *.log
[dmdba@host135 slnngk]$ rm *.DBF
[dmdba@host135 slnngk]$ cd ctl_bak
[dmdba@host135 ctl_bak]$ rm dm_20220810161243_244942.ctl
[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 ##手工切换 AUTO自动切换模式必须部署一个确认监视器
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.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 数据库
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.注册守护进程
主库: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;
从库查询
[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.注册监控器
我这里是在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 确认监视器模式
[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