oracle 資料庫資料移轉解決方案

來源:互聯網
上載者:User

  去年年底做了不少系統的資料移轉,大部分系統由於平台和版本的原因,做的是邏輯遷移,少部分做的是物理遷移,有一些心得體會,與大家分享。

  首先說說遷移流程,在遷移之前,寫好方案,特別是實施的方案步驟一定要寫清楚,然後進行完整的測試。我們在遷移時,有的系統測試了四五次,通過測試來完善方案和流程。

  針對物理遷移,也即通過RMAN備份來進行還原並應用歸檔的方式(這裡不討論通過dd方式進行的冷遷移),雖然注意的是要將資料庫設為force logging的方式,在用RMAN做全備之前,一定要執行:

  否則可能會產生壞塊。

  對於邏輯遷移,在job_processes設定為>0的數值之前,注意job的下次執行時間和job所屬使用者。比如job的定義在之前已經匯入,但是在遷移之時,job已經運行過,那麼遷移完成之後,job的下次時間還是原來的時間,這樣可能會重複運行。另外,job通過IMP匯入後,job所屬使用者會變成匯入使用者的名稱,顯然job原來的使用者就不能對JOB進行管理了,可以通過下面的sql進行修改:

  在遷移之前,應該禁止對系統進行結構上的修改和發布,比如表結構,索引,預存程序包等。

  如果是用exp/imp匯入的對象,包括預存程序等,應該檢查對象是否與原生產庫一致,比如由於dblink的原因,imp之後,預存程序不能建立,導致有部分預存程序丟失,儘管這些預存程序可能沒有被使用。

  下面是一些加快遷移速度的技巧

  通過dblink,使用append insert的方式,同時利用並行,這種方式比exp/imp更快

  對於有LONG類型的列,insert..select的方式顯然是不行的,可以通過exp/imp的方式,但是這種方式速度非常慢,其原因在於imp時一行一行地插入表。有另外一種方式,即sqlplus的copy命令,下面是一個樣本:

  不過,sqlpus的copy命令不支援有timestamp和lob列類型的表。如果有timestamp類型的表,可以通過在exp時,加上rowid的條件,將一個表分成多個部分同時操作,對於有lob類型的表,也可以同樣處理(因為insert …select方式下,有lob類型列時,也同樣是一行一行地插入)。注意在這種方式下,就不能使用direct的方式exp/imp。下面是exp匯出時parfile樣本:

  將表分成幾部分同時操作,不僅僅可以利用rowid,也可以利用表上的列,比如說,表上有一個created_date的列,並且保證是遞增插入資料,那麼這種情況下,也可以使用這個欄位將表分成不同的範圍同時進行匯出和匯入。不過使用ROWID通常具有更高的效率。

  當然對於有lob列的表,可以按上述方式,拆成多個insert方式同時插入,不需要exp/imp。

  ·對於特別大的分區表,雖然使用並行可以提高速度,但是受限於單個進程(不能跨DB LINK進行並行事務,只能並行查詢,也即insert..select只能是SELECT部分才能進行並行)的處理能力,這種方式下速度仍然有限。可以並行將資料插入多個中間表,然後通過exchange partition without validation 的方式,交換分區,這種方式將會大大提高了速度。

  ·有朋友可能會問,為什麼不並行直接插入分區表,當然如果是非direct path(append)方式,則是沒問題的,但是這種方式插入的效能較低。而direct path的方式,會在表上持有mode=6(互斥)的TM鎖,不能多個會話同時插入。(update: 在insert 時使用這樣的語句:insert into tablename partition (partname) select * from tablename where ….,更簡單更有效率。)

  ·遷移時,將資料分成兩部分,一部分是曆史表,第二部分是動態變化的表,在遷移之前,先匯入曆史表,並在曆史表上建好索引,這無疑會大大減少遷移時業務系統停機時間。

  ·遷移之前,考慮清理掉垃圾資料。

  ·遷移時,應保證表上沒有任何索引,約束(NOT NULL除外)和觸發器,資料匯入完成後,再建索引。建索引時同樣,同時使用多個進程跑指令碼。索引建立無成後,應去掉索引的PARALLEL屬性

  ·在建立約束時,應按先建立CHECK約束,主鍵,唯一鍵,再建立外鍵約束的順序。約束狀態為 ENABLE NOVALIDATE,這將大大減少約束建立時間。而在遷移完成後,再考慮設回為ENABLE VALIDATE。

  ·通過使用dbms_stats.export_schame_stats和dbms_stats.import_schame_stats匯入原庫上的統計資訊,而不用重新收集統計使用。

  朋友們可以看到,以上均是針對9i的,實際上在10g甚至11g環境下,也仍然很多借鑒意義。當然這些技巧不僅僅用於完整的資料庫遷移,也可以應用到將個別表複製到其他資料庫上。

  這裡沒有提到的是利用物化視圖或進階複製、觸發器之類的技術,因為這些技術,畢竟要修改生產庫,對生產庫的運行有比較大的影響,因此,只有在停機時間要求特別嚴格,而在這個時間內又不能完成遷移時才應該考慮。

  從遷移的經驗來說,只有完善的流程,完整的測試才可以保證成功。這裡只是列舉了一些小技巧,如果對整個遷移過程有興趣,可以針對這個話題再進行討論。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.