由于控制文件对于数据库的重要性很高,所以通常在dbca建库以后,都会对控制文件多路复用。如,在Oracle10g中,默认控制文件有3份,内容完全一致,通常位于$ORACLE_BASE/oradata/SID/下面,名字为control01.ctl,control02.ctl,control03.ctl,而到了11g,默认只有2个份,一个位于$ORACLE_BASE/oradata/SID/下面,名字为control01.ctl,另一份位于$ORACLE_BASE/fast_recovery_area/SID/下面,名字为control02.ctl。
当然了,我说的都是默认安装的情况下,完全可以通过在pfile中自定义不同的路径。
有时候,可能会碰到某些库只有1个控制文件,没有镜像,即没有对控制文件多路复用,显然这是不太好的,需要为数据库增加控制文件的镜像文件,下面来做个测试
----------------------------华丽丽的分割线----------------------------
Oracle控制文件的多路复用
在CentOS 6.4下安装Oracle 11gR2(x64)
Oracle 10g expdp导出报错ORA-4031的解决方法
----------------------------华丽丽的分割线----------------------------
--启动数据库,查看当前控制文件信息
SQL> startup
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2232960 bytes
Variable Size 507514240 bytes
Database Buffers 322961408 bytes
Redo Buffers 2396160 bytes
Database mounted.
Database opened.
SQL> show parameter control_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/app/oracle/oradata/zlm11g
/control01.ctl, /u01/app/oracl
e/fast_recovery_area/zlm11g/co
ntrol02.ctl
默认装完库以后,已经有2个控制文件,其中,control02.ctl是镜像
--查看control_file参数是否可以在线修改
SQL> col name for a20
SQL> select name,issys_modifiable from v$parameter where;
NAME ISSYS_MOD
-------------------- ---------
control_files FALSE
显然,FALSE表示无法在线修改该参数,那么多路复用控制文件就意味着要重启数据库了
--创建pfile
SQL> create pfile from spfile;
File created.
--关闭数据库并修改pfile,增加控制文件镜像(在control_files参数后面添加镜像的位置、文件名)
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> !
zlm11g.__db_cache_size=322961408
zlm11g.__java_pool_size=4194304
zlm11g.__large_pool_size=4194304
zlm11g.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
zlm11g.__pga_aggregate_target=335544320
zlm11g.__sga_target=503316480
zlm11g.__shared_io_pool_size=0
zlm11g.__shared_pool_size=163577856
zlm11g.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/zlm11g/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/zlm11g/control01.ctl','/u01/app/oracle/fast_recovery_area/zlm11g/control02.ctl',
'/u01/control03.ctl'--红色部分为新增的控制文件镜像
*.db_block_size=8192
zlm11g.db_create_file_dest='/u01/app/oracle/oradata/zlm11g/'
*.db_domain=''
*.db_name='zlm11g'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4322230272
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=zlm11gXDB)'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=838860800
*.memory_target=838860800
*.open_cursors=300
"/u01/app/oracle/product/11.2.0/db_1/dbs/initzlm11g.ora" 27L, 1048C written
--在OS级别复制一份控制文件镜像
[oracle@zlm ~]$ cp $ORACLE_BASE/oradata/zlm11g/control01.ctl /u01/control03.ctl
[oracle@zlm ~]$ cd /u01
[oracle@zlm u01]$ ls
app bak control03.ctl dave.trc expdp rman.log rman.trc
[oracle@zlm u01]$ exit
exit
--用pfile启动数据库
SQL> startup pfile=$ORACLE_HOME/dbs/initzlm11g.ora
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2232960 bytes
Variable Size 507514240 bytes
Database Buffers 322961408 bytes
Redo Buffers 2396160 bytes
Database mounted.
Database opened.
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/app/oracle/oradata/zlm11g
/control01.ctl, /u01/app/oracl
e/fast_recovery_area/zlm11g/co
ntrol02.ctl, /u01/control03.ct
新增的镜像控制文件已经生效,现在有3个控制文件了,一个原始文件,2路复用
--创建新的spfile l
SQL> create spfile from pfile;
File created.
--关库并用spfile重新启动
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2232960 bytes
Variable Size 507514240 bytes
Database Buffers 322961408 bytes
Redo Buffers 2396160 bytes
Database mounted.
Database opened.
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/app/oracle/oradata/zlm11g
/control01.ctl, /u01/app/oracl
e/fast_recovery_area/zlm11g/co
ntrol02.ctl, /u01/control03.ct
至此,已经完成了对控制文件的复用,从2份增加到了3份,注意,是必须停库的。
下面尝试用另一种方式来增加控制文件镜像,采用spfile动态修改+备份控制文件的方式,看是否可行
--修改spfile,添加第4个控制文件
SQL> alter system set control_files='/u01/app/oracle/oradata/zlm11g/control01.ctl,/u01/oracle/fast_recovery_area/zlm11g/control02.ctl,/u01/control03.ctl,/u01/control04.ctl' scope=spfile;
System altered.
--备份当前控制文件并生成镜像文件
SQL> alter database backup controlfile to '/u01/control04.ctl';
Database altered.
SQL> alter database backup controlfile to trace as '/u01/control.bak';
Database altered.
注意这两条命令的区别,前面的语句生成的是binary的控制文件,而后面的语句是生成可读的trace文件(通常用于重建控制文件)