修改Oracle資料庫表的大小

polalisi發表於2007-10-12
實際應用中,很多人可能會遇到這樣的問題。處於效能或者方面的考慮,需要改變某個表或者是某個使用者的所有表的表空間。通常的做法就是首先將表刪除,然後重新建表,在新建表時將表空間指定到我們需要改變的表空間。如果該使用者已經儲存了大量資料,這種辦法就就顯得不是很方便,因為有大量資料需要提前備份出來。下面介紹一種利用的匯出/匯入功能來實現重新組織資料庫表空間的方法。

  下面是一個簡單的例子,假定要將使用者db_zgxt下的全部表從表空間A轉換到表空間B,具體步驟(在Oracle 8.0.5 for NT環境)如下:

  1. 匯出db_zgxt下的所有表(Dos控制檯下)

  EXP80 OWNER=db_zgxt FILE=Exp0326.DMP LOG=Exp0326.LOG

  系統提示輸入使用者名稱和口令,回答完畢,系統就開始將db_zgxt下的所有表都匯出到一個叫Exp0316.dmp的檔案中。

  2. 刪除db_zgxt下的所有表(在SQL/PLUS中)

  可以採用批處理的方式刪除掉db_zgxt下的所有表,生成批處理的語句如下:

  select ’drop table ’  user_tables  ’;’ from user_tables;

  3. 採用匯入引數 INDEXFILE匯入db_zgxt使用者下的所有表(Dos控制檯下)

  IMP80 FULL=Y FILE=Exp0326.DMP INDEXFILE=db_zgxt.SQL LOG=Imp0326_1.LOG

  系統提示輸入使用者名稱和口令,回答完畢,系統就開始將檔案Exp0326.dmp匯入到db_zgxt使用者下。

  其中,指定引數INDEXFILE後,系統就將建立表和索引的語句寫到一個檔案,這裡是db_zgxt.sql中。該檔案中包含了所有建立索引(CREATE INDEX)語句和建立表(CREATETABLE)語句,但是這裡所有建立表的語句均加了註釋標誌。在任何文字編輯器中開啟並編輯該檔案,去掉所有建立表語句的註釋標誌,將所有的表空間名稱由A替換為B,同時對所有的建立索引語句加上註釋標誌。這些作完以後,在SQL/PLUS中執行該指令碼檔案,這些表就被建立,其表空間由A變為B。

  4. 採用匯入引數INDEXES=N 和IGNORE=Y將db_zgxt使用者的表資料匯入庫中(Dos控制檯下)

  IMP80 FULL=Y INDEXES=N FILE=Exp0326.DMP IGNORE=Y LOG=Imp0326_2.LOG

  其中,引數INDEXES=N是指將資料匯入資料庫中時不加索引。IGNORE=Y是指在匯入資料過程中,忽略表已經存在(table already exists)的錯誤。這樣Oralce就將資料和一些約束條件匯入到第3步建立的表中。

  5. 建立索引

  在文字編輯器中重新開啟在第3步中建立的db_zgxt.sql指令碼檔案,這次,將所有建立表(CREATE TABLE)的語句加上註釋標誌,然後將所有的建立索引(CREATE INDEX)語句去掉註釋標誌。在SQL/PLUS中再次執行該指令碼檔案。

  至此,已經成功的完成了將db_zgxt使用者下的全部表從表空間A轉換到表空間B的工作。[@more@]

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

相關文章