• 生产库ORA-01200 actual file size of x is smaller than correct size of y blocks一例解决


    周五晚,一产品部电话过来,说一客户那oracle起不来了,让帮忙看下。启动的时候报了ORA-01200,类似如下:

    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: '/m/n/xxx.dbf'
    ORA-01200: actual file size of 20 is smaller than correct size of 50 blocks

    查了下v$datafile的大小,一个是20M,一个是0.5M。所述的表空间在/tmp目录下,运维也不知道表空间从哪里来的。估计是权限管理不严格,某个家伙做了测试。

    正规的解决方式是使用rman备份恢复,参见https://www.parnassusdata.com/en/node/776?language=zh-hans,只是该环境用的是DSG做的备库,不是DG,也没有RMAN备份(对于需要灾备的,强烈建议有专职DBA的,一定要上DG,别找三方)。所以就只能非正规方式了。

    非正规的方式之一是使用BBED人工修复,让库起来,然后备份、恢复,一般非oracle官方的三方技术支持公司常见的搞法,其实都不能保证100%不丢数据和事务。

    第三种方式是,如果表空间、数据文件的业务相对独立,可以采用数据文件offline,删除,恢复备份(无论是expdp的还是rman的都行)。经过和开发、运维反复确认,异常的数据文件肯定不是业务的,所以采用第三种方式。

    先将库置为归档模式:

    SQL> alter database archivelog;
    
    Database altered.
    
    SQL> archive log list;
    Database log mode Archive Mode
    Automatic archival Disabled
    Archive destination /oradata/F3PROD/arch1
    Oldest online log sequence 2285
    Next log sequence to archive 2289
    Current log sequence 2289
    SQL> alter database datafile 15 offline;
    
    Database altered.
    
    SQL> alter database datafile 16 offline;
    
    Database altered.
    SQL> alter database open;
    
    Database altered.
    
    SQL>
    SQL> shutdown immediate;
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup mount;
    ORACLE instance started.
    
    Total System Global Area 1058870496 bytes
    Fixed Size 738528 bytes
    Variable Size 788529152 bytes
    Database Buffers 268435456 bytes
    Redo Buffers 1167360 bytes
    Database mounted.
    SQL> alter database noarchivelog;
    
    Database altered.
    
    SQL> archive log list;
    Database log mode No Archive Mode
    Automatic archival Disabled
    Archive destination /oradata/F3PROD/arch1
    Oldest online log sequence 2285
    Current log sequence 2289
    SQL> alter database open;
    
    Database altered.
    
    SQL>

    至此,库恢复正常打开,数据无任何丢失。此时可以删除15、16表空间和数据文件了。

  • 相关阅读:
    c#中使用多线程访问winform中控件的若干问题(转)
    Winform 分页控件(转)
    C#争论:什么时候应该使用var?
    C#的Contains() 值还是引用
    DataTemplate
    DX11_基于GPU_ComputeShader的3D精确拾取
    串行的BitonicSort双调排序
    Directx11_使用Effect框架包装ComputeShader
    Silverlight自适应布局
    poj3626广搜
  • 原文地址:https://www.cnblogs.com/zhjh256/p/13585067.html
Copyright © 2020-2023  润新知