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

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

一次误删除求助

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

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

帖子内容:

昨天查看数据库的系统表空间,发现已经使用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平台,发现问题后如果没有关闭过数据库,也可以根据文件句柄来恢复;

参考

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

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

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

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

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

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

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

sys@ORACLE11> archive log list;

Database log modeArchive Mode

Automatic archivalEnabled

Archive destinationUSE_DB_RECOVERY_FILE_DEST

Oldest online log sequence16

Next log sequence to archive18

Current log sequence18

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 Area308981760 bytes

Fixed Size2252784 bytes

Variable Size222298128 bytes

Database Buffers79691776 bytes

Redo Buffers4739072 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 10mautoextend on;

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

*

ERROR at line 1:

ORA-01109: database not open

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

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

alter database create datafile '/u01/app/oradata/oracle11g/system02.dbf' size 10mautoextend 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_NAMESTATUS

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

oracle11gMOUNTED

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_NAMEM AUT STATUS

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

/u01/app/oradata/oracle11g/users01.dbf213.75 YES AVAILABLE

/u01/app/oradata/oracle11g/undotbs01.dbf70 YES AVAILABLE

/u01/app/oradata/oracle11g/sysaux01.dbf550 YES AVAILABLE

/u01/app/oradata/oracle11g/system01.dbf760 YES AVAILABLE

/u01/app/oradata/oracle11g/goldengate01.dbf10 YES AVAILABLE

/u01/app/oradata/oracle11g/system02.dbf10 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

oracle430810 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

01101322562572582592602612622632643456789

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.ctlredo01.logredo03.logsystem01.dbftemp01.dbfusers01.dbf

goldengate01.dbfredo02.logsysaux01.dbfsystem02.dbfundotbs01.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 Area308981760 bytes

Fixed Size2252784 bytes

Variable Size222298128 bytes

Database Buffers79691776 bytes

Redo Buffers4739072 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.

恢复成功。

实验总结:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值