1 说明
Oracle数据库中的控制文件是数据库管理中的重要组成部分,是一个二进制小文件,在 mount 阶段被读取。它包含了数据库的元数据信息和文件位置等重要数据,记录数据库当前物理状态,维护数据库的一致性,记录 RMAN 备份的元数据。
查看控制文件位置:
bash
SQL> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
+DATA/orcl/controlfile/current.260.1166397623
#或
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string +DATA/orcl/controlfile/current
.260.1166397623
2 实时更新机制
- 当增加、重命名、删除一个数据文件或者一个联机日志文件时,Oracle 服务器进程(Server Process)会立即更新控制文件以反映数据库结构的变化。
- 日志写进程 LGWR 负责把当前日志序列号记录到控制文件中。
- 检查点进程 CKPT 负责把校验点的信息记录到控制文件中。
- 归档进程 ARCn 负责把归档日志的信息记录到控制文件中。
3 备份控制文件
备份控制文件是数据库维护的常规操作,以防止因意外情况导致控制文件损坏或丢失。可以使用 RMAN (Recovery Manager) 工具进行备份。通过配置适当的备份策略,管理员可以定期自动备份控制文件,以确保数据的完整性和可恢复性。此外,也可以手动备份控制文件。通常是将控制文件复制到另一个安全的存储位置,如备份服务器或外部存储设备。
备份控制文件是非常重要的,在对数据库的物理结构进行改变后,也需要重新对控制文件进行备份,这些操作包括:
- 增加、删除、重命名数据文件
- 增加、删除表空间
- 增加、删除日志组或日志文件
备份控制文件:
sql
--备份二进制文件
SQL> alter database backup controlfile to '/home/oracle/ctrl/controlfile1';
-- 备份文本文件,可用于执行恢复
SQL> alter database backup controlfile to trace as '/home/oracle/ctrl/controlfile2.trace';
rman备份:
sql
RMAN> backup current controlfile;
RMAN> list backup of controlfile;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
2 Full 9.33M DISK 00:00:01 16-APR-24
BP Key: 2 Status: AVAILABLE Compressed: NO Tag: TAG20240416T024414
Piece Name: /u01/app/oracle/product/11.2/db_1/dbs/022oc03u_1_1
Control File Included: Ckp SCN: 969725 Ckp time: 16-APR-24
4 控制文件的多路复用
多路复用是 Oracle 数据库控制文件管理的一种策略,旨在提高数据库的可靠性和可用性。当数据库启动时,Oracle 会按照配置的顺序查找控制文件。一旦找到可用的控制文件,数据库就会加载并继续启动过程。这种多路复用的方式降低了因控制文件损坏而导致数据库宕机的风险。可以通过配置多个控制文件来实现多路复用。这些控制文件通常存储在数据库的不同物理位置,以确保在发生硬件故障或磁盘损坏时,至少有一个控制文件可用。
多路复用配置:
多路复用指的是相互镜像。配置多个controlfile,控制文件最好是3个,最多8个。三个 control 文件要一致,同一版本,scn相同。
- 备份spfile;
- 修改spfile中的control_files参数;
- shutdown immediate;
- 复制控制文件,建议将多个控制文件分配在不同的物理磁盘上。
详细过程如下(基于asm):
bash
--查看当前控制文件配置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string +DATA/orcl/controlfile/current
.260.1166397623
--备份动态参数文件spfile
SQL> create pfile='/home/oracle/pfile/initorcl.ora' from spfile;
File created.
--修改控制文件参数
SQL> alter system set control_files='+DATA/orcl/controlfile/current.260.1166397623','+DATA/orcl/controlfile/controlfile2.ctl','+DATA/orcl/controlfile/controlfile3.ctl' scope=spfile;
System altered.
--关机
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
--asmcmd,cp控制文件(grid用户)
[grid@oracle11g ~]$ asmcmd
ASMCMD> cp +DATA/orcl/controlfile/current.260.1166397623 +DATA/orcl/controlfile/controlfile2.ctl
copying +DATA/orcl/controlfile/current.260.1166397623 -> +DATA/orcl/controlfile/controlfile2.ctl
ASMCMD> cp +DATA/orcl/controlfile/current.260.1166397623 +DATA/orcl/controlfile/controlfile3.ctl
copying +DATA/orcl/controlfile/current.260.1166397623 -> +DATA/orcl/controlfile/controlfile3.ctl
--检查
ASMCMD> ls +DATA/orcl/controlfile
Current.260.1166397623
controlfile2.ctl
controlfile3.ctl
--启动
SQL> startup;
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2257840 bytes
Variable Size 541068368 bytes
Database Buffers 289406976 bytes
Redo Buffers 2371584 bytes
Database mounted.
Database opened.
--检查配置
SQL> show parameter control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string +DATA/orcl/controlfile/current
.260.1166397623, +DATA/orcl/co
ntrolfile/controlfile2.ctl, +D
ATA/orcl/controlfile/controlfi
le3.ctl
5 恢复控制文件
控制文件一旦损坏,系统将不能正常工作。受损的控制文件会记录在告警日志中,恢复或重建控制文件必须使系统在 NOMOUNT下
5.1 某个控制文件损坏的恢复
如果某个控制文件损坏,但其他控制文件仍然可用,那么数据库可以继续正常运行。在这种情况下,dba应尽快备份损坏的控制文件并替换为有效的备份副本。如果没有可用的备份,参照多路复用的方式,需要从其他可用的控制文件中复制来重建损坏的控制文件。
5.2 所有控制文件损坏,重建控制文件
5.2.1 如果有binary控制文件备份,利用备份恢复控制文件
bash
SQL> startup nomount;
RMAN> restore controlfile from '+FRA/orcl/backupset/2024_04_16/ncnnf0_tag20240416t042723_0.257.1166416045';
RMAN> alter database mount;
RMAN> recover database;
RMAN> alter database open RESETLOGS;
5.2.2 如果没有备份,利用 trace 脚本文件重新创建控制文件
这种情况会丢失归档记录信息和RMAN信息。
bash
--启动报错
SQL> startup;
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2257840 bytes
Variable Size 541068368 bytes
Database Buffers 289406976 bytes
Redo Buffers 2371584 bytes
ORA-00205: error in identifying control file, check alert log for more info
--启动到nomount状态
SQL> startup force nomount;
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2257840 bytes
Variable Size 541068368 bytes
Database Buffers 289406976 bytes
Redo Buffers 2371584 bytes
--执行trace脚本文件中的脚本
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '+DATA/orcl/onlinelog/group_1.261.1166397623' SIZE 50M BLOCKSIZE 512,
GROUP 2 '+DATA/orcl/onlinelog/group_2.262.1166397623' SIZE 50M BLOCKSIZE 512,
GROUP 3 '+DATA/orcl/onlinelog/group_3.263.1166397623' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'+DATA/orcl/datafile/system.256.1166397573',
'+DATA/orcl/datafile/sysaux.257.1166397573',
'+DATA/orcl/datafile/undotbs1.258.1166397573',
'+DATA/orcl/datafile/users.259.1166397573'
CHARACTER SET ZHS16GBK;
Control file created.
--此时三个控制文件都已经恢复,且数据库在mount状态下
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
MOUNTED
--打开数据库
SQL> alter database open;
Database altered.
--执行trace文件最后一行,添加临时数据文件信息
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/orcl/tempfile/temp.264.1166397625'
SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M; 2
Tablespace altered.