控制文件一个数据库一个就行,但一般不止一个,因为若那一个不慎坏了丢了那数据库里的数据也就差不多没了,所以一般数据库要有多个控制文件,他们都是一样的,分别放在不同的地方

查看控制文件相关信息:

SQL> conn sys/orcl as sysdba
已连接。
SQL> select type,record_size,records_total,records_used from
  2  v$controlfile_record_section
  3  where type in('datafile','tablespace','redo log');

未选定行

record_size:每记录字节数,records_total:记录总数,records_used:使用的记录个数
这里未选定行是因为后面where子句限制了,可能那些没有任何东东,下面演示一个不限制的。

有错误,待会。暂定问题4.


用数据字典V$parameter或v$controlfile获取控制文件的名字:

SQL> select value from v$parameter
  2  where name='control_files';

VALUE
--------------------------------------------------------------------------------
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL, C:\ORACLE\PRODUCT\10.2.0\OR
ADATA\ORCL\CONTROL02.CTL, C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL

SQL> col name for a55
SQL> select * from v$controlfile;

STATUS  NAME                                                    IS_ BLOCK_SIZE
------- ------------------------------------------------------- --- ----------
FILE_SIZE_BLKS
--------------
        C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL     NO       16384
           430

        C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL     NO       16384
           430

        C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL     NO       16384
           430
第一个仅仅是给出了控制文件的名字和位置,第二个明显要详细得多,大小一样,存储方式都不是BLOCK。
而且两种方法都可以看的出控制文件都存在同一个目录下,这是不必要也是非常危险的。

不过这个430是神马东东?求指导!


下面开始复制控制文件:
准备工作在cmd中:
切换到控制文件所在的目录:
C:\>cd c:\oracle\product\10.2.0\oradata\orcl

C:\oracle\product\10.2.0\oradata\orcl>dir *.ctl
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\oracle\product\10.2.0\oradata\orcl 的目录

2012-04-25  14:07         7,061,504 CONTROL01.CTL
2012-04-25  14:07         7,061,504 CONTROL02.CTL
2012-04-25  14:07         7,061,504 CONTROL03.CTL
               3 个文件     21,184,512 字节
               0 个目录  6,681,051,136 可用字节

C:\oracle\product\10.2.0\oradata\orcl>cd c:\

新建三个目录:
C:\>mkdir disk3\orcl

C:\>mkdir disk6\orcl

C:\>mkdir disk9\orcl

查看:
C:\>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\ 的目录

2012-04-20  20:10                 0 AUTOEXEC.BAT
2012-04-20  20:10                 0 CONFIG.SYS
2012-04-25  14:53    <DIR>          disk3
2012-04-25  14:53    <DIR>          disk6
2012-04-25  14:53    <DIR>          disk9
2012-04-20  20:15    <DIR>          Documents and Settings
2012-04-20  21:43    <DIR>          oracle
2012-04-23  22:45    <DIR>          PerfLog
2012-04-25  14:05    <DIR>          Program Files
2012-04-25  14:51    <DIR>          TEMP
2012-04-20  20:20    <DIR>          WINDOWS
               2 个文件              0 字节
               9 个目录  6,681,042,944 可用字节

切换sqlplus窗口:
首先查看自己的数据库系统使用的是正文初始化参数文件(pfile)还是服务器初始化参数文件(spfile):

SQL> show parameter pfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      C:\ORACLE\PRODUCT\10.2.0\DB_1\
                                                 DBS\SPFILEORCL.ORA

是后者。

SQL> select * from v$controlfile;

STATUS  NAME                                                    IS_ BLOCK_SIZE
------- ------------------------------------------------------- --- ----------
FILE_SIZE_BLKS
--------------
        C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL     NO       16384
           430

        C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL     NO       16384
           430

        C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL     NO       16384
           430


SQL> alter system set control_files=
  2  'c:\disk3\orcl\control01.ctl',
  3  'c:\disk6\orcl\control02.ctl',
  4  'c:\disk9\orcl\control03.ctl'
  5  scope=spfile;

系统已更改。

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

SQL> host copy c:\oracle\product\10.2.0\oradata\orcl\control01.ctl c:\disk3\control01.ctl;(复制成功时会闪过一个命令提示符窗口)

