首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 進階復制實作:異地資料庫同步部署全流程

     編輯:Oracle 資料庫基礎

前置條件

  1. 資料庫版本支援進階復制:以 SYS 登入查詢 V$OPTION,ADVANCED REPLICATION 須為 TRUE
  2. 初始化參數設定:
    • DB_DOMAIN = test.com.cn
    • GLOBAL_NAMES = TRUE(資料庫連結名稱必須與全域名稱一致)
    • JOB_QUEUE_PROCESSES = 1、JOB_QUEUE_INTERVAL = 60、DISTRIBUTED_TRANSACTIONS = 10、OPEN_LINKS = 4
    • 修改後需重啟資料庫生效

環境規劃範例

項目深圳節點北京節點
全域資料庫名shenzhen.test.com.cnbeijing.test.com.cn
SIDshenzhenbeijing
Listener Port15211521
Server IP10.1.1.10010.1.1.200

十大部署步驟

1. 雙向網路連通性測試

在 TNSNAMES.ORA 設定連線字串,雙邊執行 TNSPING 驗證。

2. 設定全域名稱與公共資料庫連結

-- 深圳
ALTER DATABASE RENAME GLOBAL_NAME TO shenzhen.test.com.cn;
CREATE PUBLIC DATABASE LINK beijing.test.com.cn USING 'beijing';
SELECT * FROM GLOBAL_NAME@beijing.test.com.cn; -- 應回傳 beijing.test.com.cn

-- 北京
ALTER DATABASE RENAME GLOBAL_NAME TO beijing.test.com.cn;
CREATE PUBLIC DATABASE LINK shenzhen.test.com.cn USING 'shenzhen';
SELECT * FROM GLOBAL_NAME@shenzhen.test.com.cn; -- 應回傳 shenzhen.test.com.cn

3. 建立復制管理用戶 REPADMIN 並授權

CREATE USER repadmin IDENTIFIED BY repadmin DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
EXEC DBMS_DEFER_SYS.REGISTER_PROPAGATOR('repadmin');
GRANT EXECUTE ANY PROCEDURE TO repadmin;
EXEC DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_REPGROUP('repadmin');
GRANT COMMENT ANY TABLE TO repadmin;
GRANT LOCK ANY TABLE TO repadmin;
-- 雙邊同樣執行

4. REPADMIN 下建立私有資料庫連結

-- 深圳
CONNECT repadmin/repadmin
CREATE DATABASE LINK beijing.test.com.cn CONNECT TO repadmin IDENTIFIED BY repadmin;
SELECT * FROM GLOBAL_NAME@beijing.test.com.cn;

-- 北京同理建立指向深圳的私有連結

5. 準備復制物件(以 SCOTT.DEPT 為例)

  • 雙邊建立 SCOTT 用戶、授權、建立 DEPT 表(含主鍵 DEPTNO)
  • 建立序列產生主鍵值,範圍不重疊:深圳 1-44、北京 45-99
  • 插入初始化資料並 COMMIT

6. 建立主復制群組並加入物件、產生復制支援

EXEC DBMS_REPCAT.CREATE_MASTER_REPGROUP('scott_mg');
EXEC DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
  SNAME=>'SCOTT', ONAME=>'DEPT', TYPE=>'TABLE',
  USE_EXISTING_OBJECT=>TRUE, GNAME=>'scott_mg');
EXEC DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT('SCOTT','DEPT','TABLE');
-- 查詢 DBA_REPGROUP、DBA_REPOBJECT 確認

7. 加入第二個主復制節點(北京)

EXEC DBMS_REPCAT.ADD_MASTER_DATABASE(
  GNAME=>'scott_mg', MASTER=>'beijing.test.com.cn',
  USE_EXISTING_OBJECTS=>TRUE, COPY_ROWS=>FALSE,
  PROPAGATION_MODE=>'ASYNCHRONOUS');
-- 查詢 USER_JOBS 確認排程已建立

8. 啟動復制群組(從 QUIESCED 轉 NORMAL)

EXEC DBMS_REPCAT.RESUME_MASTER_ACTIVITY('scott_mg', FALSE);
-- 若失敗可嘗試 TRUE(緊急情況)
SELECT GNAME, MASTER, STATUS FROM DBA_REPGROUP; -- 應顯示 NORMAL

9. 設定排程:每 10 分鐘推送與清理

-- 深圳
BEGIN
  DBMS_DEFER_SYS.SCHEDULE_PUSH(DESTINATION=>'beijing.test.com.cn',
    INTERVAL=>'SYSDATE + 10/1440', NEXT_DATE=>SYSDATE);
  DBMS_DEFER_SYS.SCHEDULE_PURGE(NEXT_DATE=>SYSDATE,
    INTERVAL=>'SYSDATE + 10/1440', DELAY_SECONDS=>0, ROLLBACK_SEGMENT=>'');
END;
-- 北京對稱設定指向深圳

10. 即時驗證:手動執行 JOB

SELECT JOB, THIS_DATE, NEXT_DATE, WHAT, BROKEN FROM USER_JOBS;
EXEC DBMS_JOB.RUN(job_number);

異常處理

JOB 狀態判讀

  • 正常:THIS_DATE 為空或非空,NEXT_DATE 為未來時間
  • 死結:NEXT_DATE 為過去時間或極大值(如 4001-01-01),常因網路中斷

解除死結

PS -EF | GREP ORA_SNP  找到進程號
KILL -9 進程號
EXEC DBMS_JOB.RUN(job_number);

動態增減復制物件

  1. EXEC DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY('scott_mg');
  2. 加入/移除物件並 GENERATE_REPLICATION_SUPPORT / DROP_MASTER_REPOBJECT
  3. EXEC DBMS_REPCAT.RESUME_MASTER_ACTIVITY('scott_mg', FALSE);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved