更改Oracle數據庫表的表空間

在Oracle數據庫管理系統中,創建庫表(table)時要分配一個表空間(tablespace),如果未指定表空間,則使用系統用戶確省的表空間。
  在Oracle實際應用中,我們可能會遇到這樣的問題。處於性能或者其他方面的考慮,需要改變某個表或者是某個用戶的所有表的表空間。通常的做法就是首先將表刪除,然後重新建表,在新建表時將表空間指定到我們需要改變的表空間。如果該用戶已經保存了大量數據,這種辦法就就顯得不是很方便,因爲有大量數據需要提前備份出來。下面介紹一種利用數據庫的導出/導入功能來實現重新組織數據庫表空間的方法。
  下面是一個簡單的例子,假定要將用戶oa下的全部表從表空間A轉換到表空間B,具體步驟(在Oracle 9i for linux環境)如下:
  1.1. 導出db_zgxt下的所有表(Dos控制檯下) 導出db_zgxt下的所有表(Dos控制檯下)
  1. 導出db_zgxt下的所有表(Dos控制檯下)
  EXP oa/password@pararmount_server FILE=d:\10_27_oa.dmp LOG=d:\10_27_oa.LOG
  2. 刪除oa下的所有表(在SQL/PLUS中)
  可以採用批處理的方式刪除掉db_zgxt下的所有表,生成批處理的語句如下:
  --其中set head off將表頭信息去掉
  SET HEAD OFF
  SPOOL c:\drop_tables.sql
  select 'drop table '||table_name||';' from user_tables;
  spool off;
  @c:\drop_tables.sql;
  sql @drop_tables.sql
  3. 採用導入參數 INDEXFILE導入oa用戶下的所有表(Dos控制檯下)
  把建表和索引的語句導出到文件,其中建表語句是加註釋的,並沒有實際導入
  IMP oa/password@paramount_server FULL=Y FILE=d:\10_27_oa.dmp INDEXFILE=d:\altertablespace_table_index.SQL LOG=d:\altertablespace.LOG
  其中,指定參數INDEXFILE後,系統就將創建表和索引的語句寫到一個文件,這裏是altertablespace_table_index.SQL 中。該文件中包含了所有創建索引(CREATE INDEX)語句和創建表(CREATETABLE)語句,但是這裏所有創建表的語句均加了註釋標誌。在任何文本編輯器中打開並編輯該文件,去掉所有創建表語句的註釋標誌,將所有的表空間名稱由A替換爲B,同時對所有的創建索引語句加上註釋標誌。這些工作作完以後,在SQL/PLUS中運行該腳本文件,這些表就被創建,其表空間由A變爲B。
  採用導入參數INDEXES=N 和IGNORE=Y將db_zgxt用戶的表數據導入庫中(Dos控制檯下)
  4. 採用導入參數INDEXES=N 和IGNORE=Y將oa用戶的表數據導入庫中(Dos控制檯下)
  IMP oa/password@paramount_server FULL=Y INDEXES=N FILE=d:\10_27_oa.dmp IGNORE=Y LOG=d:\altertablespace.LOG
  其中,參數INDEXES=N是指將數據導入數據庫中時不加索引。IGNORE=Y是指在導入數據過程中,忽略表已經存在(table already exists)的錯誤。這樣Oralce就將數據和一些約束條件導入到第3步創建的表中。
  5. 創建索引
  在文本編輯器中重新打開在第3步中創建的altertablespace_table_index.SQL 腳本文件,這次,將所有創建表(CREATE TABLE)的語句加上註釋標誌,然後將所有的創建索引(CREATE INDEX)語句去掉註釋標誌。在SQL/PLUS中再次運行該腳本文件。
  至此,我們就成功完成了將oa用戶下的全部表從表空間A轉換到表空間B的工作。當然你可以只導入一部分表。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章