oracle 控制文件
时间:2010-12-03 来源:hairui8991
控制文件是二进制文件,记录了数据库的结构和行为,在mount时一直使用,丢失需要恢复。
相关数据字典:
SQL> select * from v$controlfile;
SQL> select CONTROLFILE_SEQUENCE# from v$database;
SQL> select TYPE,RECORD_SIZE,RECORDS_TOTAL,RECORDS_USED from v$CONTROLFILE_RECORD_SECTION;
SQL> select value from V$spparameter where name='control_files';
控制文件的位置在参数文件中描述,多个控制文件是镜像的关系,最多八个,最少一个。
control_files='file1','file2'
减少控制文件:
有一个控制文件损坏,要将损坏的控制文件剔除。
1.修改参数文件,并验证
2.停止数据库
3.启动数据库
4.验证,查看v$controlfile
验证现在内存中的控制文件个数:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
/oracle/oradata/orcl/control03.ctl NO 16384 430
修改二进制的初始化参数文件中的control_files选项:
SQL> alter system set control_files='/oracle/oradata/orcl/control01.ctl','/oracle/oradata/orcl/control02.ctl' scope=spfile;
System altered.
验证参数文件已经被修改:
SQL> select value from V$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
验证内存中的值没有被修改,因为control_files是静态参数,想要改变必须重新启动数据库。
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
/oracle/oradata/orcl/control03.ctl NO 16384 430
重启数据库,使修改的参数其作用:
SQL> startup force;
ORACLE instance started.
Total System Global Area 243269632 bytes
Fixed Size 1218748 bytes
Variable Size 109053764 bytes
Database Buffers 130023424 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
验证内存被修改了:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
验证参数文件的值和内存中的值相同:
SQL> select value from V$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
增加控制文件的个数:
增加控制文件1到8个,保护控制文件,认识控制文件的一致性。
1.修改参数文件
2.停止数据库
3.复制控制文件
4.启动数据库
5.验证,查看v$controlfile
修改二进制看得初始化参数文件中的control_files选项:
SQL> alter system set control_files='/oracle/oradata/orcl/control01.ctl','/oracle/oradata/orcl/control02.ctl','/oracle/oradata/orcl/control03.ctl' scope=spfile;
System altered.
验证参数文件已经被修改:
SQL> select value from v$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
/oracle/oradata/orcl/control03.ctl
验证现在内存中的控制文件个数:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
重新启动数据库,使修改的参数起作用:
SQL> startup force;
ORACLE instance started.
Total System Global Area 243269632 bytes
Fixed Size 1218748 bytes
Variable Size 113248068 bytes
Database Buffers 125829120 bytes
Redo Buffers 2973696 bytes
ORA-00214: control file '/oracle/oradata/orcl/control01.ctl' version 870
inconsistent with file '/oracle/oradata/orcl/control03.ctl' version 857
因为control03.ctl刚才脱离了数据库,没有参加修改,control01.ctl和control02.ctl已经变化了,而control03.ctl没有
变化,所以时间戳不正确了。
使用操作系统命令将老的控制文件覆盖:
cp /oracle/oradata/orcl/control01.ctl /oracle/oradata/orcl/control03.ctl
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01507: database not mounted
因为此时处于数据库的nomount状态,想要open不能跨越mount台阶,所以必须先mount数据库。
启动到mount状态:
SQL> alter database mount;
Database altered.
启动到open状态:
SQL> alter database open;
Database altered.
验证参数文件中control_files选项的值:
SQL> select value from v$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
/oracle/oradata/orcl/control03.ctl
验证现在内存中的控制文件个数:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
/oracle/oradata/orcl/control03.ctl NO 16384 430
控制文件已经使用的空间和剩余空间:
SQL> select TYPE,RECORD_SIZE,RECORDS_TOTAL,RECORDS_USED from v$controlfile_record_section;
控制文件是预留空间。
控制文件的估计大小:
SQL> select sum(ceil(RECORD_SIZE*RECORDS_TOTAL/(8192-24))*2*8)+8*8 kb from V$CONTROLFILE_RECORD_SECTION;
8*8 为控制文件头,8个块;8-92-24,24为块头;ceil取整,因为分配单位为块;2倍,因为控制文件是内部镜像的。
如何将控制文件的信息转储到跟踪文件:
SQL> alter session set events 'immediate trace name controlf level 1';
level 1 代表只dump文件头的信息。
SQL>show parameter user_d;
转储文件在udump目录下,根据日期和时间来查找,也可以根据进程号码来查找。
SQL> alter session set events 'immediate trace name controlf level 10';
level 10 代表只dump文件的所有信息。
相关数据字典:
SQL> select * from v$controlfile;
SQL> select CONTROLFILE_SEQUENCE# from v$database;
SQL> select TYPE,RECORD_SIZE,RECORDS_TOTAL,RECORDS_USED from v$CONTROLFILE_RECORD_SECTION;
SQL> select value from V$spparameter where name='control_files';
控制文件的位置在参数文件中描述,多个控制文件是镜像的关系,最多八个,最少一个。
control_files='file1','file2'
减少控制文件:
有一个控制文件损坏,要将损坏的控制文件剔除。
1.修改参数文件,并验证
2.停止数据库
3.启动数据库
4.验证,查看v$controlfile
验证现在内存中的控制文件个数:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
/oracle/oradata/orcl/control03.ctl NO 16384 430
修改二进制的初始化参数文件中的control_files选项:
SQL> alter system set control_files='/oracle/oradata/orcl/control01.ctl','/oracle/oradata/orcl/control02.ctl' scope=spfile;
System altered.
验证参数文件已经被修改:
SQL> select value from V$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
验证内存中的值没有被修改,因为control_files是静态参数,想要改变必须重新启动数据库。
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
/oracle/oradata/orcl/control03.ctl NO 16384 430
重启数据库,使修改的参数其作用:
SQL> startup force;
ORACLE instance started.
Total System Global Area 243269632 bytes
Fixed Size 1218748 bytes
Variable Size 109053764 bytes
Database Buffers 130023424 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
验证内存被修改了:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
验证参数文件的值和内存中的值相同:
SQL> select value from V$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
增加控制文件的个数:
增加控制文件1到8个,保护控制文件,认识控制文件的一致性。
1.修改参数文件
2.停止数据库
3.复制控制文件
4.启动数据库
5.验证,查看v$controlfile
修改二进制看得初始化参数文件中的control_files选项:
SQL> alter system set control_files='/oracle/oradata/orcl/control01.ctl','/oracle/oradata/orcl/control02.ctl','/oracle/oradata/orcl/control03.ctl' scope=spfile;
System altered.
验证参数文件已经被修改:
SQL> select value from v$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
/oracle/oradata/orcl/control03.ctl
验证现在内存中的控制文件个数:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
重新启动数据库,使修改的参数起作用:
SQL> startup force;
ORACLE instance started.
Total System Global Area 243269632 bytes
Fixed Size 1218748 bytes
Variable Size 113248068 bytes
Database Buffers 125829120 bytes
Redo Buffers 2973696 bytes
ORA-00214: control file '/oracle/oradata/orcl/control01.ctl' version 870
inconsistent with file '/oracle/oradata/orcl/control03.ctl' version 857
因为control03.ctl刚才脱离了数据库,没有参加修改,control01.ctl和control02.ctl已经变化了,而control03.ctl没有
变化,所以时间戳不正确了。
使用操作系统命令将老的控制文件覆盖:
cp /oracle/oradata/orcl/control01.ctl /oracle/oradata/orcl/control03.ctl
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01507: database not mounted
因为此时处于数据库的nomount状态,想要open不能跨越mount台阶,所以必须先mount数据库。
启动到mount状态:
SQL> alter database mount;
Database altered.
启动到open状态:
SQL> alter database open;
Database altered.
验证参数文件中control_files选项的值:
SQL> select value from v$spparameter where name='control_files';
VALUE
--------------------------------------------------------------------------------
/oracle/oradata/orcl/control01.ctl
/oracle/oradata/orcl/control02.ctl
/oracle/oradata/orcl/control03.ctl
验证现在内存中的控制文件个数:
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ---------------------------------------- --- ---------- --------------
/oracle/oradata/orcl/control01.ctl NO 16384 430
/oracle/oradata/orcl/control02.ctl NO 16384 430
/oracle/oradata/orcl/control03.ctl NO 16384 430
控制文件已经使用的空间和剩余空间:
SQL> select TYPE,RECORD_SIZE,RECORDS_TOTAL,RECORDS_USED from v$controlfile_record_section;
控制文件是预留空间。
控制文件的估计大小:
SQL> select sum(ceil(RECORD_SIZE*RECORDS_TOTAL/(8192-24))*2*8)+8*8 kb from V$CONTROLFILE_RECORD_SECTION;
8*8 为控制文件头,8个块;8-92-24,24为块头;ceil取整,因为分配单位为块;2倍,因为控制文件是内部镜像的。
如何将控制文件的信息转储到跟踪文件:
SQL> alter session set events 'immediate trace name controlf level 1';
level 1 代表只dump文件头的信息。
SQL>show parameter user_d;
转储文件在udump目录下,根据日期和时间来查找,也可以根据进程号码来查找。
SQL> alter session set events 'immediate trace name controlf level 10';
level 10 代表只dump文件的所有信息。
相关阅读 更多 +