控制文件

一、控制文件的特征
1控制文件的特征:二进制文件: 查询More,cat乱码,使用命令strings =>linux
控制文件很小
[oracle@yang hukou]$ ls -lh
total 37M
-rw-r----- 1 oracle oinstall 19M Oct 31 04:28 ora_control1
-rw-r----- 1 oracle oinstall 19M Oct 31 04:28 ora_control2
 
2.功能记录数据库的物理结构,数据文件,日志文件等信息
如何查询控制文件:
SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ -----------
control_files                         string      /picclife/app/oracle/oradata/hukou/ora_control1,
                                                                /picclife/app/oracle/oradata/hukou/ora_control2
--将二进制控制文件转储到trace告警日志文件中
SQL>alter session set events 'immediate trace name controlf level 12';
--告警日志查看:show parameter dump
cd $ORACLE_BASE/diag/rdbms/db_unique_name/sid/trace
 [oracle@yang /]$ cd /picclife/app/oracle/diag/rdbms/hukou/hukou/trace
ll -lrt   ---最下面的最新生成的文件, sid_ora_xxx.trc
more sid_ora_xxx.trc =>   输入 /DUMP
--可以发现记录着数据库名称、日志文件、数据文件、表空间、RMAN信息
 
3:通过检查点:数据库开启条件,数据文件,redo日志文件可以正常访问;读控制文件,查看当前数据库有什么文件;
检查数据一致性,控制文件,数据文件头部的检查点是否一致,以及日志文件是否一致;
##带来的影响就是,不完全恢复就是,控制文件及数据文件都回到一个节点,当前的日志文件与控制文件记录的日志文件不一致,导致开启数据库需要resertlogs,重建日志;   而完全恢复是指,某个数据文件不一致,控制文件与日志文件完好,可以使用redo日志,重演数据文件的操作;
 
二、控制文件参数的修改: 
SQL> show parameter spfile;  ---查询数据是什么参数启动的:默认spfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------ 

spfile                               string      /picclife/app/oracle/product/11.2.0/dbhome_1/dbs/spfilehukou.ora

SQL> show parameter control   ----查询控制文件的参数

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time        integer     7 control /picclife/app/oracle/oradata/hukou/ora_control1, /u01/app/control2

####SQL> host cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5   (测试环境可以)

--修改参数,可以再次查询SQL> show parameter control   --验证

SQL> alter system set control_files='/picclife/app/oracle/oradata/hukou/ora_control1','/picclife/control5' scope=spfile;

SQL> shutdown immediate;

cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5 

!sql

startup         如果新增加的控制文件,实际环境不同的目录,可能需要新建文件夹+权限属主

mkdir -p /u01/app                                  chown -R oracle.oinstall /u01/app

-----------------小结,可以要几个加几个,当然也可以减少----加需要cp控制文件---------

--方法二、使用vi编辑参数文件,不是在线alter system set修改;因为控制文件参数是初始化参数,不论怎么改,都需要重启生效,防止特殊需求;

cp拷贝控制文件去新的路径,新的控制文件名称:

cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5 

mkdir -p /u01/app                                  chown -R oracle.oinstall /u01/app

 

create pfile from spfile; 使用spfile二进制文件生成最新的文本可编辑文件;

[oracle@yang ~]$ cd $ORACLE_HOME/dbs   ---为了防止错误,可以先cp initsid.ora initsid.ora.abc文件拷贝备份

vi 编辑,*.control_files='/picclife/app/oracle/oradata/hukou/ora_control1','/u01/app/control2','/u01/app1/control3' --!sql -> create spfile from pfile; startup=>成功OK
 
 三、控制文件的恢复:备份: 01 备份二进制文件;
                                                 02 使用完好的控制文件进行拷贝恢复;
                                                 03,使用trace文件重建控制文件;
01:
二进制备份,输出一个文件
如果丢失一个控制文件,最好不要使用备份进行恢复:恢复方式操作系统cp拷贝
情况一,使用备份控制文件还原,启动数据库包,SCN版本不一致:
情况二,使用备份文件进行所有控制文件覆盖,启动数据库报,日志文件SCN不一致
---那么为什么以上两种情况说明备份二进制控制文件不靠谱还做这备份有何意义呢?
====>可以让数据库没有完好的备份情况下,使用冷备的所有文件,进行不完全恢复:

 SQL>  select name from v$datafile union all select member from v$logfile union all select name from v$controlfile;

---查询备份语句,编辑备份脚本

select 'host cp '||name||'  /u01/app/lengbei/'||substr(name,instr(name,'/','-1')+1)||';' from v$datafile union all select 'host cp '||name||'  /u01/app/lengbei/'||substr(name,instr(name,'/','-1')+1)||';' from v$controlfile union all select 'host cp '||member||' /u01/app/lengbei/'||substr(member,instr(member,'/','-1')+1)||';' from v$logfile;

--输出的信息,vi /home/oracle/lengbei.sql

