一次物理删除数据文件的恢复过程

近几天心情心情很低落,老是失眠,状态很差。

中午吃晚饭后,运维小组的同事告诉我说有一台数据库的磁盘空间满了。叫我处理一下,我登录到服务器上一看:

[oracle@cpemsii-cx ~]$ df -h
Filesystem            容量  已用 可用 已用% 挂载点
/dev/cciss/c0d0p3     130G  80G  49G  62% /
/dev/cciss/c0d0p1     981M   25M  906M   3% /boot
none                   16G     0   16G   0% /dev/shm
/dev/cciss/c0d1       135G   93G   3.8M  100% /data

头晕,先把操作日志记下来,明天再写。

今天补上。。。

[oracle@cpemsii-cx data]$ ll -rt                                       
总用量 133824236                                                       
drwx------  2 root   root           16384 2009-09-18  lost+found       
-rw-r-----  1 oracle oinstall  2097160192 11月 30 06:50 audit_indx02.dbf
-rw-r-----  1 oracle oinstall  5242888192 11月 30 06:51 audit_data05.dbf
-rw-r-----  1 oracle oinstall 34358697984 11月 30 06:51 audit_data03.dbf
-rw-r-----  1 oracle oinstall 21044928512 11月 30 07:04 audit_data04.dbf
-rw-r-----  1 oracle oinstall  4294975488 11月 30 11:04 audit_indx03.dbf
-rw-r-----  1 oracle oinstall 30260862976 11月 30 11:07 audit_indx06.dbf
-rw-r-----  1 oracle oinstall  3145736192 11月 30 11:07 audit_indx05.dbf
-rw-r-----  1 oracle oinstall  2097160192 11月 30 11:07 audit_indx04.dbf
-rw-r-----  1 oracle oinstall 34359730176 11月 30 11:07 audit_indx01.dbf

发现这个目录下都是数据文件,没有什么文件可以删除的。

查看alert日志:

[oracle@cpemsii-cx bdump]$ tail -f alert_emsaudt.log
Fri Nov 30 04:15:44 2012
Thread 1 cannot allocate new log, sequence 97073
Private strand flush not complete
  Current log# 1 seq# 97072 mem# 0: /home/oracle/oradata/emsaudt/redo01.log
Fri Nov 30 04:16:05 2012
Thread 1 advanced to log sequence 97073 (LGWR switch)
  Current log# 2 seq# 97073 mem# 0: /home/oracle/oradata/emsaudt/redo02.log
Fri Nov 30 05:02:04 2012
ORA-1653: unable to extend table AUDITCUST.TB_RST_SEAL_NO_CLCT by 128 in                 tablespace AUDIT_DATA
ORA-1653: unable to extend table AUDITCUST.TB_RST_SEAL_NO_CLCT by 8192 in                 tablespace AUDIT_DATA
Fri Nov 30 11:04:00 2012

后台已经在报表空间不足的错误,为了不影响业务数据的插入,只能现在/目下的$ORACLE_BASE/oradata目录下将AUDIT_DATA表空间添加一个数据文件了。临时解决插入报错的问题。

SQL> ALTER TABLESPACE AUDIT_DATA ADD DATAFILE '/home/oracle/oradata/emsaudt/audit_data06.dbf' SIZE 2g ;                               

Tablespace altered.

再看alert日志:

Fri Nov 30 11:24:44 2012
ALTER TABLESPACE AUDIT_DATA ADD DATAFILE '/home/oracle/oradata/emsaudt/audit_data06.dbf' SIZE 2g
Fri Nov 30 11:25:16 2012
Completed: ALTER TABLESPACE AUDIT_DATA ADD DATAFILE '/home/oracle/oradata/emsaudt/audit_data06.dbf' SIZE 2g .

看来插入报错的问题临时解决了,但是/data目录空间不足的问题还是没有解决。

那只能通过添加存储空间或者将这个目录下的一些数据文件移到根目录下。扩盘短期是不可能的了,那就移文件吧。

考虑到时间的因素,就将一个4G左右的索引文件audit_indx03.dbf移走吧:

