1、案例现象
在数据库startup时,报错:
[oracle@localhost ~]$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Sep 19 19:31:05 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area  202445884 bytes
Fixed Size                   451644 bytes
Variable Size             167772160 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/u01/u01d/sysaux01.dbf'
ORA-01200: actual file size of 38400 is smaller than correct size of 51200 blocks

2、问题分析

SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL>
报错说,数据文件的实际大小与正确的大小较小。
SQL> col name for a50
SQL> select file#,status,bytes/1024/1024 mb,name from v$datafile;
     FILE# STATUS          MB NAME
---------- ------- ---------- --------------------------------------------------
         1 SYSTEM         300 /u01/u01d/system01.dbf
         2 ONLINE         100 /u01/u01d/undotbs01.dbf
  3 SYSTEM   400 /u01/u01d/sysaux01.dbf
         4 ONLINE          25 /u01/u01d/users01.dbf
         5 ONLINE          25 /u01/u01d/indx01.dbf
         6 ONLINE         100 /u01/u01d/perfstat.dbf
         7 ONLINE          10 /u01/u01d/timi01.dbf
6 rows selected.
SQL>
可以看出控制文件记录的是400M,而du -sh system01.dbf结果是301M。接着,查阅在线帮助文档:
[oracle@localhost ~]$oerr ora 01200
01200, 00000, "actual file size of %s is smaller than correct size of %s 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
//         controlfile. 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.
[oracle@localhost ~]$
可以看出,是数据文件的实际大小与控制文件和该数据文件的头部所记录的大小不同而引起的。一般是数据库异常导致的,在数据库的运行过程中,重新启动时,文件resize之后出现异常状况时都可能会遇到。下面看看怎么恢复,以打开数据库:

3、确定解决方案

首先转储数据文件头部看看:
SQL> alter session set events 'immediate trace name FILE_HDRS level 10';
Session altered.
SQL> @/u01/admin/mytools/myscripts/gettrcname.sql
TRACE_FILE_NAME
--------------------------------------------------------------------------------------------------------------
/u01/admin/denver/udump/denver_ora_4669.trc
SQL>
[oracle@localhost ~]$more /u01/admin/denver/udump/denver_ora_5349.trc
.....
FILE HEADER:
        Software vsn=153092096=0x9200000, Compatibility Vsn=134217728=0x8000000
        Db ID=4004057640=0xeea91228, Db Name='DENVER'
        Activation ID=0=0x0
       Control Seq=1908=0x774, File size=51200=0xc800  //可见此处的大小是51200, 而ORA-01200报告说实际大小是38400
        File Number=1, Blksiz=8192, File Type=3 DATA
Tablespace #0 - SYSTEM  rel_fn:1
.....

解决方案的确定:
1.如果有备份可以采用备份来恢复.
2.最坏的情况是将文件上的数据提取出来,重新加载到数据库。
3.最好的情况是通过一些特殊的手段,将该文件恢复,重新ONLINE运行。
4.通过Metalink及各种途径寻找已知的解决方案。

此时,发现根本没有任何的备份。没办法,只有使用bbed工具来非常规恢复了。

4、用BBED工具恢复

bbed就是英文block browse block edit的缩写,用来直接查看和修改数据文件数据的一个工具。在windows上没有提供这个工具,在linux上面有,需要编译:
make -f ins_rdbms.mk BBED=$ORACLE_HOME/rdbms/lib/bbed $ORACLE_HOME/bin/bbed
然后把$ORACLE_HOME/rdbms/lib加到环境变量的PATH里面,就可以直接在命令中bbed了。不过有个默认的口令blockedit。在运行bbed之前先要自己写几个配置文件:

这里假定有2个文件,分别是file.txt、par.bbd

[oracle@localhost ~]$ ls
file.txt bbed.par
[oracle@localhost ~]$ more bbed.par
blocksize=8192
listfile=/home/oracle/file
mode=edit
[oracle@localhost ~]$ more file.txt
3 /free/oracle/oradata/orcl/sysaux01.dbf 1614807040

5、恢复过程

接下来就可以使用BBED工具了:
[oracle@localhost ~]$ bbed
Password:

BBED: Release 2.0.0.0.0 - Limited Production on Tue Sep 20 18:19:33 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED>

BBED> modify /x 00960000 offset 44  ---用find /x c8 curr 找出51200所在之处, 因为38400的十六进制为9600,在根据倒位法则就是0096
File: /u01/u01d/system01.dbf (1)
Block: 1                Offsets:   44 to  555           Dba:0x00400001
------------------------------------------------------------------------
00960000 00200000 01000300 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 a1014000 07000000 00000000
4bbaa02a 9aabd02a 0e3a0f00 00000000 00000000 00000000 00000000 00000400
7a061000 00000000 86a7dd2a 01005162 01000000 8d660000 1000ffbf 02000000
00000000 6c010000 54abd02a 6b010000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 06005359 5354454d 00000000 00000000 00000000
00000000 00000000 00000000 01000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 0a000a00 9cefc52a
5c0a0d00 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<32 bytes per line>
BBED> sum apply
Check value for File 1, Block 1:
current = 0x1459, required = 0x1459
BBED> quit

试着打开数据库:
SQL> alter database open;
Database altered.
SQL> col name for a50
SQL> select file#,status,bytes/1024/1024 mb,name from v$datafile;
     FILE# STATUS          MB NAME