SQL>  select 'host cp /u01/app/lengbei/'||substr(name,instr(name,'/','-1')+1)||' '||name||';' from v$datafile union all select 'host cp /u01/app/lengbei/'||substr(name,instr(name,'/','-1')+1)||' '||name||';' from v$controlfile union all select 'host cp /u01/app/lengbei/'||substr(member,instr(member,'/','-1')+1)||' '||member||';' from v$logfile;

--输出的信息,vi /home/oracle/huanyuan.sql

---创建备份目录,权限:

[oracle@yang trace]$ mkdir -p /u01/app/lengbei

[oracle@yang trace]$ ll /u01/app

drwxr-xr-x 2 oracle oinstall     4096 Oct 31 08:23 lengbei

 

--执行备份--

SQL> shutdown immediate;

@/home/oracle/lengbei             ---等待备份完成;

--破坏:

[oracle@yang app]$ rm /picclife/app/oracle/oradata/hukou/ora_control1

[oracle@yang app]$ rm /picclife/control5

SQL> startup

ORA-00205: error in identifying control file, check alert log for more info

---告警日志内容      ---

ALTER DATABASE   MOUNT

ORA-00210: cannot open the specified control file

ORA-00202: control file: '/picclife/control5'

ORA-27037: unable to obtain file status

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

ORA-00210: cannot open the specified control file

ORA-00202: control file: '/picclife/app/oracle/oradata/hukou/ora_control1'

--执行恢复脚本:

SQL> @/home/oracle/huanyuan.sql
alter database mount; alter database open;
 
 
02:测试二,实验环境,控制文件两个,破坏其中一个,使用存活下来的控制文件进行拷贝还原恢复
 
SQL> shutdown abort ---模拟数据库掉电,某个磁盘损坏
 
开启alter.log日志,cd $ORACLE_BASE/diag/rdbms/db_unqie_name/sid_name/trace
 
--tail -f *.log
 
[oracle@yang trace]$ !sql
 
SQL> startup --启动数据库
 
ORA-00205: error in identifying control file, check alert log for more info 报错了,具体信息无法查询
 
ORA-00210: cannot open the specified control file ---日志输出 --查看alter 日志,提示控制文件没了
ORA-00202: control file: '/picclife/control5'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
 
cd '/picclife/ --ls 经查询,缺失丢失控制文件;
SQL> show parameter contr ----nomount 状态可以查看控制文件,数量及位置
 
NAME TYPE VALUE
 
------------------------------------ ----------- ------------------------------
 
control_files string /picclife/app/oracle/oradata/hukou/ora_control1
 
, /picclife/control5
 
SQL> host ls /picclife/app/oracle/oradata/hukou/ --查看是否有好的
ora_control1
 
SQL> host cp /picclife/app/oracle/oradata/hukou/ora_control1 /picclife/control5
 
SQL> alter database mount;
 
SQL> alter database open;
 
 
03:测试三,实验环境,控制文件两个,破坏其中一个,使用备份的控制文件进行还原恢复,启动数据库Open,无法启动,因为使用的备份控制文件是老的与数据文件不一致;
因此实验采用trace文件,生成重建控制文件脚本,进行控制文件重建测试操作;
当前数据块状态OPEN,备份数据文件,指定位置文件名称
SQL> alter database backup controlfile to '/u01/app/hukou_contr.bk';
 
--show parameter control --查询参数,控制文件名称,位置
/picclife/app/oracle/oradata/hukou/ora_control1, /picclife/control5
 
--关闭数据库一致性关库后,当前的数据文件与备份的控制文件SCN不一致,当前的控制文件SCN,数据文件,都比备份片记录的SCN大
 
SQL> shutdown immediate;
 
--破坏控制文件
 
[oracle@yang picclife]$ rm control5
 
startup --此时告警日志查询,没有控制文件
 
---使用备份的控制文件,cp备份的控制文件,拷贝至丢失控制文件的路径+改名
 
[oracle@yang picclife]$ cp /u01/app/hukou_contr.bk control5
 
---报错
 
SQL> startup ORA-00214: control file '/picclife/app/oracle/oradata/hukou/ora_control1' version 310 inconsistent with file '/picclife/control5' version 290 ---报错提示两个版本不一致
 
 
---操作使用备份的控制文件对未破坏的控制文件进行覆盖:
 
[oracle@yang picclife]$ cp /picclife/app/oracle/oradata/hukou/ora_control1
 
---注意此时,相当于我用备份的控制文件,将所有的控制文件都恢复到了备份的控制文件SCN
 
SQL> alter database mount;---数据库可以mount;
 
 
SQL> startup ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
 
SQL> select name,checkpoint_change# from v$datafile; --查询控制文件的SCN号信息
 
NAME CHECKPOINT_CHANGE#
 
--------------------------------------------------------------------------------
 
/picclife/app/hukou/data/system01.dbf 334031
 
SQL> select name,checkpoint_change# from v$datafile_header; ----查询数据文件头部,数据文件记录的SCN
 
NAME CHECKPOINT_CHANGE#
 
--------------------------------------------------------------------------------
 
/picclife/app/hukou/data/system01.dbf 355197
 
SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log; ---查询日志文件组的SCN
 