SQL> host copy c:\oracle\product\10.2.0\oradata\orcl\control02.ctl c:\disk6\control02.ctl

SQL> host copy c:\oracle\product\10.2.0\oradata\orcl\control03.ctl c:\disk9\control03.ctl;

切换cmd查看:
C:\>dir disk3 disk6 disk9
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\disk3 的目录

2012-04-25  15:01    <DIR>          .
2012-04-25  15:01    <DIR>          ..
2012-04-25  14:56         7,061,504 control01.ctl
2012-04-25  14:53    <DIR>          orcl
               1 个文件      7,061,504 字节

 C:\disk6 的目录

2012-04-25  15:02    <DIR>          .
2012-04-25  15:02    <DIR>          ..
2012-04-25  14:56         7,061,504 control02.ctl
2012-04-25  14:53    <DIR>          orcl
               1 个文件      7,061,504 字节

 C:\disk9 的目录

2012-04-25  15:02    <DIR>          .
2012-04-25  15:02    <DIR>          ..
2012-04-25  14:56         7,061,504 control03.ctl
2012-04-25  14:53    <DIR>          orcl
               1 个文件      7,061,504 字节
               3 个目录  6,637,502,464 可用字节

切回:
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              88081764 bytes
Database Buffers           75497472 bytes
Redo Buffers                2945024 bytes
ORA-00205: ?????????, ??????, ???????

 

这里出现了一个问题3,我就怕这个问题,上回就是这个练习折腾了好久说。。。这次不知会怎样了又。。

好了,是因为将新的控制文件名添加到参数文件的control_file参数中时出错了,导致数据库启动时找不到控制文件而失败。现改正如下:

启用DOS窗口(我前面都是说cmd窗口,我说的是一个意思,只是忘了专有名词了。。。)先登录sqlplus /nolog
SQL> host copy c:\disk3\control01.ctl c:\disk3\orcl\control01.ctl
已复制         1 个文件。

SQL> host copy c:\disk6\control02.ctl c:\disk6\orcl\control02.ctl
已复制         1 个文件。

SQL> host copy c:\disk9\control03.ctl c:\disk9\orcl\control03.ctl
已复制         1 个文件。

再调用一个DOS窗口或先退出sql,查看一下:
C:\>dir disk3\orcl disk6\orcl disk9\orcl
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\disk3\orcl 的目录

2012-04-25  19:50    <DIR>          .
2012-04-25  19:50    <DIR>          ..
2012-04-25  14:56         7,061,504 control01.ctl
               1 个文件      7,061,504 字节

 C:\disk6\orcl 的目录

2012-04-25  19:51    <DIR>          .
2012-04-25  19:51    <DIR>          ..
2012-04-25  14:56         7,061,504 control02.ctl
               1 个文件      7,061,504 字节

 C:\disk9\orcl 的目录

2012-04-25  19:51    <DIR>          .
2012-04-25  19:51    <DIR>          ..
2012-04-25  14:56         7,061,504 control03.ctl
               1 个文件      7,061,504 字节
               2 个目录  6,603,849,728 可用字节

好了,正常。直接在硬盘上也可以找到的。

SQL> conn sys/ as sysdba
输入口令:
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1247900 bytes
Variable Size              88081764 bytes
Database Buffers           75497472 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
数据库已经打开。

检查一下:
SQL> col name for a55
SQL> select * from v$controlfile;

STATUS  NAME                                                    IS_ BLOCK_SIZE
------- ------------------------------------------------------- --- ----------
FILE_SIZE_BLKS
--------------
        C:\DISK3\ORCL\CONTROL01.CTL                             NO       16384
           430

        C:\DISK6\ORCL\CONTROL02.CTL                             NO       16384
           430

        C:\DISK9\ORCL\CONTROL03.CTL                             NO       16384
           430

一切正常。

最后一步,把原来的、搞错的控制文件删除。可以手动,可以代码。

代码:
切换目录:C:\Documents and Settings\Administrator>cd c:\oracle\product\10.2.0\oradata\or


查看:C:\oracle\product\10.2.0\oradata\orcl>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\oracle\product\10.2.0\oradata\orcl 的目录

