首先,使用下面的命令移動(dòng):
創(chuàng)新互聯(lián)建站提供高防服務(wù)器、云服務(wù)器、香港服務(wù)器、西云機(jī)房等
alter table table_name move tablespace tablespace_name;
然后,如果有索引的話必須重建索引:
alter index index_name rebuild tablespace tablespace_name;
當(dāng)然,可以使用spool來幫助實(shí)現(xiàn)多個(gè)表的操作.
set header off;
spool /export/home/oracle/alter_tables.sql;
select 'alter table ' || object_name || ' move tablespace users'
from dba_object
where owner = 'XXX' and object_type = 'TABLE';
spool off;
之后執(zhí)行此sql腳本即可.
同樣對(duì)于index也做同樣的操作.
insert into table_A
select * from table_B
table_B 全表復(fù)制到 table_A
下面供參考:
當(dāng)然如果 B表原來沒有數(shù)據(jù) 或者 B表原有數(shù)據(jù)比較少,為了提高效率,可以考慮新建一個(gè)中間表C
先把A表復(fù)制到C表(create table table_C as select * from table_A where 1=1)
再把B表數(shù)據(jù)導(dǎo)入到C表
insert into table_C select * from table_B
最后把B表rename 為B_TEMP,把C表rename 為B
rename table_b to B_TEMP;
rename table_C to table_B;
最后檢查數(shù)據(jù),如果正常 drop掉B_temp表
drop table B_temp;
move一個(gè)表到另外一個(gè)表空間時(shí),索引不會(huì)跟著一起move,而且會(huì)失效。(LOB類型例外)表move,我們分為:
*普通表move
*分區(qū)表move
*LONG,LOB大字段類型move來進(jìn)行測(cè)試和說明。
索引的move,我們通過rebuild來實(shí)現(xiàn)
一:move普通表、索引基本語法:
alter table tab_name move tablespace tbs_name;move過的普通表,在不用到失效的索引的操作語句中,語句執(zhí)行正常,但如果操作的語句用到了索引(主鍵當(dāng)做唯一索引),則此時(shí)報(bào)告用到的索引失效,語句執(zhí)行失敗,其他如外鍵,非空約束,缺省值等不會(huì)失效。
我們需要重新創(chuàng)建主鍵或索引,基本語法為:
1
2
alter index index_name rebuild;
alter index pk_name rebuild;
如果我們需要move索引,則使用rebuild語法:
1
2
alter index index_name rebuild tablespace tbs_name;alter index pk_name rebuild tablespace tbs_name;提示:查詢表所具有的索引,可以使用user_indexes視圖(索引和主鍵都在這個(gè)視圖里可找到)。
二:move分區(qū)表及索引和普通表一樣,索引會(huì)失效,區(qū)別的僅僅是語法而已。
分區(qū)基本語法:特別提醒注意,如果是單級(jí)分區(qū),則使用關(guān)鍵字PARTITION,如果是多級(jí)分區(qū),則使用SUBPARTITION替代PARTITION。
如果分區(qū)或分區(qū)索引比較大,可以使用并行move或rebuild,PARALLEL (DEGREE 2);如:
1
2
3
ALTER TABLE PART_ALARMTEXTDATA move SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE 2);ALTER INDEX GLOBAL_ALARMTEXTDATA REBUILD tablespace users PARALLEL (DEGREE 2);ALTER INDEX LOCAL_ALARMTEXTDATA REBUILD SUBPARTITION ALARMTEXTDATA_050910_ATD01 TABLESPACE users PARALLEL (DEGREE 2);移動(dòng)表的某個(gè)分區(qū):
1
ALTER TABLE tab_name move PARTITION partition_name TABLESPACE tbs_name;重建全局索引:
1
2
ALTER INDEX global_index REBUILD;或
ALTER INDEX global_index REBUILD tablespace tbs_name;注: 分區(qū)操作時(shí)可以帶上with update global indexes選項(xiàng)更新全局索引重建局部索引:
1
ALTER TABLE tab_name MODIFY PARTITION partition_name REBUILD UNUSABLE LOCAL INDEXES;1
或
1
ALTER INDEX local_index_name REBUILD PARTITION partition_name TABLESPACE tbs_name;提示:
USER_PART_TABLES
USER_IND_PARTITIONS
USER_IND_SUBPARTITIONS
USER_LOB_PARTITIONS
USER_LOB_SUBPARTITIONS
USER_PART_INDEXES
USER_PART_LOBS可查詢分區(qū)相關(guān)內(nèi)容,同時(shí),分區(qū)對(duì)象,也是segment,所以也可在dba_segments里查的到。
三:move LONG,LOB類型(據(jù)說DBMS_REDEFINITION包可以提供一些方便,沒用過。)I:LONG類型
LONG類型不能通過MOVE來傳輸特別提示,盡量不要用LONG類型,特難管理。參考:http//不能使用insert into … select …等帶select的模式。如1
2
3
4
5
6
7
8
9
10
11
12
13
14
create table t123 (id int,en long);則
insert into t123(id,en) select * from t123;報(bào)告錯(cuò)誤,可以用pl/sql來幫助解決,如:
declare
cursor cur_t123 is select * from t123;
use_t123 cur_t123%rowtype;
begin
open cur_t123;
loop
fetch cur_t123 into use_t123;
exit when cur_t123%notfound;
insert into t123(id,en) values (use_t123.id,use_t123.en);end loop;
close cur_t123;
end;
對(duì)有LONG類型字段的表的轉(zhuǎn)移,可以使用:
create新表的方法。
* create一個(gè)新的表,存儲(chǔ)在需要轉(zhuǎn)移的表空間。
* 創(chuàng)建新的索引(使用tablespace 子句指定新的表空間)。
* 把數(shù)據(jù)轉(zhuǎn)移過來
方法一:用COPY的方法:
1
copy from bigboar/bigboar@bigboar_sid insert t123(id,en) using select id,en from t123;方法二:PL/SQL(如上)
方法三:直接就把LONG轉(zhuǎn)換成CLOB類型
1
2
create table t321(id int,en clob) tablespace users;insert into t321(id,en) select id,to_lob(en) from t123;方法四:exp/imp
1
2
exp bigboar/bigboar file=a.dat tables=t123imp bigboar/bigboar file=a.dat full=y IGNORE =y* drop掉舊表。
* rename 新表為舊表表名。
II:LOB類型在建立含有l(wèi)ob字段的表時(shí),oracle會(huì)自動(dòng)為lob字段建立兩個(gè)單獨(dú)的segment,一個(gè)用來存放數(shù)據(jù)(segment_type=LOBSEGMENT),另一個(gè)用來存放索引(segment_type=LOBINDEX)。默認(rèn)它們會(huì)存儲(chǔ)在和表一起的表空間。我們對(duì)表MOVE時(shí),LOG類型字段和該字段的索引不會(huì)跟著MOVE,必須要單獨(dú)來進(jìn)行MOVE,語法如下如:
1
2
alter table t321 move tablespace users;
alter table t321 move lob(en) store as (tablespace users);
簡(jiǎn)單步驟:
1、正常關(guān)閉數(shù)據(jù)庫;
2、遷移所有數(shù)據(jù)文件到新的盤;
3、啟動(dòng)實(shí)例到mount階段,修改數(shù)據(jù)文件的路徑;
4、啟動(dòng)實(shí)例到open階段,正常使用數(shù)據(jù)庫。
5、另外,如果想要遷移日志文件,比較好辦,在新盤新目錄下創(chuàng)建新的redo,刪除原來盤上的redo。
6、如果想要遷移控制文件,那么:
6.1、正常關(guān)閉數(shù)據(jù)庫;
6.2、遷移控制文件到新盤新目錄;
6.3、啟動(dòng)實(shí)例到nomount階段;
6.4、修改實(shí)例參數(shù)control_files指向新的目錄;
6.4、alter database mount;
6.5、alter databse open;
如果要遷移數(shù)據(jù)庫軟件,那就另說了,可以先安裝一套DB軟件到新盤新目錄,然后修改環(huán)境變量指向新的環(huán)境,重要的變量包括ORACLE_BASE、ORACLE_HOME、PATH等。
可以通過alter方法,將一個(gè)表移動(dòng)到另外一個(gè)表空間中:
sql: alter table spaceOne.tablename move tablespace spaceTwo;
解釋:以上語句就是把tablename表從spaceOne移動(dòng)到spaceTwo中。
備注一:
當(dāng)前的用戶必須對(duì)spaceTwo、spaceOne都有操作權(quán)限才可以。
備注二:
其實(shí)如果對(duì)兩個(gè)表空間都有權(quán)限的話,可以通過
create spaceTwo.tablename as select * from spaceOne.tablename;
之后再刪除spaceOne中tablename表的間接方式也能實(shí)現(xiàn)。