更改Oracle數(shù)據(jù)庫表的表空間
作者:chinaitlab 佚名 更新時(shí)間:2005-11-17
收藏此頁【IT168 服務(wù)器學(xué)院】在Oracle數(shù)據(jù)庫管理系統(tǒng)中,創(chuàng)建庫表(table)時(shí)要分配一個(gè)表空間(tablespace),如果未指定表空間,則使用系統(tǒng)用戶確省的表空間。
在Oracle實(shí)際應(yīng)用中,我們可能會(huì)遇到這樣的問題。處于性能或者其他方面的考慮,需要改變某個(gè)表或者是某個(gè)用戶的所有表的表空間。通常的做法就是首先將表刪除,然后重新建表,在新建表時(shí)將表空間指定到我們需要改變的表空間。如果該用戶已經(jīng)保存了大量數(shù)據(jù),這種辦法就就顯得不是很方便,因?yàn)橛写罅繑?shù)據(jù)需要提前備份出來。下面介紹一種利用數(shù)據(jù)庫的導(dǎo)出/導(dǎo)入功能來實(shí)現(xiàn)重新組織數(shù)據(jù)庫表空間的方法。
下面是一個(gè)簡單的例子,假定要將用戶oa下的全部表從表空間A轉(zhuǎn)換到表空間B,具體步驟(在Oracle 9i for linux環(huán)境)如下:
1.1. 導(dǎo)出db_zgxt下的所有表(Dos控制臺下) 導(dǎo)出db_zgxt下的所有表(Dos控制臺下)
1. 導(dǎo)出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. 采用導(dǎo)入?yún)?shù) INDEXFILE導(dǎo)入oa用戶下的所有表(Dos控制臺下)
把建表和索引的語句導(dǎo)出到文件,其中建表語句是加注釋的,并沒有實(shí)際導(dǎo)入
IMP oa/password@paramount_server FULL=Y FILE=d:\10_27_oa.dmp INDEXFILE=d:\altertablespace_table_index.SQL LOG=d:\altertablespace.LOG
其中,指定參數(shù)INDEXFILE后,系統(tǒng)就將創(chuàng)建表和索引的語句寫到一個(gè)文件,這里是altertablespace_table_index.SQL 中。該文件中包含了所有創(chuàng)建索引(CREATE INDEX)語句和創(chuàng)建表(CREATETABLE)語句,但是這里所有創(chuàng)建表的語句均加了注釋標(biāo)志。在任何文本編輯器中打開并編輯該文件,去掉所有創(chuàng)建表語句的注釋標(biāo)志,將所有的表空間名稱由A替換為B,同時(shí)對所有的創(chuàng)建索引語句加上注釋標(biāo)志。這些工作作完以后,在SQL/PLUS中運(yùn)行該腳本文件,這些表就被創(chuàng)建,其表空間由A變?yōu)锽。
采用導(dǎo)入?yún)?shù)INDEXES=N 和IGNORE=Y將db_zgxt用戶的表數(shù)據(jù)導(dǎo)入庫中(Dos控制臺下)
4. 采用導(dǎo)入?yún)?shù)INDEXES=N 和IGNORE=Y將oa用戶的表數(shù)據(jù)導(dǎo)入庫中(Dos控制臺下)
IMP oa/password@paramount_server FULL=Y INDEXES=N FILE=d:\10_27_oa.dmp IGNORE=Y LOG=d:\altertablespace.LOG
其中,參數(shù)INDEXES=N是指將數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫中時(shí)不加索引。IGNORE=Y是指在導(dǎo)入數(shù)據(jù)過程中,忽略表已經(jīng)存在(table already exists)的錯(cuò)誤。這樣Oralce就將數(shù)據(jù)和一些約束條件導(dǎo)入到第3步創(chuàng)建的表中。
5. 創(chuàng)建索引
在文本編輯器中重新打開在第3步中創(chuàng)建的altertablespace_table_index.SQL 腳本文件,這次,將所有創(chuàng)建表(CREATE TABLE)的語句加上注釋標(biāo)志,然后將所有的創(chuàng)建索引(CREATE INDEX)語句去掉注釋標(biāo)志。在SQL/PLUS中再次運(yùn)行該腳本文件。
至此,我們就成功完成了將oa用戶下的全部表從表空間A轉(zhuǎn)換到表空間B的工作。當(dāng)然你可以只導(dǎo)入一部分表。