ITPub博客

首页 > 数据库 > Oracle > 【问题处理】ORA-01157 ORA-01110

【问题处理】ORA-01157 ORA-01110

原创 Oracle 作者:恩强Boy 时间:2021-02-01 11:16:01 0 删除 编辑

问题说明

今天一个客户反映,数据库通过RMAN 还原后,起库报 ORA-01157 01110 错误

SQL> startup;

ORACLE instance started.

Total System Global Area 16034911968 bytes

Fixed Size                  22533664 bytes

Variable Size             9898578976 bytes

Database Buffers          6039796776 bytes

Redo Buffers                73197552 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 44  - see DBWR trace file

ORA-01110: data file 44 : '/u0 1 / app/oracle /oradata/ users02 .dbf'

原因分析

ORA-01157 错误一般是因为后台进程无法找到其中一个数据文件,或者数据文件已经在使用中,无法锁定它。此时数据库将禁止对该文件的访问,其他文件不会受到影响。然而,打开数据库的实例需要访问所有在线数据文件,如果有数据文件存在上述问题,将会报 ORA-01157 错误。

ORA-01157 错误通常跟 ORA-01110 错误一起出现,可能是 Oracle 操作系统层错误,在 background_dump_dest 会生产一个 DBWR 跟踪文件,跟踪文件可能会有以下信息

ORA-01157: cannot identify/lock data file 44  - see DBWR trace file
ORA-01110: data file 44 : '/u0 1 / app/oracle /oradata/ users02 .dbf'
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3

解决方法

情况一:数据文件存在,但是Oracle 找不到它

在这种情况下,数据文件可能在操作系统层面被重新命名,或者被移动到其他的目录位置。对于这种情况,需要restore recover 该数据文件,或将数据文件移动到原始位置

情况二:数据文件不存在,或者数据文件已经被物理删除或损坏,Oracle 无法识别它

例如,数据文件可能被截断或覆盖,在这种情况下将会伴随ORA-27046 错误 ORA-27046: file size is not a multiple of logical block size In this case

在这种情况下,用户可以有两个选择:

1.  重建该文件所属的表空间

这个选项适用于users/index/temporary 表空间。如果表空间是 system 表空间,这就相当于是重建数据库。这种方法最适合临时表空间,因为临时表空间不包含重要数据。如果表空间最近的导出对象是可用的,或者表空间的表可以通过其他方式进行加载,这种办法会很有帮助。

重建表空间的步骤如下:

1)  启动到mount 状态

SQL> startup mount;

2)  offline 该数据文件

如果是归档模式

SQL> alter database datafile 'filename' offline;

如果是非归档模式

SQL> alter database datafile 'filename' offline drop;

3)  打开数据库

SQL> alter database open;

4)  删除该表空间

SQL> drop tablespace tablespace_name including contents and datafiles;

5)  重新创建该表空间

SQL> create tablespace tablespace_name datafile 'filename' size xxx;

6)  将表空间对象对象重新导入

使用导入脚本重新导入该表空间内的对象。

2.  使用正常恢复程序恢复该数据文件

对于业务表空间、索引表空间,重新创建不太可能。如果有备份和完整的归档日志情况下,这种是推荐的方法。如果数据库处于非归档模式,只有当要应用到数据文件的日志在redo log 范围内,才能成功进行恢复,这种方法对于只读表空间比较理想。

步骤如下:

1)  数据库启动到mount 状态

SQL> startup mount;

2)  执行查询(归档模式)

SQL> SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE# FROM V$LOG V1, V$LOGFILE V2 WHERE V1.GROUP# = V2.GROUP# ;

这个查询将列出所有的redo log 和他们各自的顺序和最先更改的编号

3)  执行查询(非归档模式)

SQL> SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;

如果CHANGE# 大于日志的最小 FIRST_CHANGE# ,则可以恢复数据文件;如果 CHANGE# 小于日志的最小 FIRST_CHANGE# ,则无法恢复数据文件

4)  恢复数据文件

SQL> recover datafile 'filename';

5)  确认提示的每个日志,直到收到 Media Recovery Complete ,如果提示输入不存在的归档日志, Oracle 可能需要一个或多个 redolog 来进行恢复。

6)  开启数据库

SQL> alter database open;

 

 

---- end ----

 

 

 


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

请登录后发表评论 登录
全部评论
勤奋,专注和练习

注册时间:2018-04-03

  • 博文量
    77
  • 访问量
    143644