第8章 控制文件的备份与恢复
控制文件通常有多个,互为镜像,实例读的是第一个文件,写的是全部文件。
第一个文件是show parameter control_files查询出来的排第一的那个文件。
控制文件损坏,实例通常只能启动到nomount状态。
备份控制文件
- 在线镜像备份
- 多个互为镜像的控制文件,建议存放在不同磁盘路径下,控制文件损坏时的首选恢复,只要用正常的文件替换损坏的文件即可。
- 自动备份
#开启显式自动备份,默认是OFF
#备份路径在快速恢复区的autobackup目录内
configure controlfile autobackup on;
#备份时机:
#1、RMAN执行任何备份操作
#2、数据库物理结构发生变化,比如新增数据文件(延迟备份,并非每新增一个数据文件就立即启动备份,所以一次新增多个数据文件时可能只有一个自动备份)
#使用RMAN命令备份第一个数据文件时,备份路径在backupset目录
#以下三个命令都会被分datafile 1
backup datafile 1;
backup database;
backup tablespace system;
- 手动备份
#RMAN方式
backup as backupset current controlfile;
#列出备份集备份
list backup of controlfile;
#RMAN方式
backup as copy current controlfile format '/backup/control.bak';
#SQL PLUS方式
alter database backup controlfile to '/backup/control.bak2';
#列出镜像复制备份
list copy of controlfile;
#创建跟踪文件
alter database backup controlfile to trace;
#查看转储文件路径
select value from v$diag_info where name='Default Trace File';
#查看转储文件
more ...
恢复控制文件
先从备份还原,然后使用重做日志恢复。
- 在线镜像备份
- 多路控制文件中的一个,所有信息与当前控制文件都是相同的
- 结构备份
- 数据库的物理结构信息与当前控制文件相同,序列号、SCN等信息比当前控制文件旧
- 历史备份
- 数据库的物理结构信息、序列号、SCN等信息都比当前控制文件旧
结构备份、历史备份恢复时有三个步骤:
- 从备份中还原控制文件
- 使用重做日志恢复
- 以resetlogs的方式打开数据库
利用自动备份恢复
#1、启动实例到nomount状态
startup nomount;
#2、rman下从自动备份还原控制文件(启用了快速恢复区)
#参数 db_recovery_file_dest 指定了快速恢复区路径
restore controlfile from autobackup;
#3、rman下启动实例到mount状态
mount database;
#4、rman下恢复数据库(找到current状态的在线重做日志作为恢复的终点,读取日志文件(包括归档日志)恢复数据文件和控制文件的部分信息)
recover database;
#5、resetlogs方式打开数据库(仅用来重设日志序列号,没有丢失事务,与不完全恢复的resetlogs不同)
alter database open resetlogs;
利用手动备份恢复
除第2步需手工指定备份文件路径,其余步骤与自动备份相同
#1、启动实例到nomount状态
startup nomount;
#2、rman下从备份还原控制文件(手工指定备份文件路径)
restore controlfile from '/backup/controlfile.bak';
#3、rman下启动实例到mount状态
mount database;
#4、rman下恢复数据库
recover database;
#5、resetlogs方式打开数据库(仅用来重设日志序列号,没有丢失事务,与不完全恢复的resetlogs不同)
alter database open resetlogs;
利用历史备份恢复
- 自动修复不一致
#场景:备份了控制文件后新建了数据文件或表空间,备份的控制文件中不包含新建的文件信息,此时控制文件损坏需要恢复
#恢复步骤
RMAN> restore controlfile from '/u01/oracle/app/oracle/fast_recovery_area/HISDB/backupset/2024_06_04/o1_mf_ncnnf_TAG20240604T205454_m5y3nzjb_.bkp';
RMAN> mount database;
RMAN> recover database;
RMAN> alter database open resetlogs;
#检查新建的数据文件已在控制文件中
SQL> select name from v$datafile;
- 手动修复不一致
#场景:备份了控制文件后删除了某个数据文件或表空间,备份的控制文件中包含已被删除的文件信息,此时控制文件损坏需要恢复
#还原控制文件、mount数据库
RMAN> restore controlfile from '/u01/oracle/app/oracle/fast_recovery_area/HISDB/backupset/2024_06_04/o1_mf_ncnnf_TAG20240604T205454_m5y3nzjb_.bkp';
RMAN> mount database;
#检查控制文件信息,发现之前已被删除的5号文件还在控制文件中
SQL> select file#, name from v$datafile;
#使5号文件离线
SQL> alter database datafile 5 offline;
#或者直接跳过被删除的表空间,更简单。152页
RMAN> recover database skip tablespace newts;
RMAN> alter database open resetlogs;
#查询在线重做日志信息
SQL> SELECT member FROM V$logfile;
#在sqlplus中恢复控制文件,在提示框中输入在线重做日志文件路径,从最小一个开始输,如下图
SQL> recover database using backup controlfile;
#打开数据库
RMAN> alter database open resetlogs;
#检查新建的数据文件已在控制文件中
SQL> select name from v$datafile;
缺失归档日志时的恢复
#1、还原控制文件
RMAN> restore controlfile from autobackup;
#2、装载数据库
RMAN> mount database;
#3、恢复数据库,会报错
RMAN> recover database;
#4、生成控制文件信息到trace中
SQL> alter database backup controlfile to trace;
#5、确认trace文件路径
SQL> select value from v$diag_info where name='Default Trace File';
#6、重启数据库到nomount
SQL> startup force nomount;
#7、查看trace文件,在其中找到并在sqlplus中执行NORESETLOGS版本的create controlfile命令 156页
more /u01/oracle/app/oracle/diag/rdbms/testdb/TESTDB/trace/TESTDB_ora_3568.trc
#8、恢复数据库,会报错,只在归档目录中找日志,不在在线日志目录中找
RMAN> recover database;
#9、根据报错的序号查询在线重做日志
SQL> select sequence#,status,group# from v$log;
#10、在sqlplus中恢复控制文件,在提示框中输入在线重做日志文件路径,输第9步查询到的序号日志路径
SQL> recover database using backup controlfile;
#10、打开数据库
SQL> alter database open resetlogs;
#11、找回临时数据
SQL> alter tablespace temp add tempfile '/u01/data/TESTDB/temp01.dbf' reuse;
以noresetlogs收尾
158页