去年年底我主導了多套核心系統的資料庫遷移,涵蓋同平台升級、異平台遷移、版本跨越等場景。經驗告訴我:寫出詳細的實施步驟腳本,並完成至少 3-5 輪全流程演練,是遷移成功的唯一捷徑。本文彙整實戰中驗證有效的技巧,涵蓋物理遷移、邏輯遷移、效能加速、停機窗口壓縮等關鍵面向。
在執行 RMAN 全量備份前,必須執行:
ALTER DATABASE FORCE LOGGING;
否則 NOLOGGING 操作產生的重做日誌不足,導致備份集還原後應用歸檔時出現壞塊(ORA-01578/ORA-26040)。備份完成後可關閉:ALTER DATABASE NO FORCE LOGGING;。
NEXT_DATE 仍為舊時間,啟用 JOB_QUEUE_PROCESSES > 0 瞬間會重複執行。解法:遷移後先 DBMS_JOB.BROKEN(job, TRUE) 禁用,核對時間再啟用。LOG_OWNER/PRIV_OWNER 會變成執行導入的用戶。修正腳本:UPDATE sys.job$ SET lowner = cowner, powner = cowner;
COMMIT;
SELECT * FROM dba_objects WHERE status='INVALID' 全量檢查並重編譯。對於大表,直接在目標端建立 DB Link 回源,使用並行直寫插入:
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ APPEND PARALLEL(t, 8) */ INTO target_table t
SELECT /*+ PARALLEL(s, 8) */ * FROM source_table@dblink s;
實測速度較 Exp/Imp 提升 3-5 倍,且無中間 DMP 檔案落地開銷。
INSERT ... SELECT 不支援 LONG,Exp/Imp 處理 LOB 極慢(逐列插入)。SQL*Plus COPY 以 Array Fetch 批次傳輸:
SET COPYCOMMIT 2000
SET ARRAYSIZE 30
SET LONG 10485760
COPY FROM system/xxx@src_db APPEND schema.table USING SELECT * FROM schema.table;
限制:不支援 TIMESTAMP、LOB(SecureFiles)類型欄位。
利用 DBMS_ROWID.ROWID_CREATE 切分 ROWID 範圍,產生多組 QUERY 參數的 Parfile,並行執行多個 Exp/Imp 作業:
QUERY="WHERE rowid >= dbms_rowid.rowid_create(1, 71224, 52, 9, 0)
AND rowid <= dbms_rowid.rowid_create(1, 71224, 55, 1038344, 10000)"
同樣適用於含 LOB 欄位的表(繞過逐列插入)。若表有遞增日期欄(如 CREATED_DATE),也可按日期範圍分片,但 ROWID 效率通常更高。
直接並行插入分區表受限於 TM 鎖 Mode 6(互斥),無法多 Session 並行直寫。改用:
ALTER TABLE target_table EXCHANGE PARTITION p_xxx WITH TABLE staging_table WITHOUT VALIDATION; 秒級切換。此法將導入時間從小時級壓縮至分鐘級。
ENABLE NOVALIDATE 瞬間生效,驗證延後。EXEC DBMS_STATS.EXPORT_SCHEMA_STATS('SCHEMA', 'STAT_TABLE', 'STATID');
-- 跨庫匯入 STAT_TABLE 後
EXEC DBMS_STATS.IMPORT_SCHEMA_STATS('SCHEMA', 'STAT_TABLE', 'STATID');
避免大表重新掃描收集統計的數小時開銷,確保執行計劃即刻穩定。
只有當 業務容忍停機時間 < 遷移最小窗口 時,才引入即時同步技術。否則維護成本、對源庫衝擊、複雜度遠超收益。
工具與參數只是手段,標準化流程、完整演練、可回滾預案 才是遷移成功的基石。願這些實戰技巧能為你的下一次遷移保駕護航。