背景介绍
数据库为11g单实例且是非归档模式,主机空间满,想要删除一些不用的表空间,在数据库运行的状态下使用rm删除数据文件和redo文件。删除后文件系统没有释放,数据库无法正常关闭,仍能正常使用。(非正常删除)
查看文件删除句柄
[oracle@orltestdb02 fd]$ lsof | grep delete | grep crm
oracle 12710 oracle 18w REG 253,0 26717906 2766416 /home/oracle/app/oracle/diag/rdbms/orltest/orltest/trace/orltest_diag_12710.trc (deleted)
oracle 12710 oracle 19w REG 253,0 887659 2766429 /home/oracle/app/oracle/diag/rdbms/orltest/orltest/trace/orltest_diag_12710.trm (deleted)
oracle 14744 oracle 513u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 14744 oracle 516uW REG 253,2 68719484928 124780817 /oracledata/orltest/i_im_01.dbf (deleted)
oracle 14746 oracle 457u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 14748 oracle 457u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 14750 oracle 457u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 14752 oracle 258u REG 253,2 1073742336 124780550 /oracledata/orltest/redo01.log (deleted)
oracle 14752 oracle 259u REG 253,2 1073742336 124780551 /oracledata/orltest/redo02.log (deleted)
oracle 14752 oracle 260u REG 253,2 1073742336 124780552 /oracledata/orltest/redo03.log (deleted)
oracle 14752 oracle 261u REG 253,2 1073742336 124780553 /oracledata/orltest/redo04.log (deleted)
oracle 14752 oracle 262u REG 253,2 1073742336 124780554 /oracledata/orltest/redo05.log (deleted)
oracle 14752 oracle 263u REG 253,2 3221225984 124780825 /oracledata/orltest/redo06.log (deleted)
oracle 14752 oracle 264u REG 253,2 1073742336 124780826 /oracledata/orltest/redo07.log (deleted)
oracle 14752 oracle 265u REG 253,2 1073742336 124780827 /oracledata/orltest/redo08.log (deleted)
oracle 14752 oracle 521u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 14752 oracle 524u REG 253,2 68719484928 124780817 /oracledata/orltest/i_im_01.dbf (deleted)
oracle 14754 oracle 373u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 14754 oracle 376u REG 253,2 68719484928 124780817 /oracledata/orltest/i_im_01.dbf (deleted)
oracle 14756 oracle 511u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 14756 oracle 514u REG 253,2 68719484928 124780817 /oracledata/orltest/i_im_01.dbf (deleted)
oracle 24438 oracle 480u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 24438 oracle 481u REG 253,2 68719484928 124780817 /oracledata/orltest/i_im_01.dbf (deleted)
oracle 32036 oracle 513u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
oracle 32036 oracle 516u REG 253,2 68719484928 124780817 /oracledata/orltest/i_im_01.dbf (deleted)
可以看到redo文件、d_im 、i_im数据文件都是deleted的状态,因数据库仍在占用这些文件,所以还未完全删除,空间依然没有释放。
恢复数据文件
以d_im_01.dbf为例
oracle 14744 oracle 513u REG 253,2 64424517632 124780814 /oracledata/orltest/d_im_01.dbf (deleted)
找到序号14744,进入/proc/14744/fd文件夹中,找到被删除的文件号(文件后会有deleted标识),将文件复制回原路径,如下:
[oracle@orltestdb02 fd]$ cd /proc/14744/fd
[oracle@orltestdb02 fd]$ ls -l
.........
lrwx------ 1 oracle dba 64 Jun 27 18:34 510 -> /oracledata/orltest/tbs_crm_data01_003.dbf
lrwx------ 1 oracle dba 64 Jun 27 18:34 511 -> /oracledata/orltest/tbs_crm_data01_004.dbf
lrwx------ 1 oracle dba 64 Jun 27 18:34 512 -> /oracledata/orltest/d_pub_01.dbf
lrwx------ 1 oracle dba 64 Jun 27 18:34 513 -> /oracledata/orltest/d_im_01.dbf (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:34 514 -> /oracledata/orltest/d_log_01.dbf
lrwx------ 1 oracle dba 64 Jun 27 18:34 515 -> /oracledata/orltest/d_im_dict_01.dbf
lrwx------ 1 oracle dba 64 Jun 27 18:34 516 -> /oracledata/orltest/i_im_01.dbf (deleted)
.........
[oracle@orltestdb02 fd]$ cp 513 /oracledata/orltest/d_im_01.dbf
恢复redo文件
恢复方式与上面相同
oracle 14752 oracle 258u REG 253,2 1073742336 124780550 /oracledata/orltest/redo01.log (deleted)
找到序号14752,进入/proc/14752/fd文件夹中,找到被删除的文件号(文件后会有deleted标识),将文件复制回原路径,如下:
[oracle@orltestdb02 proc]$ cd 14752
[oracle@orltestdb02 14752]$ cd fd
[oracle@orltestdb02 fd]$ ls -l | grep redo
lrwx------ 1 oracle dba 64 Jun 27 18:25 258 -> /oracledata/orltest/redo01.log (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:25 259 -> /oracledata/orltest/redo02.log (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:25 260 -> /oracledata/orltest/redo03.log (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:25 261 -> /oracledata/orltest/redo04.log (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:25 262 -> /oracledata/orltest/redo05.log (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:25 263 -> /oracledata/orltest/redo06.log (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:25 264 -> /oracledata/orltest/redo07.log (deleted)
lrwx------ 1 oracle dba 64 Jun 27 18:25 265 -> /oracledata/orltest/redo08.log (deleted)
[oracle@orltestdb02 fd]$ cp 258 /oracledata/orltest/redo01.log (deleted)
[oracle@orltestdb02 fd]$ cp 259 /oracledata/orltest/redo02.log (deleted)
[oracle@orltestdb02 fd]$ cp 260 /oracledata/orltest/redo03.log (deleted)
[oracle@orltestdb02 fd]$ cp 261 /oracledata/orltest/redo04.log (deleted)
[oracle@orltestdb02 fd]$ cp 262 /oracledata/orltest/redo05.log (deleted)
[oracle@orltestdb02 fd]$ cp 263 /oracledata/orltest/redo06.log (deleted)
[oracle@orltestdb02 fd]$ cp 264 /oracledata/orltest/redo07.log (deleted)
[oracle@orltestdb02 fd]$ cp 265 /oracledata/orltest/redo08.log (deleted)
重启数据库
SQL> shutdown immediate;
Database altered.
SQL> startup
ORACLE instance started.
Total System Global Area 8551575552 bytes
Fixed Size 2245480 bytes
Variable Size 4328524952 bytes
Database Buffers 4211081216 bytes
Redo Buffers 9723904 bytes
Database mounted.
ORA-03113: end-of-file on communication channel
Process ID: 15182
Session ID: 2091 Serial number: 3
此时数据库不一致不能open,可以起到mount状态。
删除不用的表空间:
使用正常的删除表空间语句会报错,因数据库没有归档不能使数据文件offline
SQL> drop tablespace D_IM_01 including contents and datafiles;
drop tablespace D_IM_01 including contents and datafiles
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
ORA-00600: internal error code, arguments: [krhpfh_03-1208], [fno =], [256], [fecpc =], [21156], [fhcpc =], [21146], [], [], [], [], []
ORA-01110: data file 256: '/oracledata/orltest/d_im_01.dbf'
ORA-00600: internal error code, arguments: [krhpfh_03-1208], [fno =], [256], [fecpc =], [21156], [fhcpc =], [21146], [], [], [], [], []
ORA-01110: data file 256: '/oracledata/orltest/d_im_01.dbf'
ORA-00600: internal error code, arguments: [krhpfh_03-1208], [fno =], [256], [fecpc =], [21156], [fhcpc =], [21146], [], [], [], [], []
ORA-01110: data file 256: '/oracledata/orltest/d_im_01.dbf'
ORA-01122: database file 256 failed verification check
ORA-01110: data file 256: '/oracledata/orltest/d_im_01.dbf'
ORA-01208: data file is an old version - not accessing current version
Process ID: 17688
Session ID: 299 Serial number: 3325
SQL> alter database datafile 256 offline;
alter database datafile 256 offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled
需要把文件offline drop之后再drop tablespace
SQL> alter database datafile 256 offline drop;
Database altered.
SQL> drop tablespace D_IM_01
Database altered.
再重启数据库:
SQL> startup
ORACLE instance started.
Total System Global Area 8551575552 bytes
Fixed Size 2245480 bytes
Variable Size 4328524952 bytes
Database Buffers 4211081216 bytes
Redo Buffers 9723904 bytes
Database mounted.
ORA-03113: end-of-file on communication channel
Process ID: 15182
Session ID: 2091 Serial number: 3
依然报错,因为redo文件也需要处理,redo的信息与控制文件里记录的信息是不一致的,需要RESETLOGS
SQL> recover database until cancel;
Media recovery complete.
SQL> alter database open RESETLOGS;
Database altered.
至此,数据可以正常使用。此次因非专业人员误删文件处理方式,非重要数据库,以简单的方式处理。重要的数据库resetlog会造成部分数据丢失,建议重要的数据库作好备份,同时控制好权限,禁止非专业人员乱操作。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。