Oracle-Control-File-1

Oracle 控制文件的恢复

1 控制文件的备份方式

1
2
1. 脱机冷备 的控制文件
2. SQL 语句下控制文件的备份

1.1 脱机冷备说明 (不建议这样备份)

如何脱机备份

冷备份发生在数据库已经正常关闭的情况下
拷贝文件,假如数据库文件都在目录A,拷贝这些数据库文件到其他目录比如目录B,如果要恢复,则也是在数据库 shutdown 的状态下,把这些文件从目录 B 拷回目录 A,再 startup 数据库

查看文件信息

1
2
3
4
5
6
7
8
9
--找出所有的控制文件
SQL> select name from v$controlfile;

--找出所有的数据文件和临时文件
SQL> select file_name from dba_data_files;
SQL> select file_name from dba_temp_files;

--找出所有的 redo log 文件
SQL> select MEMBER from v$logfile;

恢复时的问题

用户管理的备份与恢复也称 OS 物理备份,是指通过数据库命令设置数据库为备份状态,然后用操作系统命令,拷贝需要备份或恢复的文件。生产环境中使用的场景并不多,主要见于 archivelog 模式下,在表空间或数据文件级的备份。如果是 no archivelog ,一旦日志被覆盖,有备份文件也恢复不了。因为恢复的时候,要用到备份开始时刻之后的日志。

1.2 使用 SQL 语句进行控制文件备份

SQL 中操作

1
2
alter database backup controlfile to '/home/oracle/notrace.ctl';
alter database backup controlfile to trace as '/home/oracle/trace.ctl';

RMAN 中 操作

1
2
backup controlfile to 'XX'           此XX和实际的控制文件格式一样,二进制文件,vi打开乱码
backup controlfile to trace as 'XX' 此XX类似重建控制文件中的内容,文本文件,可以vi打开

1.3 手动重建控制文件

官方文档:https://docs.oracle.com/database/121/SQLRF/statements_5004.htm#SQLRF01203

所有控制文件都丢失的情况下,手工创建控制文件前提是要知道 redo log 和 datafile 路径和数据库的字符集

重建控制文件实验步骤

1.3.1 删除控制文件

1
2
3
4
5
6
SQL> select name from v$controlfile;
SQL> shutdown immediate;
SQL> ! ls /u01/app/oracle/oradata/OCP/ |grep control
SQL> ! rm -f /u01/app/oracle/oradata/OCP/control0*.ctl
SQL> ! ls /u01/app/oracle/oradata/OCP/ |grep control
SQL>startup

1.3.2 手工重建控制文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE CONTROLFILE REUSE DATABASE "OCP" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 32
MAXINSTANCES 1
MAXLOGHISTORY 449
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/OCP/redo01.log',
GROUP 2 '/u01/app/oracle/oradata/OCP/redo02.log',
GROUP 3 '/u01/app/oracle/oradata/OCP/redo03.log'
DATAFILE
'/u01/app/oracle/oradata/OCP/users01.dbf',
'/u01/app/oracle/oradata/OCP/undotbs01.dbf',
'/u01/app/oracle/oradata/OCP/sysaux01.dbf',
'/u01/app/oracle/oradata/OCP/system01.dbf',
'/u01/app/oracle/oradata/OCP/example02.dbf',
'/u01/app/oracle/oradata/OCP/users02.dbf',
'/u01/app/oracle/oradata/OCP/test101.dbf',
'/u01/app/oracle/oradata/OCP/test102.dbf'
CHARACTER SET AL32UTF8;

1.3.3 查看控制文件

1
2
3
SQL> ! ls /u01/app/oracle/oradata/OCP/ |grep control
control01.ctl
control02.ctl

1.3.4 打开数据库

1
2
SQL> alter database open;
SQL> alter tablespace TEMP add tempfile '/u01/app/oracle/oradata/OCP/temp01.dbf' size 100M reuse;

1.4 使用备份的控制文件(二进制文件)进行恢复

使用控制文件恢复数据库

1
SQL>recover database using backup controlfile;

会自动带出 Specify log: {=suggested | filename | AUTO | CANCEL} 信息

--filename 表示 recover 需要使用到的归档日志或在线日志
--AUTO 表示自动使用数据库推荐的归档日志或在线日志
--输入了错误归档日志或在线日志会报错,但是不影响继续恢复,可以继续输入 recover database using backup controlfile;继续选择正确的日志进行恢复

打开数据库

1
SQL> alter database open RESETLOGS;

因为,控制文件不是最新的,打开到 mount 状态后,这时可以查寻 select * from v$log,但是v$log.status 和 v$log.SEQUENCE# 不一定是准确的(控制文件中当前在线日志序列号还是陈旧的,是当初备份时的,而控制文件备份后 online redo log 可能进行了多次切换),若按常规方式打开,会报错,所以只要是控制文件是恢复或重建过来的,oracle 一律采用 RESETLOGS 重设日志功能,日志序列号从 1 重新开。原因:mount 状态不能修改

Contents
  1. 1. Oracle 控制文件的恢复
    1. 1.1. 1 控制文件的备份方式
      1. 1.1.1. 1.1 脱机冷备说明 (不建议这样备份)
      2. 1.1.2. 1.2 使用 SQL 语句进行控制文件备份
      3. 1.1.3. 1.3 手动重建控制文件
        1. 1.1.3.1. 1.3.1 删除控制文件
        2. 1.1.3.2. 1.3.2 手工重建控制文件
        3. 1.1.3.3. 1.3.3 查看控制文件
        4. 1.1.3.4. 1.3.4 打开数据库
      4. 1.1.4. 1.4 使用备份的控制文件(二进制文件)进行恢复
|