更改Oracle數據庫表的表空間
2024-08-29 13:31:31
供稿:網友
在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/[email protected]_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/[email protected]_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/[email protected]_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的工作。當然你可以只導入一部分表。
注:本文參考網上搜到的一篇文章,本人在更新的平臺(oracle 9i)上實際操作后修改成此文。如果侵犯到誰的版權,請與我聯系。
菜鳥學堂: