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.
恢复成功。
实验总结:
系统表空间新添加的数据文件恢复,以上两种方法都需要重启数据库,都需要使用归档日志或在线重做日志来恢复。