暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

rm误删除oralce文件处理

原创 smiling 2022-07-19
312

背景介绍

数据库为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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论