MEMBERS FIRST_CHANGE# NEXT_CHANGE#
 
---------- ------------- ------------
 
3 334030 2.8147E+14
 
2 313897 334030
 
1 287062 313897
 
SQL> archive log list ---查询归档模式,非归档
 
Database log mode No Archive Mode
 
SQL> alter database open RESETLOGS;
 
-------无法no resetlogs方式打开,因为控制文件与数据文件都无法一致,更何谈与日志文件SCN保持一致或者重建了
 
alter database open RESETLOGS * ERROR at line 1:
 
ORA-01113: file 1 needs media recovery
 
ORA-01110: data file 1: '/picclife/app/hukou/data/system01.dbf'
 
此时-------遇到这么尴尬的时候怎么办? 使用第一种冷备恢复可以,如果可以有trace文件,那最好了;
 
 
---
 
alter database backup controlfile to trace;
 
---
 
SQL> show parameter dump
 
/picclife/app/oracle/diag/rdbms/hukou/hukou/trace
 
cd $ORACLE_BASE/diag/rdbms/db_unique_name/sid/trace
 
ll -lrt
 
[oracle@yang trace]$ more hukou_ora_24415.trc --最近的一个文件,sid_ora_xx.trc =
 
/STARTUP --找到控制文件重建脚本:复制,vi编辑一个脚本:
 
vi /home/oracle/chongjian.sql
 
CREATE CONTROLFILE REUSE DATABASE "HUKOU" RESETLOGS NOARCHIVELOG
MAXLOGFILES 7
MAXLOGMEMBERS 5
MAXDATAFILES 1500
MAXINSTANCES 1
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'/picclife/app/hukou/log/redo01a.log',
'/picclife/app/hukou/log/redo01b.log'
) SIZE 30M BLOCKSIZE 512,
GROUP 2 (
'/picclife/app/hukou/log/redo02a.log',
'/picclife/app/hukou/log/redo02b.log'
) SIZE 30M BLOCKSIZE 512,
GROUP 3 (
'/picclife/app/hukou/log/redo03a.log',
'/picclife/app/hukou/log/redo03b.log'
) SIZE 30M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/picclife/app/hukou/data/system01.dbf',
'/picclife/app/hukou/data/sysaux01.dbf',
'/picclife/app/hukou/data/undotbs01.dbf',
'/picclife/app/hukou/data/users01.dbf'
CHARACTER SET US7ASCII
;
 
SQL> startup force nomount; -此时的测试环境,是因为使用旧的控制文件,启动到了mount状态,但是无法open,无法读取数据文件,不得已,采取的方式,次方式等同于丢失所有控制文件; --重建控制文件
 
SQL> @/home/oracle/chongjian.sql
 
SQL> select status from v$instance;
 
STATUS ------------ MOUNTED
 
SQL> select distinct CHECKPOINT_CHANGE# from v$datafile;
 
CHECKPOINT_CHANGE# ------------------ 355197
 
SQL> select distinct CHECKPOINT_CHANGE# from v$datafile_header;
 
CHECKPOINT_CHANGE# ------------------ 355197
 
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
 
 
SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 
MEMBERS FIRST_CHANGE# NEXT_CHANGE#
 
---------- ------------- ------------
 
2 0 0
 
2 0 0
 
2 0 0
 
 
SQL> alter database open RESETLOGS;
 
SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 
MEMBERS FIRST_CHANGE# NEXT_CHANGE#
 
---------- ------------- ------------
 
2 355198 2.8147E+14
 
2 0 0
 
2 0 0
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
SQL> /
 
System altered.
 
SQL> select MEMBERS,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
 
MEMBERS FIRST_CHANGE# NEXT_CHANGE#
 
---------- ------------- ------------
 
2 355328 355331
 
2 355331 2.8147E+14
 
2 355325 355328 -----------------到此为止,数据开启了,open了;
 
但是这种方式,有个问题:###执行脚本,ALTER日志开启状态,出现警告信息;
 
WARNING: The following temporary tablespaces contain no files.
This condition can occur when a backup controlfile has
been restored. It may be necessary to add files to these
tablespaces. That can be done using the SQL statement:
ALTER TABLESPACE <tablespace_name> ADD TEMPFILE
Alternatively, if these temporary tablespaces are no longer
needed, then they can be dropped.
Empty temporary tablespace: TEMPTS1
 
---临时表空间视图查询:
 
SQL> select FILE_NAME,TABLESPACE_NAME,STATUS from dba_temp_files;
 
no rows selected
 
SQL> select TABLESPACE_NAME,CONTENTS from dba_tablespaces where CONTENTS='TEMPORARY';
 
TABLESPACE_NAME CONTENTS
 
------------------------------ ---------
 
TEMPTS1 TEMPORARY
 
SQL> select name from v$datafile;
 
/picclife/app/hukou/data/system01.dbf
 
alter tablespace tempts1 add tempfile '/picclife/app/hukou/data/temp01.dbf'; --如果提示报错提示文件已存在,‘xxx.dbf’ reuse;
 
OK
 
 
原文地址:https://www.cnblogs.com/lvcha001/p/7800661.html