本篇将介绍各种备份及恢复控制文件的方法,在介绍恢复时,以备份和重做日志(包括归档日志和在线日志)没有丢失为前提

无备份情况下的控制文件恢复参考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'

场景1db启动时,任意一个控制文件的数据块损坏时的告警

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 )

场景2db启动时,任意一个控制文件头损坏,告警日志

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 ...

场景3db启动时,任意控制文件丢失

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:实例正常运行,在linuxrm删除掉控制文件

这种情况实例不会被关闭,CKPT,LGWR进程已经打开了控制文件,而rm命令并不能把这些进程已经打开的控制文件的句柄删掉,

也没有真正地物理上把控制文件删掉,rm只是在文件系统上删除了指向控制文件的“索引”而已。

8.2 备份控制文件

控制文件的备份类型主要分为:在线镜像备份、自动备份和手动备份

8.2.1 在线镜像备份

在线镜像备份,或称为在线副本的路径,有control_files参数指定

YHQT@ orcl >show parameter control_files

8.2.2 自动备份

--1 显示自动备份

显示自动备份功能默认是关闭的,在没有catalog的情况下,建议打开,使用RMANconfigure命令设置

--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开始,这样的物理结构变化导致的自动备份oracleMMON后台进程延时处理

隐含参数_controlfile_autobackup_delay’修改时间间隔

--2 隐式自动备份

指即便在controlfile autobackup=off,只要使用RMAN备份system表空间的第一个数据文件,控制文件就会被自动备份。

RMAN> configure controlfile autobakcup off;
RMAN> backup datafile 1;

但是oracle并不认为这是自动备份,这种控制文件备份根本没有保存在快速恢复区的autobackup目录下,而是在backupset目录。

--3手动备份

使用RMANsqlplus手动备份控制文件。备份可分为备份集镜像复制备份和重建脚本

备份集和镜像复制的默认路径是快速恢复区,没有使用快速恢复区的一般在’$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创建控制文件(maxlogfileslogfiledatafile等)

[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;
View Code

相关文章:

  • 2021-10-31
  • 2021-09-30
  • 2022-02-09
  • 2021-12-15
  • 2021-12-03
  • 2021-09-28
  • 2021-04-08
猜你喜欢
  • 2022-12-23
  • 2022-02-04
  • 2022-02-17
  • 2021-11-28
  • 2021-09-30
  • 2021-12-07
  • 2022-12-23
相关资源
相似解决方案