文章目录
- 一、说明
- 二、环境信息
- 2.1.主备库环境信息
- 2.2.检查主备是否同步正常
- 三、模拟日志断档
- 3.1.模拟主库归档文件丢失
- 3.2 查看主库状态出现GAP
- 四、RMAN增量备份恢复备库同步
- 4.1 RMAN增量恢复备库
- 4.2 开启备库redo同步
- 4.3 主备库验证同步
一、说明
模拟Oracle主库归档文件丢失,备库出现gap,通过增量备份方式恢复备库。
(本文档模拟断档期间没有新增数据文件的情况,断档期间有新增数据文件的情况需要在备库在备库恢复控制文件并注册数据文件后再restore恢复新增数据文件然后再重新命名控制文件中的数据文件,再执行 RECOVER DATABASE NOREDO
增量备份恢复备库)
二、环境信息
2.1.主备库环境信息
主机名 | IP | 数据库版本 | |
---|---|---|---|
主库 | p19c | 192.168.80.40 | 19.3 |
备库 | p19cstd | 192.168.80.39 | 19.3 |
2.2.检查主备是否同步正常
-- 创建测试表并插入数据
CREATE TABLE zyy_test (
id INT PRIMARY KEY,
name VARCHAR2(50) NOT NULL
);
BEGIN
FOR i IN 1..30 LOOP
INSERT INTO zyy_test (id, name) VALUES (i, 'Name' || TO_CHAR(i));
END LOOP;
COMMIT;
END;
/
commit;
分别在主库备库查看
select count(*) from zyy_test;
主库查看:
备库查看:
主备同步正常。
三、模拟日志断档
3.1.模拟主库归档文件丢失
3.1.1 备库取消日志实时应用
alter database recover managed standby database cancel;
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;
备库mrp进程已关闭。
3.1.2在主库删除表数据并切换日志
DELETE FROM zyy_test WHERE id > 27;
commit;
select count(*) from zyy_test;
主库查看:
备库由于关闭了日志实时同步,表数据不会发生改变:
3.1.3 在主库切换日志查看当前日志编号
alter system switch logfile;
set linesize 200
select * from v$log;
由上图可以看到主库当前的日志编号是12。
3.1.4 在主库上再建一个表,查看主备日志
create table zyy_tables as select * from dba_tables;
commit;
select count(*) from zyy_tables;
主库切换日志再次查看
alter system switch logfile;
select * from v$log;
由上图可以看到主库当前的日志编号是13。
查看备库归档日志应用情况:
select sequence#,applied,archived,deleted from v$archived_log order by sequence#;
由于备库关闭了归档日志实时同步,所以11,12号归档日志已经传到备库但没有应用。
3.1.5 主备库删除13号归档日志
cd /u01/app/archive
ls
rm 1_13_1165425165.arc
主库:
备库:
3.1.6 对主库进行ddl,查看主备日志
alter database recover managed standby database using current logfile disconnect;
主库进行ddl操作,并切换日志后查看主备库日志应用情况:
delete from zyy_test where id>18;
alter system switch logfile;
delete from zyy_test where id>15;
alter system switch logfile;
delete from zyy_test where id>14;
alter system switch logfile;
delete from zyy_test where id>12;
alter system switch logfile;
commit;
set linesize 999
select * from v$log;
主库:
select sequence#,applied,archived,deleted from v$archived_log order by sequence#;
备库:
由于主备库12号日志被删除,导致备库12号及以后的日志都无法应用。
3.1.7 查看主备库测试表信息
select count(*) from zyy_test;
select count(*) from zyy_tables;
主库:
备库:
由于备库缺少12号日志,导致主备库测试表信息不一致。
3.2 查看主库状态出现GAP
select name,open_mode,database_role,switchover_status from v$database;
四、RMAN增量备份恢复备库同步
4.1 RMAN增量恢复备库
4.1.1 取消备库实时同步
alter database recover managed standby database cancel;
4.1.2 确认备库数据文件头最小的SCN
select current_scn from v$database;
select min(checkpoint_change#) from v$datafile_header;
4.1.3 在主库进行增量备份
rman target/
backup incremental from scn 2259313 database format '/home/oracle/backup/ForStandby_%U' tag
'FORSTANDBY';
4.1.4 将主库的备份文件传到备库
scp -r /home/oracle/backup/* oracle@192.168.80.39:/home/oracle/backup/
备库查看:
4.1.5 在备库注册备份片
rman target/
catalog start with '/home/oracle/backup/ForStandby';
4.1.6 在备库执行恢复
备库数据库启动到mount状态
rman target/
shutdown immediate
startup mount
recover database noredo;
4.1.7 在主库生成新的standby控制文件
backup current controlfile for standby format '/home/oracle/backup/ForStandbyCTRL.bck';
查看备库文件:
4.1.8 将主库生成的新standby控制文件传到备库
scp /home/oracle/backup/ForStandbyCTRL.bck oracle@192.168.80.39:/home/oracle/backup/
备库查看:
4.1.9 备份备库数据文件
备份备库数据文件信息,用于之后恢复新的standby控制文件后进行对比
spool datafile_names_p19cbak.txt;
set lines 200;
col name format a60;
select file#, name from v$datafile order by file#;
spool off;
4.1.10 在备库恢复新的standby 控制文件
rman target/
shutdown immediate;
startup nomount;
restore standby controlfile from '/home/oracle/backup/ForStandbyCTRL.bck';
4.1.11 在备库更新控制文件中的数据文件
(注:如果主备库具有相同的目录和名字,此步骤可以省略。我这里主库数据文件位置是’/u01/app/oracle/oradata/P9C/’,备库是’/u01/app/oracle/oradata/P9C/’,应该是需要此步骤的,但不知道为什么后面4.1.13查看重命名数据文件时会报错。)
shutdown
startup mount
catalog start with '/u01/app/oracle/oradata/P19CSTD';
4.1.12 查看主库有没有添加新文件
select file#, name from v$datafile where creation_change# >2259312;
4.1.13 查看重命名数据文件
备库:
switch database to copy;
4.1.14确认增量恢复后,主备库的SCN号没有太大差距
select current_scn from v$database;
主库:
备库:
4.2 开启备库redo同步
4.2.1清理备库standby 日志组
set linesize 999;
col DBID for a20;
select * from v$standby_log
alter database clear logfile group 6;
alter database clear logfile group 7;
alter database clear logfile group 8;
alter database clear logfile group 9;
备库:
4.2.2备库启动redo应用
alter database recover managed standby database disconnect;
主库查看日志:
set linesize 999
select * from v$log;
备库:
select sequence#,applied,archived,deleted from v$archived_log order by sequence#;
(这里正常应该查到apply日志16号)
4.2.3备库开启实时应用
alter database recover managed standby database cancel;
alter database open;
alter database recover managed standby database using current logfile disconnect;
(这里备库打开日志实时应用还是查不到日志编号,后面主库切换日志后可以查到)
4.2.4 主库切换日志,主备库查看日志编号
主库切换日志
alter system switch logfile;
主库查看日志:
备库查看日志编号:
可以看到备库应该应用到17号日志。
4.3 主备库验证同步
select count(*) from zyy_test;
select count(*) from zyy_tables;
主库:
备库:
主库进行ddl操作,验证主备库:
主库:
备库:
主备恢复同步。