表空間遷移辦法補充
上次總結了表空間遷移辦法(http://blog.itpub.net/12932950/viewspace-741543),發現還存在幾個不足的地方:
1、沒有考慮iot的情況。對於iot,是不能rebuild其主鍵索引的,要move表才行;
2、沒有考慮存在long欄位的表。這類表不能直接做move,直接處理就報錯了;
同時,也有人提到了用exp/imp的可傳輸表空間方法來實現遷移。
但我覺得既然要exp/imp了,那就乾脆進一步,用expdp/impdp的remap_tablespace了,exp/imp反而不方便,還要建臨時表空間什麼的,多費力。
具體可參考我的另一個blog《資料泵實現資料遷移到異地庫》(http://blog.itpub.net/12932950/viewspace-752301/)。
言歸正傳,這次對前面提到的這兩個問題做了補充:
1、檢查是否為iot,如果是,則排除對iot的主鍵索引的rebuild,改為對錶的move;
2、增加條件不能存在long型別的欄位,存在則單獨處理;
修改後的sql如下:
with tmp as(
select a.owner, a.TABLE_NAME, c.segment_name, c.segment_type, c.tablespace_name
from dba_tables a, dba_constraints b, dba_segments c
where b.constraint_name = c.segment_name
and b.owner = c.owner
and b.constraint_type = 'P'
and a.TABLE_NAME = b.table_name
and a.OWNER = b.owner
and a.iot_type = 'IOT')
select segment_type, segment_name, partition_name,
case segment_type
when 'TABLE' then 'alter table ' || owner || '.' || segment_name || ' move tablespace dbs_temp;'
when 'INDEX' then 'alter index ' || owner || '.' || segment_name || ' rebuild tablespace dbs_temp;'
when 'INDEX PARTITION' then 'alter index ' || owner || '.' || segment_name || ' rebuild tablespace dbs_temp;'
when 'TABLE PARTITION' then 'alter table ' || owner || '.' || segment_name || ' move partition ' || partition_name || ' tablespace dbs_temp;'
end sqltext
from dba_segments b
where not exists(select 1 from tmp a where a.segment_name = b.segment_name and a.owner = b.owner)
and tablespace_name = 'MOVE_TBS'
and segment_type not like 'LOB%'
and segment_name not like 'BIN%'
and not exists(select 1 from dba_tab_columns a
where (a.data_type like 'LONG%' or a.data_type like '%LOB%')
and a.table_name = b.segment_name
and a.owner = b.owner
and b.segment_type like 'TABLE%')
union all
select segment_type, segment_name, null, 'alter table ' || table_name || ' move tablespace dbs_temp;'
from tmp
where tablespace_name = 'MOVE_TBS'
對於存在long型欄位的表,首先篩選出來:
select *
from dba_segments b
where tablespace_name = 'FUND_TABLE'
and segment_name not like 'BIN%'
and exists(select 1 from dba_tab_columns a
where a.data_type like 'LONG%'
and a.table_name = b.segment_name
and a.owner = b.owner
and b.segment_type like 'TABLE%')
然後,用exp/imp匯出再匯入即可,當然,也有提到的用sqlplus copy也是一個不錯的辦法,還能減去中間dmp檔案的過程,直接以資料流的形式實現。
不過,基於一個很簡單的原因,sqlplus copy必須變更表名或變更使用者名稱。
對於lob欄位的處理可見前一篇帖子的內容,在這裡不做贅述。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-1078090/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 表空間遷移
- 遷移表空間
- 【遷移】表空間transport
- RMAN遷移表空間
- ORACLE表批量遷移表空間Oracle
- 遷移SYSTEM表空間為本地管理表空間
- expdp/impdp 遷移表空間
- 跨平臺表空間遷移(傳輸表空間)
- 遷移表到新的表空間
- table/index/LOBINDEX遷移表空間Index
- lob欄位表空間遷移
- 基於可傳輸表空間的表空間遷移
- Oracle 不同平臺間表空間遷移Oracle
- MySQL 遷移表空間,備份單表MySql
- 表、索引遷移表空間alter table move索引
- 空間遷移
- Oracle中表空間、表、索引的遷移Oracle索引
- 使用RMAN簡單遷移表空間
- 資料庫物件遷移表空間資料庫物件
- 【資料遷移】使用傳輸表空間遷移資料
- 線上遷移表空間資料檔案
- 不同使用者,不同表空間遷移
- Oracle 表空間資料檔案遷移Oracle
- 分割槽表對應的表空間遷移案例
- Oracle 12cbigfile表空間物件遷移Oracle物件
- mysql共享表空間擴容,收縮,遷移MySql
- InnoDB資料表空間檔案平滑遷移
- 利用PLSQL實現表空間的遷移(一)SQL
- 利用PLSQL實現表空間的遷移(二)SQL
- 利用PLSQL實現表空間的遷移(四)SQL
- 利用PLSQL實現表空間的遷移(三)SQL
- 利用PLSQL實現表空間的遷移(五)SQL
- undo表空間太大解決辦法
- 遷移使用者物件從一個表空間到另外表空間物件
- MySQL Innodb表空間解除安裝和遷移案例MySql
- (個人)Oracle 表空間資料檔案遷移(轉)Oracle
- 海量資料遷移之傳輸表空間(一)
- 手工段管理表空間遷移後的調整