場景:網友marine遇到問題,要求將某使用者的表從表空間a移動到表空間b,使用者表的個數在1000+以上
分析1:首先可以確定的是針對使用者單張表移動表空間使用alter table table_name remove tablespace tablespace_name這種ddl語句實現;
其次需要查dba_tables檢視找出改使用者在a表空間上的表名稱,然後將值儲存為變數傳遞給for迴圈;
最後執行動態sql,在pl/sql中不可能直接執行ddl語句,因而需要使用execute immediate的方式執行動態sql;
分析2:當然也可以去拼湊乙個sql指令碼,然後執行指令碼達到這個效果,但執行效率肯定不如前者
sql> set echo offsql> set feedback off
sql> set heading off
sql> spool /home/oracle/move.sql
2 from dba_tables where owner='hr' and tablespace_name='example';
[oracle@orcl ~]$ cat move.sql
2 size 10m autoextend on next 10m maxsize 1g3 extent management local segment space management auto;
sql> select table_name from dba_tables where owner='hr' and tablespace_name='example';
table_name
------------------------------
regions
locations
departments
jobs
employees
job_history
6 rows selected.
步驟二:使用變數實現
sql> declare2 v_1 varchar2(200);
3 begin
4 select table_name into v_1 from dba_tables where owner='hr' and tablespace_name='example';
5 begin
6 for i in v_1
7 loop
8 execute immediate 'alter table hr.'||v_1 || ' move tablespace example';
9 end loop;
10 end;
11 end;
12 /
for i in v_1
* error at line 6:
ora-06550: line 6, column 17:
pls-00456: item 'v_1' is not a cursor
ora-06550: line 6, column 8:
pl/sql: statement ignored
以上報錯,說明在pl/sql中不可能直接將變數變成雜湊放進for迴圈,需要使用游標;而在shell指令碼中可以輕易實現這點!
sql> declare2 v_1 varchar2(200);
3 cursor c_1 is
4 select table_name from dba_tables where owner='hr' and tablespace_name='example';
5 begin
6 open c_1;
7 fetch c_1 into v_1;
8 while c_1%found
9 loop
11 fetch c_1 into v_1;
12 end loop;
13 close c_1;
14* end;
15 /
pl/sql procedure successfully completed.
步驟四:驗證結果
table_name
------------------------------
regions
locations
departments
jobs
employees
job_history
6 rows selected.
注意事項:遷移完使用者的表後,要檢查下表的索引是否需要遷移,另外要注意修改使用者的預設永久表空間,根據需要來修改,否則使用者新建的表又會存放到舊的表空間上;使用者擁有的其他物件,例如檢視,觸發器,過程,包這些都儲存在資料字典上,不需要進行遷移!
oracle遷移表空間
可遷移表空間 使用可遷移表空間 transportable tablespaces 的特性在資料庫之間移動大量資料,效能比export import和unload load要快很多,因為它遷移表空間只需要複製資料檔案和插入表空間元資料到目標資料庫中。遷移表空間對以下應用特別有用 分階段將oltp的資...
Oracle表空間遷移
源伺服器環境 dell r710 red hat linux 5.4 x64 目標伺服器環境 辦公室台式計算機 windows2008 32位 資料庫都是oracle 11.2.0.1 下面是測試全過程 並不是所有的平台都可以相互遷移的。檢視平台列表命令如下 select from v transp...
Oracle表空間遷移
1 查詢當前資料庫的表空間情況 根據下面的 查詢出當前資料庫的表空間名稱,以及路徑等相關資訊,找到要遷移的表空間。select a.tablespace name,a.file id,a.file name,round a.bytes 1024 1024 0 total space from dba...