---------- ------- ---------- --------------------------------------------------
         1 SYSTEM         300 /u01/u01d/system01.dbf
         2 ONLINE         100 /u01/u01d/undotbs01.dbf
  3 SYSTEM   300 /u01/u01d/sysaux01.dbf  ---控制文件里记录是300M,而且数据库已经成功打开
         4 ONLINE          25 /u01/u01d/users01.dbf
         5 ONLINE          25 /u01/u01d/indx01.dbf
         6 ONLINE         100 /u01/u01d/perfstat.dbf
         7 ONLINE          10 /u01/u01d/timi01.dbf
6 rows selected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area  202445884 bytes
Fixed Size                   451644 bytes
Variable Size             167772160 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.
ok, 成功打开数据库。

6、总结
ORA-01200错误的具体原因已经清楚,但是是什么导致的这次数据库故障,已无从考究。但是应该可以肯定的是,此时的数据库应该立即做个导出重建导入操作。

本文出自 “技术成就梦想” 博客,请务必保留此出处http://ixdba.blog.51cto.com/2895551/668261

遭遇ORA-01200错误的原因及解决方法相关推荐

  1. nginx产生【413 request entity too large】错误的原因与解决方法

    nginx产生[413 request entity too large]错误的原因与解决方法 参考文章: (1)nginx产生[413 request entity too large]错误的原因与 ...

  2. 400错误是什么原因_499错误是什么?499错误的原因及解决方法

    ​ HTTP状态码出现499错误有多种情况,499错误是什么?下面我们来学习Nginx 499错误的原因及解决方法. 日志记录中HTTP状态码出现499错误有多种情况,比如nginx反代到一个永远打不 ...

  3. ORA-06413连接未打开的错误的原因和解决方法

    ORA-06413连接未打开的错误的原因和解决方法 参考文章: (1)ORA-06413连接未打开的错误的原因和解决方法 (2)https://www.cnblogs.com/wybshyy/p/58 ...

  4. tcp连接时,BROKEN PIPE错误的原因以及解决方法

    tcp连接时,BROKEN PIPE错误的原因以及解决方法 参考文章: (1)tcp连接时,BROKEN PIPE错误的原因以及解决方法 (2)https://www.cnblogs.com/ctho ...

  5. (转)SQL Server数据库复制错误的原因及解决方法

    在使用SQL Server数据库中,有时在复制时会出现错误,下面就为你分类介绍SQL Server数据库复制错误的原因及解决方法,希望对您学习SQL Server数据库有所帮助. 错误 消息 MSSQ ...

  6. 出现 java.lang.UnsupportedClassVersionError 错误的原因及解决方法

    1 错误描述 正常运行程序,报出如下错误: 2 错误原因 通过观察上述标记出来的错误描述,咱们可以知道: java.lang.UnsupportedClassVersionError:Unsuppor ...

  7. 元空间不足java.lang.OutOfMemoryError: PermGen space 错误的原因及解决方法

    出现 java.lang.OutOfMemoryError: PermGen space 错误的原因及解决方法 原因:堆内存的永久保存区内存分配不足(缺省默认为64M),导致内存溢出错误. 解决的方案 ...

  8. 503 Service Temporarily Unavailable 错误可能原因及解决方法

    503 Service Temporarily Unavailable 错误可能原因及解决方法 参考文章: (1)503 Service Temporarily Unavailable 错误可能原因及 ...

  9. 导致403错误的原因和解决方法

    一.导致403错误的主要原因 403 Forbidden错误的原因和解决方法 1.你的IP被列入黑名单. 2.你在一定时间内过多地访问此网站(一般是用采集程序),被防火墙拒绝访问了. 3.网站域名解析 ...

  10. Nginx 502 Bad Gateway 错误的原因及解决方法

    2019独角兽企业重金招聘Python工程师标准>>> 刚才在调试程序的时候,居然服务器502错误,昨天晚上也发生了,好像我没有做非常规的操作. 然后网上寻找了下答案, 把一些原因及 ...

最新文章

  1. CUDA软件系统知识
  2. 全面!一文理解微服务高可用的常用手段
  3. tf.io.gfile.glob 遍历文件
  4. Java基础与实践题库_Java程序设计基础与实践(题库版)
  5. C++类构造函数初始化列表
  6. 如何在返回String的Spring MVC @ResponseBody方法中响应HTTP 400错误?
  7. Hibernate Criterion
  8. Windows10下搭建Java环境(最新教程)
  9. 字体 素材_最新2019毛笔书法字体素材合集!自创字体解决版权,甲方看都说好...
  10. 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”
  11. HDU 3896 Greatest TC 双连通分量
  12. 学术顶会再突破!计算平台MaxCompute论文入选国际顶会VLDB 2021
  13. 淘汰率最高的腾讯产品面试题
  14. angularjs1-8,cacheFactory,sce
  15. xshell远程登录工具的星号密码查看方法
  16. laravel安装指定版本
  17. 电商后台管理系统分享
  18. Google Gmail十年回首
  19. 关于软件工程中的银弹
  20. MMDetection理解

热门文章

  1. angular2 学习二 最简单的模板
  2. 【Cocos2d入门教程二】Cocos2d-x基础概念
  3. PHP 正则表达式 最后总结
  4. petshop4.0 详解之一(系统架构设计)
  5. 常见linux命令使用方法(二)
  6. python实训报告pygame_[源码和文档分享]基于Python的PyGame库实现的2048小游戏
  7. 26_练习2_用户搜索_初始化显示(静态页面)
  8. tab 页形式展现多张报表
  9. 2018.06.28 与或(线段树)
  10. Linux笔记:vim