体系结构之控制文件

  1. 控制文件的功能和特点
    1. 控制文件是二进制文件,不能对正在使用的控制文件进行编辑
    2. 如果数据库中控制文件的版本不同,数据库是不能正常启动的-------解决方法:用新版本覆盖旧版本
    3. 控制文件定义了数据库当前的物理状态
    4. 控制文件维护了数据的一致‘
    5. 控制文件在mount阶段被读取
    6. 记录了RMAN备份的元数据
  2. 相关命令
    1. 查看控制文件的位置
      1. SQL> show parameter control_files;
      2. SQL> select name from v$controlfile;
    2. 查看数据库实例状态
      1. SQL> select status from v$instance;
  3. 控制文件备份
    1. TRACE备份
      1. trace不是备份,严格意义上来说是根据现有的二进制控制文件生成出来的一份文本型文件,该文件中记录了创建控制文件的基本信息。
      2. SQL> alter database backup controlfile to trace; ---- 通过日志来查找写入了哪个trace文件
      3. SQL> alter database backup controfile to trace as '路径'----手动指定trace文件的路径
      4. 通过trace出来的文件,主要作用是后期用来手动重建
    2. BINARY备份
      1. 对控制文件的热备份
      2. SQL> alter database backup controlfile to '路径';
      3. 二进制备份(手工CP、在线热备),主要用作还原
  4. 数据库如何开启归档模式(题外话)
    1. 干净一致的关闭数据库 ----- SQL> shutdown immediate;
    2. 将数据库启动到mount状态 ----- SQL> startup mount;
    3. 开启归档模式 ---- SQL> alter database archivelog;
    4. 开启数据 --- SQL> alter database open;
    5. 注: 开启归档后,默认归档路径的文件夹是不存在的----Archive destination /u01/app/oracle/product/12.2.0/db_1/dbs/arch
  5. 知识点
    1. SQL> alter system switch logfile; ----切换日志文件
    2. log_archive_dest_1(参数)-----影响 Archive destination
    3. SQL> show parameter log_archive_dest;
    4. 归档路径一共有31路,(如果是针对本地的,只能用1-10这10个路径)location
    5. 归档路径一共有31路,(如果是针对远程的,例如DG环境,必须存在本地路径)service,如果是针对远程的,最多可以使用2-31路,一共30个路径(也就是对应着DG环境一共最多可以有30个备库)
    6. SQL > alter system set log_archive_dest_1='location=/u01/app/oracle/arch'; -----更改归档路径
    7. 全备份
      1. 备份路径---[oracle@hansen ~]$ mkdir /u01/app/oracle/backup
      2. RMAN备份--[oracle@hansen ~]$ rman target /
      3. 开始备份---RMAN> backup database format '/u01/app/oracle/backup/%U.full';
  6. 控制文件丢失
    1. 丢失其中一个------通过其他控制文件复制一份即可
    2. 全部丢失-----手工重建 ----风险:如果没有开启catalog目录库,默认使用的就是控制文件,如果手工重建,元数据丢失

控制文件实验

实验一 :控制文件SCN号

  1. 关闭数据库

  2. 将控制文件复制一份到/tmp/的路径下

  3. 启动数据库

  4. 对控制文件进行一次在线热备

  5. 关闭数据库

  6. 将控制文件全部移动到/u01/app/oracle/oradata/OCP12C/bak/路径下

  7. 将/tmp/路径下控制文件和在线热备的控制文件分别 复制一份到/u01/app/oracle/oradata/OCP12C/路径下

  8. 启动数据库(不能正常启动,因为两个控制文件的版本号不同)

  9. 解决方法:将在线热备的控制文件再复制一份覆盖从/tmp/路径下复制来的控制文件,此时可以将数据库启动到mount状态,但依然不能打开数据库,将/u01/app/oracle/oradata/OCP12C/bak/路径下的控制文件复制到u01/app/oracle/oradata/OCP12C/路径下,再次启动数据库成功

  10. 总结:数据库启动到第二阶段要加载控制文件时,发现控制文件版本号不同,所以报错,当使用在线热备的两份控制文件时,版本号一致,但数据库在第二次关闭时,数据文件头部也记录了控制文件的版本号信息,此信息与在线热备控制文件版本号信息不同,所以数据库只能启动到mount状态,不能正常open。在/u01/app/oracle/oradata/OCP12C/bak/路径下的控制文件版本号信息与数据文件头部记录的信息是一致的,最后成功启动数据库。

实验代码:

 1 第一步:
 2 SQL> shutdown immediate
 3 Database closed.
 4 Database dismounted.
 5 ORACLE instance shut down.
 6 第二步:
 7 [oracle@oracle12c OCP12C]$ cp control0* /tmp
 8 第三步:
 9 SQL> startup
