本文主要描述了從oracle 9i至oracle 10g的單錶大資料量的遷移過程,其間作者嘗試了不同方法,對比之後,主要使用了db link。
正文:由於公司伺服器公升級,原oracle 9i rac(裸裝置)系統也公升級到了oracle 10g rac(asm),原資料庫中的資料也要匯入到新建的資料庫中。
資料遷移要求: 環境
原系統:sun slaris 8.0(ultrasparc_64)
oracle 9i r2 rac
新系統:rhel 5.5(x86_64)
oracle 10g r2 rac
要求全資料量遷移(約300g)
原系統資料庫不可下線
oracle的資料遷移有很多種方法:rman的備份/恢復方式、exp/imp、db link + extent等。
rman:
由於系統環境的差異(sparc -> x86)和資料庫版本的問題,rman不予考慮。
exp/imp
最開始使用此方式,實際上在toad中提供的exp/imp工具非常好用,基本無視資料庫的編碼格式和版本,圖形化的介面,可以實時看到匯入、匯出的進度,可以匯出資料庫結構,但由於原資料庫的某些表資料量較大,在匯出時提示exp kgefec: fatal error 0,基本每表可以匯出6g資料後,就會報這個錯誤。這個錯誤我想應該是與資料庫有關,應該不是toad的問題。總之,資料部分匯出和沒導是一樣的,所以該方式也被放棄了。
db link + extent
create database link rc connect to csdn identified by using'(description = (address_list = (address = (protocol = tcp)(host = 10.1.0.62)(port = 1521))) (connect_data = (service_name = rac)))';
在建立好db link後,使用insert into select ....
insert into tb select * from tb@rc
問題大了!在第一試匯入資料量在1.8g的表時,新資料庫的undo表空間開始狂飆,最後占用到了6.5g,其間又手工為undo建立了乙個新的資料檔案,可是最後用不上了,刪除也刪除不了。
insertinto tb select * from tb@rc
但發現如果表的資料量很大的話,這一過程非常慢,乙個7g左右的表,大概用時5個小時。後來發現原表中是建立了extent的,於想到了按區塊導,多個程序並行。
注意:在匯入前最好刪除或禁止新錶中的key和index,這樣匯入會快得多。
操作:1、在新資料庫上建立乙個row_id表
create table my_rowid
(id number,
rowid_min varchar2(100),
rowid_max varchar2(100),
has_deal number);
2、在原資料庫上建立乙個db link,主要用於向新資料庫的row_id表提供目標表資料區塊列表
3、匯入目標表的區塊列表,在原資料庫執行
insert intomy_rowid@rc(id,rowid_min,rowid_max,has_deal)
select rownum,
dbms_rowid.rowid_create(1,o.data_object_id,e.relative_fno,e.block_id,0),
dbms_rowid.rowid_create(1,o.data_object_id,e.relative_fno,e.block_id+e.blocks-1,10000),
0from dba_extents e,dba_objects o
where e.segment_name=upper('base_table')
and e.owner='csdn'
and o.object_name = upper('base_table')
and o.owner='csdn';
4、在新資料庫建立儲存過程,用於多個程序同時呼叫。
5、呼叫過程,開了10個sqlplus
set serveroutput on;--開啟輸出,這樣可以看到錯誤
call sp_xf_copy_table(0);
call sp_xf_copy_table(1);
call sp_xf_copy_table(2);
......
call sp_xf_copy_table(9);
這裡的呼叫是在10個視窗中同時進行了,回頭看看表空間,資料表空間在飛快增長著,而undo基本沒有變化,其間出幾個呼叫出現了ora-02049: timeout: distributed transaction waiting for lock,網上也沒找到太好的答案,應該是我反反覆覆重啟的問題導致鎖了表,於是關閉了出錯的過程,只同時呼叫4個沒有發現問題,4個做完再做接下來的4個、2個,bingo,37g的表大概用了3個小時。
因為300g的資料主要集中在十幾個表中,可以建立個多個row_id表,所以可以把馬力開到最大。如果資料是分布在更多的表中,每表資料也不多,我還是建議用exp/imp。總之,惱人的新資料庫建立基本搞定了,測試的工作還在等待著我,革命還在繼續。
Oracle大資料量遷移
prompt 生成歷史表,使用nologging create table his test nologging as select from test prompt 檢驗新舊表的資料量是否一致 select count 1 from test select count 1 from his tes...
大資料量下的分頁
大資料量下的分頁 郭紅俊 select from orders where orderid between 10248 and 10253 select from orders where orderid in 10248,10249,10250,10251,10252,10253 order by...
大資料量下的sort
sort在linux命令列下面是乙個非常好用的工具,有人把它當做每個程式設計師都應該知道的8個linux命令之一,最近在處理大資料的時候發現兩點。1.用sort u 而不是sort uniq。sort應該是按照歸併的思想來的,先分成乙個個小檔案,排序後再組合成最後拍好序的檔案。所以,sort u 要...