2012-04-20  21:50    <DIR>          .
2012-04-20  21:50    <DIR>          ..
2012-04-25  14:56         7,061,504 CONTROL01.CTL
2012-04-25  14:56         7,061,504 CONTROL02.CTL
2012-04-25  14:56         7,061,504 CONTROL03.CTL
2012-04-25  20:09       104,865,792 EXAMPLE01.DBF
2012-04-25  20:09        52,429,312 REDO01.LOG
2012-04-25  20:09        52,429,312 REDO02.LOG
2012-04-25  20:09        52,429,312 REDO03.LOG
2012-04-25  20:09       251,666,432 SYSAUX01.DBF
2012-04-25  20:09       503,324,672 SYSTEM01.DBF
2012-04-23  22:20        22,028,288 TEMP01.DBF
2012-04-25  20:09        41,951,232 UNDOTBS01.DBF
2012-04-25  20:09         5,251,072 USERS01.DBF
              12 个文件  1,107,559,936 字节
               2 个目录  6,601,113,600 可用字节

3个控制文件。删除:

C:\oracle\product\10.2.0\oradata\orcl>del contro*

查看:
C:\oracle\product\10.2.0\oradata\orcl>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\oracle\product\10.2.0\oradata\orcl 的目录

2012-04-25  20:19    <DIR>          .
2012-04-25  20:19    <DIR>          ..
2012-04-25  20:09       104,865,792 EXAMPLE01.DBF
2012-04-25  20:09        52,429,312 REDO01.LOG
2012-04-25  20:09        52,429,312 REDO02.LOG
2012-04-25  20:09        52,429,312 REDO03.LOG
2012-04-25  20:09       251,666,432 SYSAUX01.DBF
2012-04-25  20:09       503,324,672 SYSTEM01.DBF
2012-04-23  22:20        22,028,288 TEMP01.DBF
2012-04-25  20:09        41,951,232 UNDOTBS01.DBF
2012-04-25  20:09         5,251,072 USERS01.DBF
               9 个文件  1,086,375,424 字节
               2 个目录  6,622,322,688 可用字节

没了
切换目录,这回是搞错的。。。:
C:\oracle\product\10.2.0\oradata\orcl>cd c:\disk3

C:\disk3>del contro*

C:\disk3>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\disk3 的目录

2012-04-25  20:20    <DIR>          .
2012-04-25  20:20    <DIR>          ..
2012-04-25  19:50    <DIR>          orcl
               0 个文件              0 字节
               3 个目录  6,629,384,192 可用字节

C:\disk3>cd orcl

C:\disk3\orcl>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\disk3\orcl 的目录

2012-04-25  19:50    <DIR>          .
2012-04-25  19:50    <DIR>          ..
2012-04-25  20:09         7,061,504 control01.ctl
               1 个文件      7,061,504 字节
               2 个目录  6,629,384,192 可用字节

C:\disk3\orcl>cd disk6
系统找不到指定的路径。

C:\disk3\orcl>del control*

手贱删错了。。。暂定问题5。。。

C:\disk3\orcl>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\disk3\orcl 的目录

2012-04-25  20:20    <DIR>          .
2012-04-25  20:20    <DIR>          ..
               0 个文件              0 字节
               2 个目录  6,636,445,696 可用字节

C:\disk3\orcl>cd disk9
系统找不到指定的路径。

C:\disk3\orcl>cd disk9
系统找不到指定的路径。

C:\disk3\orcl>cd c:\disk9

C:\disk9>del contro*

C:\disk9>cd c:\disk6

C:\disk6>del contro*

C:\disk6>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\disk6 的目录

2012-04-25  20:29    <DIR>          .
2012-04-25  20:29    <DIR>          ..
2012-04-25  19:51    <DIR>          orcl
               0 个文件              0 字节
               3 个目录  6,649,733,120 可用字节

C:\disk6>cd orcl

C:\disk6\orcl>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 F858-0D2D

 C:\disk6\orcl 的目录

2012-04-25  19:51    <DIR>          .
2012-04-25  19:51    <DIR>          ..
2012-04-25  20:09         7,061,504 control02.ctl
               1 个文件      7,061,504 字节
               2 个目录  6,649,667,584 可用字节


气死我啦!!!

所以啊,手动吧亲!!!

还有啊,备份啊备份啊亲,很重要!!我居然漏了这一步。。。。我恨啊!!