10 ORACLE instance started.
11 
12 Total System Global Area 1660944384 bytes
13 Fixed Size            8793448 bytes
14 Variable Size          939524760 bytes
15 Database Buffers      704643072 bytes
16 Redo Buffers            7983104 bytes
17 Database mounted.
18 Database opened.
19 SQL> select status from v$instance;
20 
21 STATUS
22 ------------------------
23 OPEN
24 第四步:
25 SQL> alter database backup controlfile to '/tmp/contorl01.bak';
26 
27 Database altered.
28 第五步:
29 SQL> shutdown immediate
30 Database closed.
31 Database dismounted.
32 ORACLE instance shut down.
33 第六步:
34 [oracle@oracle12c OCP12C]$ mv control0* bak/
35 第七步:
36 [oracle@oracle12c OCP12C]$ cp /tmp/control01.ctl .
37 [oracle@oracle12c OCP12C]$ cp /tmp/contorl01.bak control02.ctl
38 第八步:
39 SQL> startup nomount
40 ORACLE instance started.
41 
42 Total System Global Area 1660944384 bytes
43 Fixed Size            8793448 bytes
44 Variable Size          939524760 bytes
45 Database Buffers      704643072 bytes
46 Redo Buffers            7983104 bytes
47 SQL> alter database mount
48   2  ;
49 alter database mount
50 *
51 ERROR at line 1:
52 ORA-00214: control file '/u01/app/oracle/oradata/OCP12C/control02.ctl' version
53 41363 inconsistent with file '/u01/app/oracle/oradata/OCP12C/control01.ctl'
54 version 41348
55 第九步:
56 [oracle@oracle12c OCP12C]$ cp control02.ctl control01.ctl
57 
58 SQL> alter database mount;
59 
60 Database altered.
61 
62 SQL> alter database open;
63 alter database open
64 *
65 ERROR at line 1:
66 ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
67 
68 
69 SQL> alter database open RESETLOGS;
70 alter database open RESETLOGS
71 *
72 ERROR at line 1:
73 ORA-01152: file 1 was not restored from a sufficiently old backup
74 ORA-01110: data file 1: '/u01/app/oracle/oradata/OCP12C/system01.dbf'
75 第十步:
76 [oracle@oracle12c OCP12C]$ cp bak/control0* .
77 
78 SQL> alter database open;
79 
80 Database altered.
81 
82 SQL> select status  from  v$instance;
83 
84 STATUS
85 ------------------------
86 OPEN
87 
88 SQL>
View Code

实验二:多路复用

  1.  启动数据库

  2.  修改control_files参数,将其设置成三路复用

  3.  关闭数据库

  4.  在OS层面添加control03.ctl控制文件

  5.  启动数据库

  6.  查看控制文件

实验代码:

 1 第一步:
 2 SQL> select status from v$instance;
 3 
 4 STATUS
 5 ------------------------
 6 OPEN
 7 
 8 SQL> select name from v$controlfile;
 9 
10 NAME
11 --------------------------------------------------------------------------------
12 /u01/app/oracle/oradata/OCP12C/control01.ctl
13 /u01/app/oracle/oradata/OCP12C/control02.ctl
14 第二步:
15 SQL> alter system set control_files='/u01/app/oracle/oradata/OCP12C/control01.ctl','/u01/app/oracle/oradata/OCP12C/control02.ctl','/u01/app/oracle/oradata/OCP12C/control03.ctl' scope=spfile;
16 
17 System altered.
18 第三步:
19 SQL> shutdown immediate
20 Database closed.
21 Database dismounted.
22 ORACLE instance shut down.
23 第四步:
24 [oracle@oracle12c OCP12C]$ cp control01.ctl control03.ctl
25 第五步:
26 SQL> startup
27 ORACLE instance started.
28 
29 Total System Global Area 1660944384 bytes
30 Fixed Size            8793448 bytes
31 Variable Size          939524760 bytes
32 Database Buffers      704643072 bytes
33 Redo Buffers            7983104 bytes
34 Database mounted.
35 Database opened.
36 SQL> select status from v$instance;
37 
38 STATUS
39 ------------------------
40 OPEN
41 第六步:
42 SQL> select name from v$controlfile;
43 
44 NAME
45 --------------------------------------------------------------------------------
46 /u01/app/oracle/oradata/OCP12C/control01.ctl
47 /u01/app/oracle/oradata/OCP12C/control02.ctl
48 /u01/app/oracle/oradata/OCP12C/control03.ctl
49 
50 SQL>
View Code

实验三:手工重建

  1.  启动 数据库

  2.  先备份一路trace文件

  3.  关闭数据库

  4.  在OS层删除所有控制文件

  5.  通过trace文件手工重建控制文件

  6.  查看数据库状态

