今天同事在MSN上让我解决一个ORACLE报错,造成的数据库无法启动。
      (插一句,这位同事就坐在我的隔壁,我们居然用MSN沟通,不知道这是技术的进步,还是技术造就的资源严重浪费)
       登录到数据库主机,看到确实数据库在mount状态下,无法启动了。
       试图启动数据库时,报如下错误:
      
ORA-01122: database file 4 failed verification check
ORA-01110: data file 4: '/database/app/oracle/oradata/data/users01.dbf'
ORA-01200: actual file size of 410720 is smaller than correct size of 411840
blocks

       查阅一下ORACLE对ORA-01200的官方解释:
 
actual file size of string is smaller than correct size of string blocks

Cause: The size of the file as returned by the operating system is smaller than the size of the file as indicated in the file header and the control file. Somehow the file has been truncated. Maybe it is the result of a half completed copy.

Action: Restore a good copy of the data file and do recovery as needed.

        看上去问题很严重。因为在mount状态下,很多操作也是无法完成的。这个数据库根本没有开启ARCHIVE没有必要的备份。正常的方法不行,就要想想其他的方法了 -:)
        通过报错,我们不难发现其实时控制文件记录的信息比实际上从操作系统中得到的文件大小不同。记录的信息比实际的要大!并且应该在文件头完整的保存着ORACLE的内部信息,否则就应该不会报这样的错误了。
         首先做一个“补丁”。在操作系统上完成
        
dd if=/dev/zero of=/tmp/patch00 count=1120 bs=8k

         这里,你需要确认数据库的block_size的大小,我的是8192,所以bs是8k。同时ORACLE的警告大小的差别是按照块来显示的,所以count为1120。其实可以有很多的表述方法(命令),只是这样可能会比较直观吧。
          然后就是为这个文件打上这个“补丁”了。
         
cat /tmp/patch00 >>/database/app/oracle/oradata/data/users01.dbf

        注意一定是“>>”,追加在users01.dbf的文件尾部,否则就完蛋了(连ORACLE的内部信息也被毁了)
         然后启动数据库:
 
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> alter database open;

Database altered.

SQL>

         OK!启动了。
         BY THE WAY:
         对数据库文件的操作,我不是上来就做的。没有人可以保证100%的成功。一定要先备份!别把自己逼的走投无路!
        数据库启动后别以为一切都OK了,一定要先做个备份。否则极有可能数据库再次崩溃,然后呢,连一点数据都救回来!
        切记-:)