【恢復】非歸檔模式下因誤刪除數據文件導致數據庫無法OPEN的故障處理
模擬一下這個數據庫故障,同時給出一個“簡單”的恢復處理過程。
1.查詢獲得TBS_SEC_D表空間對應的數據文件信息
sys@ora10g> col FILE_NAME for a40
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
/oracle/oradata/ora10g/hou.dbf 13 AVAILABLE
2.非歸檔模式下模擬誤刪除數據文件
1)確認數據庫的歸檔模式
sys@ora10g> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /oracle/arch/ora10g
Oldest online log sequence 1541
Current log sequence 1543
2)模擬誤刪除hou.dbf數據文件
sys@ora10g> !rm -f /oracle/oradata/ora10g/hou.dbf
3)此時的數據庫狀態沒有異樣
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
/oracle/oradata/ora10g/hou.dbf 13 AVAILABLE
3.重啓數據庫觀察一系列的報錯信息
1)關閉數據庫過程中的報錯信息
sys@ora10g> shutdown immediate;
ORA-03113: end-of-file on communication channel
2)啓動數據過程中的報錯信息
NotConnected@> startup;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2071640 bytes
Variable Size 125830056 bytes
Database Buffers 75497472 bytes
Redo Buffers 6316032 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/oracle/oradata/ora10g/hou.dbf'
這裏提示無法定位13號數據文件。
此時數據庫僅處於mount狀態。
NotConnected@> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
4.恢復方法
既然數據文件被誤刪除了,而且我們又沒有有效的備份可用,同時數據庫又處於非歸檔的狀態(“杯具”到了極致),那我們只能容忍數據的丟失(如果13號數據文件存有數據的情況下)。
1)在mount狀態下使用offline drop命令將數據文件與表空間之間的關係隔斷。
NotConnected@> col name for a50
NotConnected@> select FILE#,STATUS,ENABLED,NAME from v$datafile where name like '%hou%';
FILE# STATUS ENABLED NAME
---------- ------- ---------- ---------------------------------------
13 ONLINE READ WRITE /oracle/oradata/ora10g/hou.dbf
NotConnected@> alter database datafile '/oracle/oradata/ora10g/hou.dbf' offline drop;
Database altered.
NotConnected@> select FILE#,STATUS,ENABLED,NAME from v$datafile where name like '%hou%';
FILE# STATUS ENABLED NAME
---------- ------- ---------- ----------------------------------------
13 RECOVER READ WRITE /oracle/oradata/ora10g/hou.dbf
2)此時我們便可以順利的OPEN數據庫
NotConnected@> alter database open;
Database altered.
5.收尾工作
即便按照上述的方法簡單處理了這個故障,但是在數據庫中還是遺留了一下“垃圾”信息。
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
/oracle/oradata/ora10g/hou.dbf 13 AVAILABLE
此時表明物理上已經不存在的“/oracle/oradata/ora10g/hou.dbf”文件還是歸屬於表空間TBS_SEC_D。如何徹底的斷絕這樣的無意義的關係?
這裏給出“簡單粗暴”的重建表空間方法。
大體步驟如下:
1)想辦法邏輯備份表空間中包含的數據
2)刪除表空間
sys@ora10g> drop tablespace TBS_SEC_D including contents and datafiles;
Tablespace dropped.
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
no rows selected
3)重建表空間
sys@ora10g> create tablespace TBS_SEC_D datafile '/oracle/oradata/ora10g/tbs_sec_d_01.dbf' size 10m;
Tablespace created.
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
4)使用邏輯備份恢復表空間的內容
6.小結
又一次實踐證明,【無備份、非歸檔】是DBA界最可怕的場景。
假設這個故障發生之前存在有效的備份,恢復的過程將會非常的簡便,也不會冒着丟失數據的風險。
珍愛DBA生命,請及時完善備份策略並定期安排備份介質有效性驗證等常規“枯燥”任務,只有“她們”纔是最美麗的!
Good luck.
1.查詢獲得TBS_SEC_D表空間對應的數據文件信息
sys@ora10g> col FILE_NAME for a40
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
/oracle/oradata/ora10g/hou.dbf 13 AVAILABLE
2.非歸檔模式下模擬誤刪除數據文件
1)確認數據庫的歸檔模式
sys@ora10g> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /oracle/arch/ora10g
Oldest online log sequence 1541
Current log sequence 1543
2)模擬誤刪除hou.dbf數據文件
sys@ora10g> !rm -f /oracle/oradata/ora10g/hou.dbf
3)此時的數據庫狀態沒有異樣
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
/oracle/oradata/ora10g/hou.dbf 13 AVAILABLE
3.重啓數據庫觀察一系列的報錯信息
1)關閉數據庫過程中的報錯信息
sys@ora10g> shutdown immediate;
ORA-03113: end-of-file on communication channel
2)啓動數據過程中的報錯信息
NotConnected@> startup;
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2071640 bytes
Variable Size 125830056 bytes
Database Buffers 75497472 bytes
Redo Buffers 6316032 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/oracle/oradata/ora10g/hou.dbf'
這裏提示無法定位13號數據文件。
此時數據庫僅處於mount狀態。
NotConnected@> select open_mode from v$database;
OPEN_MODE
----------
MOUNTED
4.恢復方法
既然數據文件被誤刪除了,而且我們又沒有有效的備份可用,同時數據庫又處於非歸檔的狀態(“杯具”到了極致),那我們只能容忍數據的丟失(如果13號數據文件存有數據的情況下)。
1)在mount狀態下使用offline drop命令將數據文件與表空間之間的關係隔斷。
NotConnected@> col name for a50
NotConnected@> select FILE#,STATUS,ENABLED,NAME from v$datafile where name like '%hou%';
FILE# STATUS ENABLED NAME
---------- ------- ---------- ---------------------------------------
13 ONLINE READ WRITE /oracle/oradata/ora10g/hou.dbf
NotConnected@> alter database datafile '/oracle/oradata/ora10g/hou.dbf' offline drop;
Database altered.
NotConnected@> select FILE#,STATUS,ENABLED,NAME from v$datafile where name like '%hou%';
FILE# STATUS ENABLED NAME
---------- ------- ---------- ----------------------------------------
13 RECOVER READ WRITE /oracle/oradata/ora10g/hou.dbf
2)此時我們便可以順利的OPEN數據庫
NotConnected@> alter database open;
Database altered.
5.收尾工作
即便按照上述的方法簡單處理了這個故障,但是在數據庫中還是遺留了一下“垃圾”信息。
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
/oracle/oradata/ora10g/hou.dbf 13 AVAILABLE
此時表明物理上已經不存在的“/oracle/oradata/ora10g/hou.dbf”文件還是歸屬於表空間TBS_SEC_D。如何徹底的斷絕這樣的無意義的關係?
這裏給出“簡單粗暴”的重建表空間方法。
大體步驟如下:
1)想辦法邏輯備份表空間中包含的數據
2)刪除表空間
sys@ora10g> drop tablespace TBS_SEC_D including contents and datafiles;
Tablespace dropped.
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
no rows selected
3)重建表空間
sys@ora10g> create tablespace TBS_SEC_D datafile '/oracle/oradata/ora10g/tbs_sec_d_01.dbf' size 10m;
Tablespace created.
sys@ora10g> select FILE_NAME,FILE_ID,STATUS from dba_data_files where TABLESPACE_NAME='TBS_SEC_D';
FILE_NAME FILE_ID STATUS
---------------------------------------- ---------- ---------
/oracle/oradata/ora10g/tbs_sec_d_01.dbf 5 AVAILABLE
4)使用邏輯備份恢復表空間的內容
6.小結
又一次實踐證明,【無備份、非歸檔】是DBA界最可怕的場景。
假設這個故障發生之前存在有效的備份,恢復的過程將會非常的簡便,也不會冒着丟失數據的風險。
珍愛DBA生命,請及時完善備份策略並定期安排備份介質有效性驗證等常規“枯燥”任務,只有“她們”纔是最美麗的!
Good luck.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.