SQL> conn /as sysdba
Connected.
SQL>
SQL>
SQL> alter tablespace AUDIT_INDX offline;

Tablespace altered.

SQL> !cp '/data/audit_indx03.dbf' '/home/oracle/oradata/emsaudt/audit_indx03.dbf';

SQL> alter tablespace  AUDIT_INDX rename datafile '/data/audit_indx03.dbf' to '/home/oracle/oradata/emsaudt/audit_indx03.dbf';

Tablespace altered.

SQL> alter tablespace AUDIT_INDX online;

Tablespace altered.

移动成功。

但是/data目录下的空间还没有释放出来,因为是cp的,那应该可以通过mv这个文件,但是mv这个文件空间也是不能释放的,因为数据库dbwr进程还在占用这个文件。那只能将数据重启释放这个文件句柄,以释放空间。。。想想这个思路应该没有什么问题,在征求应用经理的同意后,我觉得这么做。

[oracle@cpemsii-cx data]$ ll -rt
总用量 133824236
drwx------  2 root   root           16384 2009-09-18  lost+found
-rw-r-----  1 oracle oinstall  2097160192 11月 30 06:50 audit_indx02.dbf
-rw-r-----  1 oracle oinstall  5242888192 11月 30 06:51 audit_data05.dbf
-rw-r-----  1 oracle oinstall 34358697984 11月 30 06:51 audit_data03.dbf
-rw-r-----  1 oracle oinstall 21044928512 11月 30 07:04 audit_data04.dbf
-rw-r-----  1 oracle oinstall  4294975488 11月 30 11:04 audit_indx03.dbf
-rw-r-----  1 oracle oinstall 30260862976 11月 30 11:07 audit_indx06.dbf
-rw-r-----  1 oracle oinstall  3145736192 11月 30 11:07 audit_indx05.dbf
-rw-r-----  1 oracle oinstall  2097160192 11月 30 11:07 audit_indx04.dbf
-rw-r-----  1 oracle oinstall 34359730176 11月 30 11:07 audit_indx01.dbf[oracle@cpemsii-cx data]$ rm -rf audit_data03.dbf  -----就是因为今天情绪低落,状态不好,将这个文件删除错了,本来应该是删除udit_indx03.dbf,这就造就了后面的物理恢复!当时本人还不知道。
[oracle@cpemsii-cx data]$ df -h
Filesystem            容量  已用 可用 已用% 挂载点
/dev/cciss/c0d0p3     130G   80G   45G  65% /
/dev/cciss/c0d0p1     981M   25M  906M   3% /boot
none                   16G     0   16G   0% /dev/shm
/dev/cciss/c0d1       135G  128G  3.8M 100% /data
[oracle@cpemsii-cx data]$ ll -rt
下面还是按照前面的思路,重启数据库!

SQL> shutdown immediate
ORA-01116: error in opening database file 14
ORA-01110: data file 14: '/data/audit_data03.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

到这我才意识到自己删错文件了,心理紧张了一把,这个库平时不是太重要,没有做任何备份!!!

此时我立马想到了,此时绝对不能关闭数据库,否则文件句柄释放,这个文件就彻底的没了!

看了数据库的总大小,不是很大。因此应该为了稳妥起见,先在另外一台测试的服务器上趁现在数据库是open的将这个数据库做一个逻辑备份。因为这个数据库只有一个用户,而且删除的数据文件都是这个用户下的,因此只要做一个schema级别的逻辑备份就行。以防物理恢复失败,好用这个逻辑备份来恢复。

想到这就在另一个测试环境上让这个备份做着。

另一当面我得试试物理恢复了:

查找数据库写进程:[oracle@cpemsii-cx emsaudt]$ ps -ef|grep dbw|grep -v grep
oracle    5409     1  0  2011 ?        23:32:58 ora_dbw0_emsaudt
oracle    5411     1  0  2011 ?        23:28:54 ora_dbw1_emsaudt

发现有两个进程在写:

