本篇将介绍各种备份及恢复控制文件的方法,在介绍恢复时,以备份和重做日志(包括归档日志和在线日志)没有丢失为前提。
无备份情况下的控制文件恢复参考13.3,丢失重做日志的情况请参考12篇“不完全数据库恢复”
8.1 控制文件损坏的后果
数据库的控制文件不止一个,进程对其写的操作是针对所有的控制文件,并且写的内容是相同的,所以多个控制文件的内容是完全一样的;
当进程读取控制文件时,读的却总是第一个控制文件的内容(第一个控制文件的定义时control_files初始化参数的第一个文件)。当第一个控制文件损坏,读写操作都是出错。
8.1.1 实例启动时发现损坏
YHQT@ orcl >show parameter control_files NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_files string /u01/app/oracle/oradata/orcl/c ontrol01.ctl, /u01/app/oracle/ oradata/orcl/control02.ctl
3个文件中,任意一个出错,实例将启动不到mount阶段,启动报错
--ORA-00205: error in identifying control file, check alert log for more info
其中一个文件损坏
--ORA-00227: corrupt block detected in control file: (block 0, # blocks )
如果是3个文件全部被删除
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u01/app/oracle/oradata/orcl/control01.ctl'
场景1:db启动时,任意一个控制文件的数据块损坏时的告警
SQL> startup mount; ORACLE instance started. Total System Global Area 1185853440 bytes Fixed Size 2252664 bytes Variable Size 754974856 bytes Database Buffers 419430400 bytes Redo Buffers 9195520 bytes ORA-00227: corrupt block detected in control file: (block 0, # blocks )
场景2:db启动时,任意一个控制文件头损坏,告警日志
ORA-00210: cannot open the specified control file ORA-00202: control file: '/u01/app/oracle/oradata/orcl/control01.ctl' ORA-27048: skgfifi: file header information is invalid ORA-205: signalled during: ALTER DATABASE MOUNT ...
场景3:db启动时,任意控制文件丢失
ORA-00210: cannot open the specified control file ORA-00202: control file: '/u01/app/oracle/oradata/orcl/control01.ctl' ORA-27037: unable to obtain file status Linux-x86_64 Error: 2: No such file or directory Additional information: 3 ORA-205 signalled during: ALTER DATABASE MOUNT...
8.1.2 实例运行时发现损坏
如果任意一个控制在实例运行时损坏,实例起先能够保持OPEN状态,但不能保证所有功能可以正常进行:某些操作可以正常使用,某些直接报错,
最终,实例还是要被关闭(自动或手动)。首先发现问题的极有可能是CKPT进程(该进程每3秒就会写一下控制文件),在alert文件中
ORA-00227: corrupt block detected in control file: (block 1, # blocks 1)
ORA-00202: control file: '/u01/app/oracle/oradata/orcl/control01.ctl'
此时,CKPT将不停的报错,11g自动的洪流控制会选择性的屏蔽重复信息的产生,因为每3秒更新的不属于特别重要的检查点信息,
而是一种对在线重做日志最新状态和当前SCN号的确认信息,只要重做日志健康,这些信息还是可以从重做日志中取得的,实例也不会终止。
对于服务器进程来说,执行一些需要对控制文件读写(只要第一个文件健康,读写操作不报错)的操作,同样也会报错,比如v$database\v$log\v$logfile\v$datafile\v$tempfile等动态视图
SQL> select * from v$datafile; ORA-00227: corrupt block detected in control file: (block 1, # blocks 1) ORA-00202: control file: '/u01/app/oracle/oradata/orcl/control01.ctl'
比如再创建表空间
SQL>create tablespace yhqt datafile '/u01/app/oracle/oradata/orcl/yhqt01.dbf' size 50M;
也会报同样的错误
CKPT会在发起检查点时终止实例,因为检查点需要写控制文件,并且检查点被认为是不允许有任何差错的重要操作
CKPT (ospid:15711): terminating the instance due to error 227
即使发起命令alter system switch logfile日志切换命令,LGWR也会终止实例。切换日志的完整性操作包括把日志序列号更新到控制文件,而控制文件损坏,无法更新,
LWGR(ospid:11529): terminating the instance due to error 227
在实例被终止前,只要不直接或间接地访问控制文件,服务器进程的一切(select\dml\ddl\commit\rollback)等可以正常执行。否则,轻则报错,重则服务器进程被杀导致实例被终止。
SQL> alter tablespace example read only; ---实例将被终止
当遇到这种情况,如果实例还没有被关闭,能提交的事务可以抓紧提交,因为commit重做记录写入在线日志可以进行,然后shutdown abort;
SQL> shutdown abort;
场景4:实例正常运行,在linux端rm删除掉控制文件
这种情况实例不会被关闭,CKPT,LGWR进程已经打开了控制文件,而rm命令并不能把这些进程已经打开的控制文件的句柄删掉,
也没有真正地物理上把控制文件删掉,rm只是在文件系统上删除了指向控制文件的“索引”而已。
8.2 备份控制文件
控制文件的备份类型主要分为:在线镜像备份、自动备份和手动备份
8.2.1 在线镜像备份
在线镜像备份,或称为在线副本的路径,有control_files参数指定
YHQT@ orcl >show parameter control_files
8.2.2 自动备份
--1 显示自动备份
显示自动备份功能默认是关闭的,在没有catalog的情况下,建议打开,使用RMAN的configure命令设置
--show all --rman> configure controlfile autobackup on; RMAN> show controlfile autobackup; RMAN configuration parameters for database with db_unique_name ORCL are: CONFIGURE CONTROLFILE AUTOBACKUP ON; RMAN> backup tablespace ogg; Starting backup at 16-JUL-19 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set input datafile file number=00009 name=/u01/app/oracle/oradata/orcl/ogg01.dbf channel ORA_DISK_1: starting piece 1 at 16-JUL-19 channel ORA_DISK_1: finished piece 1 at 16-JUL-19 piece handle=/u01/app/oracle/fra/ORCL/backupset/2019_07_16/o1_mf_nnndf_TAG20190716T174825_glv7c9gc_.bkp tag=TAG20190716T174825 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01 Finished backup at 16-JUL-19 Starting Control File and SPFILE Autobackup at 16-JUL-19 piece handle=/u01/app/oracle/fra/ORCL/autobackup/2019_07_16/o1_mf_s_1013795306_glv7cbwp_.bkp comment=NONE Finished Control File and SPFILE Autobackup at 16-JUL-19 ---->自动备份控制文件和参数文件
当数据库物理结构发生变化时,如创建或删除表空间、添加或删除数据文件、表空间上下线切换、表空间可读写切换等,从11.2开始,这样的物理结构变化导致的自动备份oracle有MMON后台进程延时处理
隐含参数‘_controlfile_autobackup_delay’修改时间间隔
--2 隐式自动备份
指即便在‘controlfile autobackup’=off,只要使用RMAN备份system表空间的第一个数据文件,控制文件就会被自动备份。
RMAN> configure controlfile autobakcup off; RMAN> backup datafile 1;
但是oracle并不认为这是自动备份,这种控制文件备份根本没有保存在快速恢复区的autobackup目录下,而是在backupset目录。
--3手动备份
使用RMAN或sqlplus手动备份控制文件。备份可分为备份集、镜像复制备份和重建脚本。
备份集和镜像复制的默认路径是快速恢复区,没有使用快速恢复区的一般在’$ORACLE_HOME/dbs目录。重建脚本则写入常规的追踪文件路径中。
--3.1 备份集备份
RMAN> backup as backupset current controlfile; Starting backup at 17-JUL-19 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set including current control file in backup set channel ORA_DISK_1: starting piece 1 at 17-JUL-19 channel ORA_DISK_1: finished piece 1 at 17-JUL-19 piece handle=/u01/app/oracle/fra/ORCL/backupset/2019_07_17/o1_mf_ncnnf_TAG20190717T103715_glx2gwl8_.bkp tag=TAG20190717T103715 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01 Finished backup at 17-JUL-19 Starting Control File and SPFILE Autobackup at 17-JUL-19 ---》》自动备份了参数文件 piece handle=/u01/app/oracle/fra/ORCL/autobackup/2019_07_17/o1_mf_s_1013855838_glx2gy3s_.bkp comment=NONE Finished Control File and SPFILE Autobackup at 17-JUL-19 RMAN> list backup of controlfile;
--3.2 镜像复制备份
RMAN> backup as copy current controlfile format '/home/oracle/control.backup'; Starting backup at 17-JUL-19 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile copy copying current control file output file name=/home/oracle/control.backup tag=TAG20190717T103956 RECID=2 STAMP=1013855996 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 17-JUL-19 Starting Control File and SPFILE Autobackup at 17-JUL-19 piece handle=/u01/app/oracle/fra/ORCL/autobackup/2019_07_17/o1_mf_s_1013855997_glx2mxy4_.bkp comment=NONE Finished Control File and SPFILE Autobackup at 17-JUL-19 或通过sqlplus备份控制文件 SYS@ orcl >alter database backup controlfile to '/home/oracle/control.backup.2'; Database altered. RMAN> list copy of controlfile; ##查看镜像复制备份
--3.3 重建脚本
SYS@ orcl >alter database backup controlfile to trace as '/home/oracle/control20190717.sql';
Database altered.
不指定位置通过视图查询
SQL> select * from v$diag_info where name=’Default Trace File’;
查看脚本片段
[oracle@DSI ~]$ sed -n "/NORESETLOGS/,/REUSE AUTOEXTEND ON/p" /home/oracle/control20190717.sql |grep -v '^--'
首先实例启动到nomount,通过create controlfile创建控制文件(maxlogfiles、logfile、datafile等)
[oracle@DSI ~]$ sed -n "/NORESETLOGS/,/REUSE AUTOEXTEND ON/p" /home/oracle/control20190717.sql |grep -v '^--' STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS FORCE LOGGING ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 ( '/u01/app/oracle/oradata/orcl/redo01.log', '/u01/app/oracle/oradata/orcl/redo11.log' ) SIZE 50M BLOCKSIZE 512, GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log' SIZE 50M BLOCKSIZE 512, GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log' SIZE 50M BLOCKSIZE 512 DATAFILE '/u01/app/oracle/oradata/orcl/system01.dbf', '/u01/app/oracle/oradata/orcl/sysaux01.dbf', '/u01/app/oracle/oradata/orcl/undotbs01.dbf', '/u01/app/oracle/oradata/orcl/users01.dbf', '/home/oracle/backup/test01.tts', '/u01/app/oracle/oradata/orcl/assm01.dbf', '/u01/app/oracle/oradata/orcl/mssm01.dbf', '/u01/app/oracle/oradata/orcl/rc_data01.dbf', '/u01/app/oracle/oradata/orcl/ogg01.dbf', '/u01/app/oracle/oradata/orcl/yhqt01.dbf' CHARACTER SET AL32UTF8 ; EXECUTE SYS.DBMS_BACKUP_RESTORE.CFILESETSNAPSHOTNAME('/u01/app/oracle/product/11.2.0/db_1/dbs/snapcf_orcl.f'); VARIABLE RECNO NUMBER; EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO RECOVERY WINDOW OF 7 DAYS'); VARIABLE RECNO NUMBER; EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON'); VARIABLE RECNO NUMBER; EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('BACKUP OPTIMIZATION','ON'); VARIABLE RECNO NUMBER; EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('SNAPSHOT CONTROLFILE NAME','TO ''/u01/app/oracle/product/11.2.0/db_1/dbs/snapcf_orcl.f'''); RECOVER DATABASE ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; ALTER SYSTEM ARCHIVE LOG ALL; ALTER DATABASE OPEN; ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 61865984 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;