ITPub博客

首页 > 数据库 > Oracle > Oracle系统表空间刚添加的一个数据文件误删除恢复处理

Oracle系统表空间刚添加的一个数据文件误删除恢复处理

Oracle 作者:pooldb 时间:2014-12-24 10:48:31 0 删除 编辑
 

    Oracle系统表空间刚添加的一个数据文件误删除恢复处理

一次误删除求助

早上有朋友在itpub论坛发帖求助

标题:急求救!!!误删了oracle系统表空间的一个数据文件导致数据库无法启动

帖子地址:http://www.itpub.net/thread-1837554-1-1.html

帖子内容:

昨天查看数据库的系统表空间,发现已经使用99%,之前加过一个系统表空间数据文件,这次再打算增加一个system03.dbf数据文件,但是加入后误删了这个数据文件,导致数据库无法启动了,用了网上的方法offiine drop这个文件,再次打开的时候又提示这个文件offline了,还是打不开,还rman好像也没奏效,一定要恢复这个文件吗???有什么办法能打开数据库啊,这个文件倒是无关紧要的,搞了一个晚上也没弄出来,大牛们帮帮忙吧!!!
这是现在打开的状态::
SQL> startup        
ORACLE instance started.

Total System Global Area 6714322944 bytes
Fixed Size                    2226056 bytes
Variable Size                 5066721400 bytes
Database Buffers         1627389952 bytes
Redo Buffers                   17985536 bytes
Database mounted.
ORA-01147: SYSTEM tablespace file 25 is offline
ORA-01110: data file 25: '/u01/oradata/wilson/system03.dbf'

无法把offline改为online::


SQL> alter database datafile 25 online;
alter database datafile 25 online
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 25 - see DBWR trace file
ORA-01110: data file 25: '/u01/oradata/wilson/system03.dbf'

这个是system表空间,网上说的删除表空间的办法也不可行啊

高手支招:(最后楼主采用此方法恢复成功)

既然新添加的,加的时候一直到现在的日志都还在吗,在的话create一个空的然后恢复下就行了

alter database create datafile '/u01/oradata/wilson/system03.dbf';
recover datafile '/u01/oradata/wilson/system03.dbf';

恢复成功。

一点思考和总结:

这种情况的恢复看来也简单,两条命令,可是楼主说“搞了一个晚上也没弄出来”,估计是经验有限或者搜索能力有待加强,另外可能没有高手指点,总之应该走了不少弯路。由此可见,学习和搜索能力,以及有高手指点,多么重要!不用担心受怕,不用那么折腾了,还能轻松搞定问题。

本案例幸亏是刚添加的数据文件(应该没有数据),幸亏是误删除操作发生的早、发现的早(非归档模式,重做日志还没被覆盖),否则可能要使用非常规手段了,比如bbed,或者扫描磁盘。

另外,猜测本案例涉及的应该是linux或unix平台,发现问题后如果没有关闭过数据库,也可以根据文件句柄来恢复;

参考http://www.eygle.com/archives/2011/12/oracle_linux_rm_rf.html

最重要的,所有生产库都应该设置为归档模式,特殊情况除外。

还有,操作要小心,做好有效的数据备份,尤其是生产环境。

另外,系统表空间不要轻易动,尤其是一些关键的数据字典等对象。表空间使用率高,那有可能只是表面现象,或许数据文件还可以自动扩展,没搞清楚状况和做好充分准备前,不要随便操作。

归档模式下做两个实验,加强印象

实验环境  linux 5.7 64位,oracle 11.2.0.4 单实例,文件系统

 

实验一,误删除系统表空间新加的数据文件后,通过创建空文件,然后使用归档日志或/和重做日志来恢复

1、归档模式,为系统表空间添加数据文件:

sys@ORACLE11> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     16

Next log sequence to archive   18

Current log sequence           18

sys@ORACLE11> alter tablespace system add datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m autoextend on;

Tablespace altered.

2、删除新添加的数据文件

oracle11g:/u01/app/oradata/oracle11g$mv system02.dbf system02.dbf.bak

3、创建测试表,触发报错:

为了触发oracle检测到问题,在系统表空间尝试创建表(生产环境不能这么操作!),创建失败,不能打开6号文件:

sys@ORACLE11> create table test as select * from dba_objects;

create table test as select * from dba_objects

                                   *

ERROR at line 1:

ORA-01116: error in opening database file 6

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

4、尝试直接恢复,失败

