Chinaunix首页 | 论坛 | 博客
  • 博客访问: 760899
  • 博文数量: 434
  • 博客积分: 11187
  • 博客等级: 上将
  • 技术积分: 5221
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 01:00
文章分类

全部博文(434)

文章存档

2016年(2)

2013年(1)

2012年(115)

2011年(195)

2010年(32)

2009年(89)

分类: Oracle

2010-12-03 16:50:00

控制文件是二进制文件,记录了数据库的结构和行为,在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文件的所有信息。
阅读(1276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~