大型資料庫跨平臺遷移總結

tolywang發表於2006-06-19

一.前言

以下為大型資料庫跨平臺遷移的一個實際案例,採用了MV(物化檢視)Trigger以及EXP/IMP相結合處理遷移資料的方式,最大程度減少遷移停機時間 。總結文件中可能有寫的不妥的地方,請大家指正。


二.環境

軟體環境

源資料庫: Windows2000+Oracle9.2.0.1

目標資料庫:Linux AS3.0 + Oracle9.2.0.7

硬體環境

源資料庫: DELL PE6600 8GMem,4*2.8GXeon CPU. CX300 Storage

目標資料庫:DELL PE6600 8GMem,4*2.8GXeon CPU. CX300 Storage

資料庫資訊

系統後臺資料庫,資料庫中包含3個主要使用者AA ,BB, CC,

OLTP執行模式。資料庫總Table數量558(其中一部分為備用表,暫時沒有資料),還包括View, Trigger, Sequences, Types, Resource Plans等。資料庫包含的資料型別有varchar2,number, blob, date ( 嚯嚯,還好沒有Long型別,不過有也可以處理的) 。資料庫磁碟佔用空間總大小為300G 。實際資料量大小接近180G .

遷移要求

WINNT平臺下的Oracle9.2.0.1資料庫結構及資料全部遷移到RH Linux AS3.0平臺下的Oracle9.2.0.7 停機時間不多於6小時。

三.規劃及實施階段

558Table中有3個巨大的含有blob欄位的表,其它Table資料量都一般,可以在允許的停機時間(6小時)exp/imp完成,三個Table中我們以其中一個最大的Table為例來講解,其它2Table效仿即可。

Table名稱: AA.streamdata

Exp 大小: 130G .

Exp耗時: 7~10小時

AA.streamdata表太大,不能在停機時間範圍內完成,考慮使用MV Log方式.

具體規劃及實施步驟如下:

1. exp/imp大表之前,請注意要建立源資料庫中的streamdata表的mv log ,建立mv log之後對streamdata的操作(update ,delete,insert)都會被記錄在mv log中,由於mv log中記錄的是操作,不是資料,所以還需要從mv log refresh來將真正變化的資料部分存在MV 中,所以還需要在目標資料庫(Linux系統平臺)中建立對應streamdata表變化部分的MV . 還有一點需要注意,mv log中的delete 操作不會被refresh到變化部分的MV, 所以需要一個Trigger來記錄源資料庫中streamdata表的刪除記錄。 具體步驟如下:

a. 在源Windows PDM正式資料庫上建立streamdataTrigger, 用於紀錄刪除這個表的紀錄時候的Log (log表名稱為streamdata_del_log), 然後建立Trigger(簡單,就不寫了,DIY)

b. 在源Windows PDM正式資料庫上建立streamdata 表的MV Log (用於儲存匯入匯出期間更新,插入的資料行) . 可以看到mlog$_streamdata 物化檢視日誌表。

SQL> create materialized view log on aa.streamdata

c. 在目標庫(Linux-Base)上建立DB Link 連線到源PDM(WINNT)正式庫 .

SQL>create public database link pdm connect to aa identified by aa using ‘pdm_win’ ;

d. 在目標庫(Linux-Base)上建立一個新的Table: aa.streamdata_mv, 用於儲存源資料中的資料變化(mv log得來的)

CREATE MATERIALIZED VIEW "AA"."STREAMDATA_MV" ON PREBUILT TABLE REFRESH FAST ON DEMAND AS select * from ;

2. 準備開始匯出(exp)正式庫中 aa.streamdata 的資料 , 匯出期間資料庫處於執行狀態,所以可能有部分紀錄會有更新, 插入, 刪除動作 . 這些動作產生的行都會被記錄到mv log . 在最後重新整理時紀錄到STREAMDATA_MV,最後作資料同步處理。

Exp指令碼例子(子查詢匯出)

exp "'sys/sys as sysdba'" QUERY="WHERE streamid>=1 and streamid<50000" buffer=8192 tables=aa.streamdata feedback=50 consistent=n compress=n filesize=20G log=pdmstream1 file=(pdmstream1_1,pdmstream1_2)

……… 其它指令碼依此類推(streamid為條件) .

匯出的時候注意點:

1. 使用 consistent=n

2. 更改引數 : ALTER SYSTEM SET UNDO_RETENTION = 30000;

3. 如果UNDO不夠, 需要加大; LOB型別的使用pctversion作為自己的回滾段 .

4. 儘量在系統不繁忙的時候exp .

5. 按照子查詢匯出 , 避免需要太大undo空間 .

3. Exp出來的dmp檔案可以直接匯入到Linux-BasePDM資料庫, 同時PDM正式資料庫可以進行下一個EXP. 同步進行可以節省時間.

4. 匯入期間注意清除歸檔檔案, 觀察UNDO, TEMP .

5. 停機時間到 , 首先EXP BB使用者的資料, 包括資料 . (保證使用者AP沒有連線到正式DB)

6. 然後開始exp出CC使用者下的資料, 包括資料 , 同時開始匯入BB使用者的資料.

7. 匯入CC 使用者的資料. 匯入同時注意清理歸檔, UNDO, TEMP變化 .

8. 停機期間 , 匯出aaSTREAMDATA以外的其它表, 估計EXP需要時間 2小時,然後匯入。

9. 確認其它資料都已經匯入完成後, 開始處理STREAMDATE 表的差異部份 .

10. Refresh 源資料庫中的mv log , 檢視mv log , 看看是否資料已經消失, 然後檢視目標資料庫中的streamdata_mv 檢視, 應該有大量差異資料行(注意delete的資料是不會記錄在這個檢視中的) . 開始處理差異資料部分,從目標資料庫的記錄差異表streamdata_mv中取出primary key,然後使用SQL在目標資料庫的streamdata(目前資料已經匯入)中刪除這些資料行,然後將目標庫中的streamdata_mv中的差異資料insert 到目標庫中的streamdata中。

11. 匯入匯出期間被刪除的紀錄被記錄在Trigger寫入的LOG(log表在源資料庫中), 從中找出紀錄行, 然後在目標資料庫中刪除這些行

四.注意事項

1 注意exp/imp時候是連sequences,view,procedure等都imp到目標庫

了,由於streamdata大表是線上匯入匯出的,最後實施的mv log資料同步,那麼最開始exp出來的sequence 中的last value在源資料庫中可能已經發生變化,所以請注意,可能需要recreate sequences, 即需要從源庫中匯出sequences指令碼(其中含有每個sequences的最新last value)

2. imp資料的時候,注意disable掉目標庫中的trigger等。以免出現資料

問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84397/,如需轉載,請註明出處,否則將追究法律責任。

相關文章