此时如果直接恢复,会失败,报错文件在使用或恢复:

sys@ORACLE11> alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf';

alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf'

*

ERROR at line 1:

ORA-01182: cannot create database file 6 - file is in use or recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

sys@ORACLE11> recover datafile 6;

ORA-00283: recovery session canceled due to errors

ORA-01124: cannot recover data file 6 - file is in use or recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

同时,如果手工产生检查点,实例直接崩溃,失去联系:

sys@ORACLE11> alter system checkpoint;

ERROR:

ORA-03114: not connected to ORACLE

alter system checkpoint

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

Process ID: 4259

Session ID: 1 Serial number: 13

5、重启数据库,无法open:

此时,只能尝试启动数据库,报错,找不到6号数据文件,数据库无法open:

sys@ORACLE11> conn / as sysdba

Connected to an idle instance.

idle> startup

ORACLE instance started.

Total System Global Area  308981760 bytes

Fixed Size                  2252784 bytes

Variable Size             222298128 bytes

Database Buffers           79691776 bytes

Redo Buffers                4739072 bytes

Database mounted.

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

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

开始恢复:

6、创建名字一样的空数据文件,不要指定大小

idle> alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf';

Database altered.

注意:

此处使用的命令是alter database create datafile

如果尝试用之前为system表空间添加数据文件的sql语句来创建文件会失败,报错,数据库未打开:

idle> alter tablespace system add datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on;

alter tablespace system add datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on

*

ERROR at line 1:

ORA-01109: database not open

如果指定大小等属性,也会失败,报错:

idle> alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on;

alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10m  autoextend on

                                                                         *

ERROR at line 1:

ORA-02000: missing AS keyword

7、数据文件恢复:

idle> recover datafile 6;

Media recovery complete.

idle> select instance_name ,status from v$instance;

INSTANCE_NAME    STATUS

---------------- ------------

oracle11g        MOUNTED

8、打开数据库,恢复成功:

idle> alter database open;

Database altered.

idle> conn / as sysdba

Connected.

sys@ORACLE11> select file_name,bytes/1024/1024 M ,autoextensible,status from dba_data_files;

FILE_NAME                                                   M AUT STATUS

-------------------------------------------------- ---------- --- ---------

/u01/app/oradata/oracle11g/users01.dbf                 213.75 YES AVAILABLE

/u01/app/oradata/oracle11g/undotbs01.dbf                   70 YES AVAILABLE

/u01/app/oradata/oracle11g/sysaux01.dbf                   550 YES AVAILABLE

/u01/app/oradata/oracle11g/system01.dbf                   760 YES AVAILABLE

/u01/app/oradata/oracle11g/goldengate01.dbf                10 YES AVAILABLE

/u01/app/oradata/oracle11g/system02.dbf                    10 YES AVAILABLE

6 rows selected.

恢复成功。

实验二,误删除系统表空间新加的数据文件后,通过文件句柄,然后使用归档日志或/和重做日志来恢复

1、数据库open时,系统级别删除系统表空间新加的数据文件

sys@ORACLE11> host rm /u01/app/oradata/oracle11g/system02.dbf

2、创建测试表,触发报错

sys@ORACLE11> create table test as select * from dba_objects;

create table test as select * from dba_objects

                                   *

ERROR at line 1:

ORA-01116: error in opening database file 6

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

ORA-27041: unable to open file

Linux-x86_64 Error: 2: No such file or directory

Additional information: 3

此时数据库还没有关闭,操作系统级别利用文件句柄拷贝回数据文件:

3、获得dbw进程号:

oracle11g:/u01/app/oradata/oracle11g$ps -ef|grep dbw0|grep -v grep

oracle    4308     1  0 14:34 ?        00:00:00 ora_dbw0_oracle11g

4、dbw进程会打开所有数据文件的句柄。到proc相应目录下查看,目录名是进程号,fd表示文件描述符,红色标记deleted为被删除了的:

oracle11g:/u01/app/oradata/oracle11g$cd /proc/4308/fd

oracle11g:/proc/4308/fd$pwd

/proc/4308/fd

oracle11g:/proc/4308/fd$ls

0  1  10  13  2  256  257  258  259  260  261  262  263  264  3  4  5  6  7  8  9

oracle11g:/proc/4308/fd$ls -l

总计 0

lr-x------ 1 oracle oinstall 64 12-27 15:02 0 -> /dev/null