实验代码:

  1 第一步:
  2 SQL> select status from v$instance;
  3 
  4 STATUS
  5 ------------------------
  6 OPEN
  7 第二步:
  8 SQL> alter database backup controlfile to trace as '/tmp/control01.trc';
  9 
 10 Database altered.
 11 第三步:
 12 SQL> shutdown immediate
 13 Database closed.
 14 Database dismounted.
 15 ORACLE instance shut down.
 16 第四步:
 17 [oracle@oracle12c OCP12C]$ rm -rf control0*
 18 第五步:
 19 [oracle@oracle12c OCP12C]$ cat /tmp/control01.trc
 20 SQL> @/u01/app/oracle/oradata/OCP12C/control.sql
 21 ORACLE instance started.
 22 
 23 Total System Global Area 1660944384 bytes
 24 Fixed Size            8793448 bytes
 25 Variable Size          939524760 bytes
 26 Database Buffers      704643072 bytes
 27 Redo Buffers            7983104 bytes
 28 
 29 Control file created.
 30 
 31 ORA-00283: recovery session canceled due to errors
 32 ORA-00264: no recovery required
 33 
 34 
 35 
 36 System altered.
 37 
 38 
 39 Database altered.
 40 
 41 
 42 Pluggable database altered.
 43 
 44 
 45 Tablespace altered.
 46 
 47 
 48 Session altered.
 49 
 50 
 51 Tablespace altered.
 52 
 53 
 54 Session altered.
 55 
 56 
 57 Tablespace altered.
 58 
 59 
 60 Tablespace altered.
 61 
 62 
 63 Session altered.
 64 第六步:
 65 SQL> select status from v$instance;
 66 
 67 STATUS
 68 ------------------------
 69 OPEN
 70 
 71 SQL>
 72 
 73 附上手工重建SQL代码内容(trace中Set #1的内容,因为日志文件状态正常)
 74 [oracle@oracle12c OCP12C]$ cat control.sql
 75 STARTUP NOMOUNT
 76 CREATE CONTROLFILE REUSE DATABASE "OCP12C" NORESETLOGS  ARCHIVELOG
 77     MAXLOGFILES 16
 78     MAXLOGMEMBERS 3
 79     MAXDATAFILES 1024
 80     MAXINSTANCES 8
 81     MAXLOGHISTORY 292
 82 LOGFILE
 83   GROUP 1 '/u01/app/oracle/oradata/OCP12C/redo01.log'  SIZE 200M BLOCKSIZE 512,
 84   GROUP 2 '/u01/app/oracle/oradata/OCP12C/redo02.log'  SIZE 200M BLOCKSIZE 512,
 85   GROUP 3 '/u01/app/oracle/oradata/OCP12C/redo03.log'  SIZE 200M BLOCKSIZE 512
 86 DATAFILE
 87   '/u01/app/oracle/oradata/OCP12C/system01.dbf',
 88   '/u01/app/oracle/oradata/OCP12C/sysaux01.dbf',
 89   '/u01/app/oracle/oradata/OCP12C/undotbs01.dbf',
 90   '/u01/app/oracle/oradata/OCP12C/pdbseed/system01.dbf',
 91   '/u01/app/oracle/oradata/OCP12C/pdbseed/sysaux01.dbf',
 92   '/u01/app/oracle/oradata/OCP12C/users01.dbf',
 93   '/u01/app/oracle/oradata/OCP12C/pdbseed/undotbs01.dbf',
 94   '/u01/app/oracle/oradata/OCP12C/ERP/system01.dbf',
 95   '/u01/app/oracle/oradata/OCP12C/ERP/sysaux01.dbf',
 96   '/u01/app/oracle/oradata/OCP12C/ERP/undotbs01.dbf',
 97   '/u01/app/oracle/oradata/OCP12C/ERP/users01.dbf',
 98   '/u01/app/oracle/oradata/OCP12C/ERP/test01.dbf'
 99 CHARACTER SET AL32UTF8
100 ;
101 
102 RECOVER DATABASE
103 
104 ALTER SYSTEM ARCHIVE LOG ALL;
105 
106 ALTER DATABASE OPEN;
107 
108 ALTER PLUGGABLE DATABASE ALL OPEN;
109 
110 ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/OCP12C/temp01.dbf'
111      SIZE 34603008  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
112 ALTER SESSION SET CONTAINER = PDB$SEED;
113 ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/OCP12C/pdbseed/temp012020-11-14_00-21-00-132-AM.dbf'
114      SIZE 67108864  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
115 ALTER SESSION SET CONTAINER = ERP;
116 ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/OCP12C/ERP/temp01.dbf' REUSE;
117 ALTER TABLESPACE AAA ADD TEMPFILE '/u01/app/oracle/oradata/OCP12C/ERP/aaa01.dbf' REUSE;
118 ALTER SESSION SET CONTAINER = CDB$ROOT;
119 [oracle@oracle12c OCP12C]$
View Code

原文地址:https://www.cnblogs.com/eniniemand/p/13648243.html