轉:Oracle刪除資料檔案

xingfei80發表於2012-10-18

在我們詳細介紹之前,我們必須說清楚一點:Oracle不提供如刪除表、檢視一樣刪除資料檔案的方法,資料檔案是表空間的一部分,所以不能“移走”表空間。

一、使用offline資料檔案的方法

非歸檔模式使用:alter database datafile '...' offline drop;

歸檔模式使用: alter database datafile '...' offline;

說明:

1) 以上命令只是將該資料檔案OFFLINE,而不是在資料庫中刪除資料檔案。該資料檔案的資訊在控制檔案種仍存在。查詢v$datafile,仍顯示該檔案;

2) 歸檔模式下offlineoffline drop效果是一樣的;

3) offline後,存在此datafile上的物件將不能訪問;

4) noarchivelog模式下,只要online redo日誌沒有被重寫,可以對這個檔案recover後進行online操作。

[@more@]

實際使用案例:

直接刪除資料檔案後無法進入系統的解決方案

正常情況下,刪除表空間的正確方法為:

DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;

如果沒有透過以上命令刪除而直接刪除了資料檔案,將導致資料庫無法開啟。

如果直接刪除了資料檔案

普通使用者登入時,則報錯:

ORA-01033: ORACLE initialization or shutdown in progress

sys使用者可以正常登入

但進行操作時(SELECT count(1) FROM user_tables),則會報錯:

ORA-01219: 資料庫未開啟: 僅允許在固定表/檢視中查詢

如果執行命令alter database open以開啟資料庫時,又報如下錯:

ORA-01157: 無法標識/鎖定資料檔案 12 - 請參閱 DBWR 跟蹤檔案

ORA-01110: 資料檔案 12: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/TSTEST001.DBF'

說明資料庫沒找到這個資料檔案

因為資料檔案在沒有被offline的情況下物理刪除了,導致oracle的資料不一致,因此啟動失敗.

透過以下方法即可解決

解決方法:

sqlplus sys/orcl@orcl as sysdba;

SQL> alter database datafile 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/TSTEST001.DBF' offline drop;

SQL> alter database open;

SQL> drop tablespace CTBASEDATA;

二、Oracle 10G R2開始,可以採用:Alter tablespace tablespace_name drop datafile file_name;來刪除一個空資料檔案,並且相應的資料字典資訊也會清除:

sys@ORCL>select file_id,file_name,tablespace_name from dba_data_files

2 where tablespace_name='USERS';

FILE_ID FILE_NAME TABLESPACE_NAME

------- -------------------------------------------- ------------------

4 /u01/app/oracle/oradata/orcl/users01.dbf USERS

sys@ORCL>alter tablespace users add datafile

2 '/u01/app/oracle/oradata/orcl/users02.dbf' size 5M autoextend off;

Tablespace altered.

sys@ORCL>select file_id,file_name,tablespace_name from dba_data_files

2 where tablespace_name='USERS';

FILE_ID FILE_NAME TABLESPACE_NAME

------- -------------------------------------------- -------------------

4 /u01/app/oracle/oradata/orcl/users01.dbf USERS

9 /u01/app/oracle/oradata/orcl/users02.dbf USERS

sys@ORCL>drop table test;

Table dropped.

sys@ORCL>create table test tablespace users

2 as

3 select * from dba_objects;

Table created.

sys@ORCL>select SEGMENT_NAME,FILE_ID,BLOCKS from dba_extents

2 where file_id=9;

SEGMENT_NAME FILE_ID BLOCKS

------------------------------ ---------- ----------

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 8

TEST 9 128

TEST 9 128

17 rows selected.

sys@ORCL>alter table test move tablespace PERFSTAT; --把表移動到其它表空間

Table altered.

sys@ORCL>select SEGMENT_NAME,FILE_ID,BLOCKS from dba_extents

2 where file_id=9;

no rows selected

sys@ORCL>alter tablespace users drop datafile

2 '/u01/app/oracle/oradata/orcl/users02.dbf';

Tablespace altered.

sys@ORCL>select file_id,file_name,tablespace_name from dba_data_files

2 where tablespace_name='USERS';

FILE_ID FILE_NAME TABLESPACE_NAME

------- -------------------------------------------- ---------------------

4 /u01/app/oracle/oradata/orcl/users01.dbf USERS

三、oracle 10g可以刪除臨時表空間的檔案

alter database tempfile '/home/oracle/temp01.dbf' drop including datafiles;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14663377/viewspace-1059621/,如需轉載,請註明出處,否則將追究法律責任。

相關文章