[oracle@cpemsii-cx emsaudt]$ ll /proc/5409/fd/
总用量 42
lr-x------  1 oracle oinstall 64 11月 30 12:19 0 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:19 1 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:19 10 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:19 11 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:19 12 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:19 13 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:19 14 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat
lrwx------  1 oracle oinstall 64 11月 30 12:19 15 -> /home/oracle/product/10.2.0/dbs/lkEMSAUDT
lrwx------  1 oracle oinstall 64 11月 30 12:19 16 -> /home/oracle/oradata/emsaudt/control01.ctl
lrwx------  1 oracle oinstall 64 11月 30 12:19 17 -> /home/oracle/oradata/emsaudt/control02.ctl
lrwx------  1 oracle oinstall 64 11月 30 12:19 18 -> /home/oracle/oradata/emsaudt/control03.ctl
lrwx------  1 oracle oinstall 64 11月 30 12:19 19 -> /home/oracle/oradata/emsaudt/system01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 2 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:19 20 -> /home/oracle/oradata/emsaudt/undotbs01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 21 -> /home/oracle/oradata/emsaudt/sysaux01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 22 -> /home/oracle/oradata/emsaudt/users01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 23 -> /home/oracle/oradata/emsaudt/audit_data01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 24 -> socket:[806445420]
lrwx------  1 oracle oinstall 64 11月 30 12:19 25 -> /home/oracle/oradata/emsaudt/snpm_data.pdf
lrwx------  1 oracle oinstall 64 11月 30 12:19 26 -> /home/oracle/oradata/emsaudt/snpm_indx.pdf
lrwx------  1 oracle oinstall 64 11月 30 12:19 27 -> /home/oracle/oradata/emsaudt/audit_data02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 28 -> /data/audit_indx02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 29 -> /data/audit_indx01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 3 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:19 30 -> /home/oracle/oradata/emsaudt/audit_indx03.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 31 -> /data/audit_indx04.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 32 -> /data/audit_data03.dbf (deleted)
lrwx------  1 oracle oinstall 64 11月 30 12:19 33 -> /data/audit_data04.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 34 -> /data/audit_indx05.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 35 -> /home/oracle/oradata/emsaudt/ems_monitor_dat.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 36 -> /home/oracle/oradata/emsaudt/temp01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 37 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:19 38 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:19 39 -> /data/audit_data05.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:19 4 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:19 40 -> /data/audit_indx06.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:19 41 -> /home/oracle/oradata/emsaudt/audit_data06.dbf
l-wx------  1 oracle oinstall 64 11月 30 12:19 5 -> /home/oracle/admin/emsaudt/udump/emsaudt_ora_5399.trc
l-wx------  1 oracle oinstall 64 11月 30 12:19 6 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:19 7 -> /home/oracle/product/10.2.0/dbs/lkinstemsaudt (deleted)
l-wx------  1 oracle oinstall 64 11月 30 12:19 8 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:19 9 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat
[oracle@cpemsii-cx emsaudt]$ ll /proc/5411/fd/
总用量 30
lr-x------  1 oracle oinstall 64 11月 30 12:20 0 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:20 1 -> /dev/null
lr-x------  1 oracle oinstall 64 11月 30 12:20 10 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:20 11 -> /dev/zero
lr-x------  1 oracle oinstall 64 11月 30 12:20 12 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:20 13 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:20 14 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat
lrwx------  1 oracle oinstall 64 11月 30 12:20 15 -> /home/oracle/product/10.2.0/dbs/lkEMSAUDT
lr-x------  1 oracle oinstall 64 11月 30 12:20 16 -> /home/oracle/product/10.2.0/rdbms/mesg/orazhs.msb
lr-x------  1 oracle oinstall 64 11月 30 12:20 17 -> /home/oracle/product/10.2.0/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 11月 30 12:20 18 -> /home/oracle/oradata/emsaudt/system01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 19 -> /home/oracle/oradata/emsaudt/undotbs01.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:20 2 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:20 20 -> /home/oracle/oradata/emsaudt/sysaux01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 21 -> /home/oracle/oradata/emsaudt/audit_data01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 22 -> /home/oracle/oradata/emsaudt/audit_data02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 23 -> /home/oracle/oradata/emsaudt/audit_data06.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 24 -> /data/audit_indx06.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 28 -> /data/audit_data03.dbf (deleted)
lrwx------  1 oracle oinstall 64 11月 30 12:20 29 -> /data/audit_data04.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:20 3 -> /dev/null
lrwx------  1 oracle oinstall 64 11月 30 12:20 30 -> /data/audit_indx02.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 31 -> /home/oracle/oradata/emsaudt/temp01.dbf
lrwx------  1 oracle oinstall 64 11月 30 12:20 32 -> /data/audit_data05.dbf
lr-x------  1 oracle oinstall 64 11月 30 12:20 4 -> /dev/null
l-wx------  1 oracle oinstall 64 11月 30 12:20 5 -> /home/oracle/admin/emsaudt/udump/emsaudt_ora_5399.trc
l-wx------  1 oracle oinstall 64 11月 30 12:20 6 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:20 7 -> /home/oracle/product/10.2.0/dbs/lkinstemsaudt (deleted)
l-wx------  1 oracle oinstall 64 11月 30 12:20 8 -> /home/oracle/admin/emsaudt/bdump/alert_emsaudt.log
lrwx------  1 oracle oinstall 64 11月 30 12:20 9 -> /home/oracle/product/10.2.0/dbs/hc_emsaudt.dat

