Oracle 大資料量下的資料遷移

2021-05-25 02:19:30 字數 2742 閱讀 3992

本文主要描述了從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 要...