l-wx------ 1 oracle oinstall 64 12-27 15:02 1 -> /dev/null

lrwx------ 1 oracle oinstall 64 12-27 15:02 10 -> /u01/app/oracle/product/11.2/dbs/lkORACLE11G

lr-x------ 1 oracle oinstall 64 12-27 15:02 13 -> /u01/app/oracle/product/11.2/rdbms/mesg/oraus.msb

l-wx------ 1 oracle oinstall 64 12-27 15:02 2 -> /dev/null

lrwx------ 1 oracle oinstall 64 12-27 15:02 256 -> /u01/app/oradata/oracle11g/control01.ctl

lrwx------ 1 oracle oinstall 64 12-27 15:02 257 -> /u01/app/oracle/fast_recovery_area/oracle11g/control02.ctl

lrwx------ 1 oracle oinstall 64 12-27 15:02 258 -> /u01/app/oradata/oracle11g/system01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 259 -> /u01/app/oradata/oracle11g/sysaux01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 260 -> /u01/app/oradata/oracle11g/undotbs01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 261 -> /u01/app/oradata/oracle11g/users01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 262 -> /u01/app/oradata/oracle11g/goldengate01.dbf

lrwx------ 1 oracle oinstall 64 12-27 15:02 263 -> /u01/app/oradata/oracle11g/system02.dbf (deleted)

lrwx------ 1 oracle oinstall 64 12-27 15:02 264 -> /u01/app/oradata/oracle11g/temp01.dbf

lr-x------ 1 oracle oinstall 64 12-27 15:02 3 -> /dev/null

lr-x------ 1 oracle oinstall 64 12-27 15:02 4 -> /dev/null

lr-x------ 1 oracle oinstall 64 12-27 15:02 5 -> /dev/null

lr-x------ 1 oracle oinstall 64 12-27 15:02 6 -> /u01/app/oracle/product/11.2/rdbms/mesg/oraus.msb

lr-x------ 1 oracle oinstall 64 12-27 15:02 7 -> /proc/4308/fd

lr-x------ 1 oracle oinstall 64 12-27 15:02 8 -> /dev/zero

lrwx------ 1 oracle oinstall 64 12-27 15:02 9 -> /u01/app/oracle/product/11.2/dbs/hc_oracle11g.dat

5、直接cp该句柄文件名回原来的位置:

oracle11g:/proc/4308/fd$cp 263 /u01/app/oradata/oracle11g/system02.dbf

oracle11g:/proc/4308/fd$cd /u01/app/oradata/oracle11g/

oracle11g:/u01/app/oradata/oracle11g$ls

control01.ctl     redo01.log  redo03.log    system01.dbf  temp01.dbf     users01.dbf

goldengate01.dbf  redo02.log  sysaux01.dbf  system02.dbf  undotbs01.dbf

6、直接恢复,报错,当前在使用不能恢复:

因为是系统表空间,不能离线不能直接恢复,需要重启数据库后才能进行恢复;

sys@ORACLE11> alter database datafile 6 offline;

alter database datafile 6 offline

*

ERROR at line 1:

ORA-01541: system tablespace cannot be brought offline; shut down if necessary

sys@ORACLE11> recover datafile 6;

ORA-00283: recovery session canceled due to errors

ORA-01124: cannot recover data file 6 - file is in use or recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

7、重启数据库

sys@ORACLE11> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

sys@ORACLE11> startup

ORACLE instance started.

Total System Global Area  308981760 bytes

Fixed Size                  2252784 bytes

Variable Size             222298128 bytes

Database Buffers           79691776 bytes

Redo Buffers                4739072 bytes

Database mounted.

ORA-01113: file 6 needs media recovery

ORA-01110: data file 6: '/u01/app/oradata/oracle11g/system02.dbf'

8、进行系统表空间数据文件恢复

sys@ORACLE11> sys@ORACLE11> sys@ORACLE11> recover datafile 6;

Media recovery complete.

sys@ORACLE11> truncate table test;

truncate table test

*

ERROR at line 1:

ORA-01109: database not open

9、打开数据库,恢复成功:

sys@ORACLE11> alter database open;

Database altered.

恢复成功。

实验总结:

系统表空间新添加的数据文件恢复,以上两种方法都需要重启数据库,都需要使用归档日志或在线重做日志来恢复。

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

请登录后发表评论 登录
全部评论

注册时间:2014-12-22

  • 博文量
    404
  • 访问量
    296524