发现删除的文件还在这两个目录下,看看/目录下还有49G,而删除的文件是32G,可以考虑将这个删除的文件物理恢复到$ORACLE_BASE/oradata/emsaudit下。

[oracle@cpemsii-cx fd]$ cp /proc/5409/fd/32 /home/oracle/oradata/emsaudit/audit_data03.dbf
恢复完后发现这个文件大小是34358697984。和原来的一样大小。

应该就是这个文件吧。但是还想到5411目录下还有一个文件,当时害怕这个文件也起作用,当时为了稳妥起见就将5411目录下的文件恢复到测试库上暂时放在,以防后面需要用。

[oracle@cpemsii-cx fd]$ scp /proc/5411/fd/28 oracle@192.xx.xx.xx:/orabak/audit_data03.dbf

恢复完这个文件也是34358697984这么大,应该恢复的文件是一样的,那就先暂且用本机上恢复的文件吧。

步骤:

SQL> alter database datafile 14 offline;
alter database datafile 14 offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled

--由于数据库未作归档,offline数据文件需要添加drop选项。

SQL> alter database datafile 14 offline drop;

Database altered.

SQL> alter database rename file  '/data/audit_data03.dbf' to '/home/oracle/oradata/audit/audit_data03.dbf';

Database altered.

SQL> recover datafile 14;
Media recovery complete.
SQL> alter database datafile 14 online;

Database altered.

数据文件恢复成功!

切换日志:

SQL> alter system switch logfile;

System altered.

查看alert日志:

Private strand flush not complete
  Current log# 2 seq# 97073 mem# 0: /home/oracle/oradata/emsaudt/redo02.log
Fri Nov 30 15:59:07 2012
Thread 1 advanced to log sequence 97074 (LGWR switch)
  Current log# 3 seq# 97074 mem# 0: /home/oracle/oradata/emsaudt/redo03.log
数据库没有报错:

在查看/data空间。发现已经释放了:

[oracle@cpemsii-cx ~]$ df -h
Filesystem            容量  已用 可用 已用% 挂载点
/dev/cciss/c0d0p3     130G   89G   13G  68% /
/dev/cciss/c0d0p1     981M   25M  906M   3% /boot
none                   16G     0   16G   0% /dev/shm
/dev/cciss/c0d1       135G  96G  32G 71% /data

问题暂时解决了,但是长久来看空间还是很少,需要添加物理磁盘来解决。

和领导汇报了此事,领导答应了。

 

--总结:

在处理这个问题的过程本来不需要做物理恢复的,就是由于本人当时犯的错误,好在能及时意识到问题的严重性且找到了解决思路。否则这次就麻烦大了,因此对这件事内心还是挺愧疚的,做了5年的DBA没有出现过误删除文件的事情,这次主要还是心情太复杂,状态太差,处理问题不细心导致的,以后一定要警钟长鸣,切忌做到细心,细心,再细心。。。

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

转载于:http://blog.itpub.net/12129601/viewspace-750353/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值