zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【数据库管理】③控制文件

2023-09-14 09:13:33 时间

关键文件

(1、系统 TBS文件;2、控制文件;3、日志文件的当前日志文件;4、undo文件)

如果关键文件算坏,则数据库挂起或无法工作

1. 控制文件的功能和特点

1) 定义数据库当前物理状态 -- 控制文件实时更新,不停地记录信息

2) 维护数据的一致性 -- 和数据文件头部记录SCN对比

3) 是一个二进制文件

4) 在mount阶段被读取

5) 记录RMAN备份的元数据

2. 查看控制文件位置的方法

2.1 参数查看

[oracle@oracle-db-19c ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Mar 31 09:12:22 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> show user;
USER is "SYS"
SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT
SQL> 
SQL> show parameter control_file

NAME                                 TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
control_file_record_keep_time        integer
7
control_files                        string
/u02/oradata/CDB1/control01.ct
l, /u02/oradata/CDB1/control02
.ctl
SQL> 
+++++++++++++++++++++++++++++++++++++++++++++++
-- control_file_record_keep_time	7	 :RMAN元数据保留天数
-- 两个目录,控制文件内容一样,多路复用

2.2 进入目录下查看

[oracle@oracle-db-19c dbhome_1]$ cd /u02/oradata/CDB1/
[oracle@oracle-db-19c CDB1]$ pwd
/u02/oradata/CDB1
[oracle@oracle-db-19c CDB1]$ ls -ltr

2.3 视图查看

SQL> 
SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/CDB1/control01.ctl
/u02/oradata/CDB1/control02.ctl

SQL> 

3. 控制文件多元化

1).配置多个control_files,控制文件最好有三个,是相互镜像的(shutdown下cp命令复制即可),然后修改spfile control_files参数,Oracle建议分配在不同的物理磁盘上.

[oracle@oracle-db-19c CDB1]$ pwd
/u02/oradata/CDB1
[oracle@oracle-db-19c CDB1]$ mkdir -p /u02/disk1
[oracle@oracle-db-19c CDB1]$ cp /u02/oradata/CDB1/control01.ctl /u02/disk1/control01.ctl
[oracle@oracle-db-19c CDB1]$ cp /u02/oradata/CDB1/control01.ctl /u02/disk1/control02.ctl 
[oracle@oracle-db-19c CDB1]$ cp /u02/oradata/CDB1/control01.ctl /u02/disk1/control03.ctl
[oracle@oracle-db-19c CDB1]$ cp /u02/oradata/CDB1/control01.ctl /u02/disk1/control04.ctl
[oracle@oracle-db-19c CDB1]$ rm -rf /u02/disk1/control01.ctl
[oracle@oracle-db-19c CDB1]$ rm -rf /u02/disk1/control02.ctl
[oracle@oracle-db-19c CDB1]$ 

SQL> alter system set control_files='/u02/oradata/CDB1/control01.ctl','/u02/oradata/CDB1/control02.ctl','/u02/disk1/control03.ctl', '/u02/disk1/control04.ctl' scope=spfile;

2).三个control文件要一致(同一版本,scn相同)

-rw-r----- 1 oracle oinstall  7356416 07-16 20: 00 control01.ctl
-rw-r----- 1 oracle oinstall  7356416 07-16 20: 01 control02.ctl
-rw-r----- 1 oracle oinstall  7356416 07-16 20: 01 control03.ctl
-rw-r----- 1 oracle oinstall  7356416 07-16 20: 01 control04.ctl

3).控制文件查看

 v$controlfile 、show parameter controlfile、 v$parameter

4. 控制文件的重建与备份

4.1 trace 文件

可以在mount或open模式下生成一个脚本,用于控制文件重建.(热备)

生成的trace 文件在udump的最新trc文件里

SQL> alter database backup controlfile to trace;
-- 或者指定目录
SQL> alter database backup controlfile to trace as '/u01/app/oracle/oradata/orcl/con.trace';

4.2 binary 文件

控制文件的备份(二进制备份).(热备)

alter database backup controlfile to '/u01/app/oracle/oradata/orcl/con.bak';

5. 控制文件手工恢复

控制文件一旦损坏,系统将崩溃或死机.

单个文件损坏了 :数据库关闭,使用操作系统命令复制其副本到指定的位置.

所有的控制文件丢失 :(正常关闭,shutdown immediate后删除控制文件)

假设控制文件的备份也没有,利用前面做的trace文件重新生成控制文件在nomount 状态下执行trace脚本

5.1 关闭数据库

SQL> shutdown immediate

5.2 删除控制文件

[oracle@oracle-db-19c orcl]$ rm *.ctl     # 删除后缀.ctl的控制文件

5.3 启动数据库started

SQL> startup
SQL> select status from v$instance;
STATUS
---------------
STARTED

5.5 执行con.trace脚本生成控制文件

SQL> 
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.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
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/orcl/system01.dbf',
  '/u01/app/oracle/oradata/orcl/test01.dbf',
  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',
  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',
  '/u01/app/oracle/oradata/orcl/example01.dbf',
  '/u01/app/oracle/oradata/orcl/users01.dbf',
  '/u01/app/oracle/oradata/orcl/tbs16k01.dbf'
CHARACTER SET AL32UTF8
; 

5.6 重建控制文件主要有两大部分内容

[oracle@oracle-db-19c orcl] $ ll
# 可以看到执行后三个控制文件又重新建立了.

说明: 这个重建控制文件的过程主要有两大部分内容:

第一部分是脚本中的可见信息:

1)定义了几个参数的最大值

2)在线日志的物理信息

3)数据文件的物理信息

4)使用的字符集.

第二部分是隐含的不可见信息:

比如SCN信息,关键步骤是将当前所有数据文件头部的最新SCN信息复制到了控制文件中.以便接下来打开数据库.

SQL> 
SQL> select file#, checkpoint_change# from v$datafile;      -- 从控制文件读出

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1           31445128
         3           31445128
         4           31445128
         5            2160789
         6            2160789
         7           31445128
         8            2160789
         9           31445128
        10           31445128
        11           31445128
        12           31445128

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
        13           31445128
        14           31445128
        15           31445128
        16           31445128
        85           31445128
       126           31445128
       127           31445128
       154           31445128
       155           31445128
       162           21742070
       163           31445128

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
       164           21742070
       165           21742070
       166           21742070
       169           31445128
       181           31445128

27 rows selected.

SQL> select file#, checkpoint_change# from v$datafile_header;   -- 从数据文件读出

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1           31445128
         3           31445128
         4           31445128
         5            2160789
         6            2160789
         7           31445128
         8            2160789
         9           31445128
        10           31445128
        11           31445128
        12           31445128

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
        13           31445128
        14           31445128
        15           31445128
        16           31445128
        85           31445128
       126           31445128
       127           31445128
       154           31445128
       155           31445128
       162           21742070
       163           31445128

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
       164           21742070
       165           21742070
       166           21742070
       169           31445128
       181           31445128

27 rows selected.

SQL> 
-- 控制文件已创建

5.7 处于MOUNTED状态

SQL> select status from v$instance;

STATUS
------------------------------------
MOUNTED

SQL> 

5.8 打开数据库

SQL> alter database open resetlogs;

所有的控制文件丢失,利用控制文件备份(手动备份或RMAN备份都可以)恢复控制文件.(有点复杂,留在053备份恢复中再介绍)