一次ora-01200错误的修复

背景:数据库断电启动,只能到mount状态。
     报错如下:
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 51 failed verification check
ORA-01110: data file 51: '/opt/oracle/oradata/data/data107.dbf'
ORA-01200: actual file size of 393856 is smaller than correct size of 394496 blocks。

查看了数据文件的最新修改时间,最新修改时间分为好几批。这下,坏了。没有备份,怎么办?
recover database了下,还是不行。

转载:http://blog.chinaunix.net/uid-22948773-id-3302663.html 感谢美丽人生的博客提供了解决办法。
 
  1. [oracle@db2server huateng]$ sqlplus / as sysdba

  2. SQL*Plus: Release 11.2.0.1.0 Production on Sun Aug 5 17:24:07 2012

  3. Copyright (c) 1982, 2009, Oracle. All rights reserved.

  4. Connected to an idle instance.

  5. SQL> startup
  6. ORACLE instance started.

  7. Total System Global Area 506368000 bytes
  8. Fixed Size 1337520 bytes
  9. Variable Size 331351888 bytes
  10. Database Buffers 167772160 bytes
  11. Redo Buffers 5906432 bytes
  12. Database mounted.
  13. ORA-01122: database file 6 failed verification check
  14. ORA-01110: data file 6: '/u01/app/oracle/oradata/huateng/htyansp01.dbf'
  15. ORA-01200: actual file size of 7399 is smaller than correct size of 12800
  16. blocks

  17. 这个错误表示文件头记录的数据文件的大小与实际不一致:
  1. SQL> ! ls -ltr /u01/app/oracle/oradata/huateng/htyansp01.dbf
  2. -rw-r--r-- 1 oracle oinstall 60620800 08-05 17:25 /u01/app/oracle/oradata/huateng/htyansp01.dbf


  3. SQL> select bytes from v$datafile where name='/u01/app/oracle/oradata/huateng/htyansp01.dbf';

  4.      BYTES
  5. ----------

  6.  104857600

  7. SQL> select 60620800-8192 from dual;

  8. 60620800-8192
  9. -------------

  10.      60612608

  11. SQL> select 60612608/8192 from dual;

  12. 60612608/8192
  13. -------------

  14.          7399

  15. 实际文件的大小为 7399 个BLOCKS。 
  16.          

  17. SQL> select bytes from v$datafile where name='/u01/app/oracle/oradata/huateng/htyansp01.dbf';

  18.      BYTES
  19. ----------

  20.  104857600

  21. SQL> select 104857600/8192 from dual;

  22. 104857600/8192
  23. --------------

  24.          12800
而控制文件中记录的文件大小为12800个 BLOCKS。
如果有备份的话可以通过备份恢复的方法来解决这个问题。如果没有备份的话,
一种简单解决这个错误的方法是通过把数据文件构造到和控制文件记录的一模一样来骗过oracle。
如下:
  SQL >   alter   database  open ;
  1. alter database open
  2. *
  3. ERROR at line 1:
  4. ORA-01122: database file 6 failed verification check
  5. ORA-01110: data file 6: '/u01/app/oracle/oradata/huateng/htyansp01.dbf'
  6. ORA-01200: actual file size of 7399 is smaller than correct size of 12800
  7. blocks


  8. SQL> select 12800-7399 from dual
  9.   2 ;

  10. 12800-7399
  11. ----------

  12.       5401

  13. SQL> ! dd if=/dev/zero of=/u01/app/oracle/oradata/huateng/htyansp01.dbf bs=8192 count=5401 seek=7400 
  14. 5401+0 records in
  15. 5401+0 records out
  16. 44244992 bytes (44 MB) copied, 0.152335 seconds, 290 MB/s

  17. SQL> ! ls -ltr /u01/app/oracle/oradata/huateng/htyansp01.dbf
  18. -rw-r--r-- 1 oracle oinstall 104865792 08-05 17:37 /u01/app/oracle/oradata/huateng/htyansp01.dbf


  19. SQL> alter database open;

  20. Database altered.

解决过程

  ORA-01200: actual file size of 393856 is smaller than correct size of 394496 blocks。

  SQL> select 394496-393856 from dual;


394496-393856
-------------
          640

SQL> ! dd if=/dev/zero of=/opt/oracle/oradata/data/data107.dbf bs=16384 count=640 seek=393857
??? 640+0 ??
??? 640+0 ??

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 56 failed verification check
ORA-01110: data file 56: '/opt/oracle/oradata/data/data112.dbf'
ORA-01200: actual file size of 354240 is smaller than correct size of 354816 blocks

又有新的文件冒出来了。接着如法炮制。一共解决了七八个这样的文件之后,终于有变化了:
SQL>  alter database open;
 alter database open
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kcratr1_lastbwr], [], [], [], [],
[], [], []

SQL> recover database;
Media recovery complete.
SQL> alter database open;

Database altered.

自此,终于打开数据库了。赶紧备份。

美丽人生的博客还介绍了一种使用bbed修改数据文件头的做法,看得懂的可以试试。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13162384/viewspace-1259574/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13162384/viewspace-1259574/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值