資料庫物件遷移表空間
今天做了一個資料庫物件的表空間遷移,因為懷疑現在的一個表空間有問題(建表報錯,而建到另外表空間則正常)。實施的步驟是先建立另外一個表空間,命名為htable2,將原表空間的所有物件遷移到此。
透過如下SQL生成遷移語句:
select s.owner, s.segment_name, s.partition_name, s.tablespace_name,
case s.segment_type
when 'TABLE' then 'alter table ' || s.owner || '.' || s.segment_name || ' move tablespace fund_htable;'
when 'INDEX' then
case d.iot_type
when 'IOT' then 'alter table ' || d.owner || '.' || d.table_name || ' move tablespace fund_htable'
else 'alter index ' || s.owner || '.' || s.segment_name || ' rebuild tablespace fund_htable;' end
when 'TABLE PARTITION' then 'alter table ' || s.owner || '.' || s.segment_name || ' move partition ' || s.partition_name || ' tablespace fund_htable;'
when 'TABLE SUBPARTITION' then 'alter table ' || s.owner || '.' || s.segment_name || ' move subpartition ' || s.partition_name || ' tablespace fund_htable;'
end ss
from dba_segments s,
(select ind.index_name, ind.owner, dt.iot_type, dt.table_name
from dba_indexes ind, dba_tables dt
where ind.owner = dt.owner
and ind.table_name = dt.table_name
and dt.iot_type = 'IOT') d
where d.index_name(+) = s.segment_name
and d.owner(+) = s.owner
and s.tablespace_name = 'FUND_HTABLE';
此語句可以生成將以上幾種型別的資料庫物件遷移到目標表空間的SQL語句。
其中IOT表的情況比較特殊,是直接遷移表而不是遷移主鍵索引來實現。而表沒有實際的segment,因此透過dba_indexes進行關聯,再將表進行move tablespace。
然後刪除原表空間:
drop tablespace htable;
由於9i沒有重新命名錶空間的功能,所以只好再建立一個htable表空間,然後將htable2上的物件遷移到此(還是用上面的指令碼遷移)
再將htable2表空間刪除:
drop tablespace htable2 including contents and datafiles;
差不多工作已經完成,除了還有一個無用的資料檔案還未刪除。
這個資料檔案就是原來htable下的那個。現在麻煩了,好像不能直接刪除:
alter database datafile 'xxx' offline drop;
這個命令只是把檔案給offline,但是在控制檔案中還是存在的(雖然啟動的時候也不會去檢查),因此不能直接從作業系統上將此檔案直接刪除。
那怎麼辦呢?我繞了一圈,首先建立一個表空間,重用該資料檔案,然後再用including contents and datafiles選項刪除該表空間,就去掉這個檔案了:
drop tabelspace temm including contents and datafiles;
另外,如何重新命名錶空間呢?
10g裡面,有如下命令:
alter tablespace xxx rename to yyyy;
9i下沒有這樣的命令。
透過如下SQL生成遷移語句:
select s.owner, s.segment_name, s.partition_name, s.tablespace_name,
case s.segment_type
when 'TABLE' then 'alter table ' || s.owner || '.' || s.segment_name || ' move tablespace fund_htable;'
when 'INDEX' then
case d.iot_type
when 'IOT' then 'alter table ' || d.owner || '.' || d.table_name || ' move tablespace fund_htable'
else 'alter index ' || s.owner || '.' || s.segment_name || ' rebuild tablespace fund_htable;' end
when 'TABLE PARTITION' then 'alter table ' || s.owner || '.' || s.segment_name || ' move partition ' || s.partition_name || ' tablespace fund_htable;'
when 'TABLE SUBPARTITION' then 'alter table ' || s.owner || '.' || s.segment_name || ' move subpartition ' || s.partition_name || ' tablespace fund_htable;'
end ss
from dba_segments s,
(select ind.index_name, ind.owner, dt.iot_type, dt.table_name
from dba_indexes ind, dba_tables dt
where ind.owner = dt.owner
and ind.table_name = dt.table_name
and dt.iot_type = 'IOT') d
where d.index_name(+) = s.segment_name
and d.owner(+) = s.owner
and s.tablespace_name = 'FUND_HTABLE';
此語句可以生成將以上幾種型別的資料庫物件遷移到目標表空間的SQL語句。
其中IOT表的情況比較特殊,是直接遷移表而不是遷移主鍵索引來實現。而表沒有實際的segment,因此透過dba_indexes進行關聯,再將表進行move tablespace。
然後刪除原表空間:
drop tablespace htable;
由於9i沒有重新命名錶空間的功能,所以只好再建立一個htable表空間,然後將htable2上的物件遷移到此(還是用上面的指令碼遷移)
再將htable2表空間刪除:
drop tablespace htable2 including contents and datafiles;
差不多工作已經完成,除了還有一個無用的資料檔案還未刪除。
這個資料檔案就是原來htable下的那個。現在麻煩了,好像不能直接刪除:
alter database datafile 'xxx' offline drop;
這個命令只是把檔案給offline,但是在控制檔案中還是存在的(雖然啟動的時候也不會去檢查),因此不能直接從作業系統上將此檔案直接刪除。
那怎麼辦呢?我繞了一圈,首先建立一個表空間,重用該資料檔案,然後再用including contents and datafiles選項刪除該表空間,就去掉這個檔案了:
drop tabelspace temm including contents and datafiles;
另外,如何重新命名錶空間呢?
10g裡面,有如下命令:
alter tablespace xxx rename to yyyy;
9i下沒有這樣的命令。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-669577/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【資料遷移】使用傳輸表空間遷移資料
- 線上遷移表空間資料檔案
- Oracle 表空間資料檔案遷移Oracle
- 表空間遷移
- 遷移表空間
- InnoDB資料表空間檔案平滑遷移
- Oracle 12cbigfile表空間物件遷移Oracle物件
- 【遷移】表空間transport
- RMAN遷移表空間
- 資料庫和表空間資料移動資料庫
- 在資料庫之間移動表空間資料庫
- 達夢資料庫系統表空間資料檔案遷移過程資料庫
- (個人)Oracle 表空間資料檔案遷移(轉)Oracle
- 海量資料遷移之傳輸表空間(一)
- 達夢(DM)資料庫的表空間建立和遷移維護資料庫
- ORACLE表批量遷移表空間Oracle
- 遷移SYSTEM表空間為本地管理表空間
- expdp/impdp 遷移表空間
- 遷移使用者物件從一個表空間到另外表空間物件
- 用傳輸表空間跨平臺遷移資料
- 跨平臺表空間遷移(傳輸表空間)
- oracle 10g資料庫表空間遷移之詳細步驟Oracle 10g資料庫
- oracle 10g資料庫之表空間遷移詳細步驟Oracle 10g資料庫
- 【傳輸表空間】使用 EXPDP/IMPDP工具的傳輸表空間完成資料遷移
- 遷移表到新的表空間
- table/index/LOBINDEX遷移表空間Index
- lob欄位表空間遷移
- 【傳輸表空間】使用 EXPDP/IMPDP工具的傳輸表空間完成資料遷移[轉]
- 基於可傳輸表空間的表空間遷移
- 同/不同庫遷移資料(在同使用者及表空間)測試
- Oracle 不同平臺間表空間遷移Oracle
- MySQL 遷移表空間,備份單表MySql
- 表、索引遷移表空間alter table move索引
- 空間遷移
- 怎樣移動Oracle資料庫的表空間Oracle資料庫
- PostgreSQL:表空間-->資料庫-->表SQL資料庫
- 使用可傳輸表空間向rac環境遷移資料
- oracle 表空間下資料檔案遷移的三種方法Oracle