首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 外鍵約束與 GoldenGate 同步衝突實戰:級聯刪除、約束暫停、GG 錯誤處理

     編輯:Oracle 資料庫相關知識

Oracle 外鍵 (Foreign Key) 維護父子表參考完整性,但在 GoldenGate (OGG) 異構同步場景下,外鍵約束常導致 Replicat 進程報錯 ORA-02292 (子記錄存在) 或 ORA-01403 (無資料)。本文系統梳理外鍵類型、建立/刪除/暫停語法、級聯規則、OGG 衝突根因與解決方案。

一、五大約束類型速查

類型代碼關鍵字功能
非空CNOT NULL欄位不允許 NULL
唯一UUNIQUE值唯一,允許 NULL
主鍵PPRIMARY KEY唯一 + NOT NULL,單表僅一個
外鍵RFOREIGN KEY ... REFERENCES子表欄位引用父表主鍵/唯一鍵
檢查CCHECK滿足指定條件

命名規範:FK_子表_父表_欄位 (如 FK_FOREIGN_SUB_FOREIGN_MAIN_OBJECT_ID)

二、外鍵建立與級聯測試

-- 父表
CREATE TABLE foreign_main AS SELECT object_id FROM all_objects;
ALTER TABLE foreign_main ADD CONSTRAINT PK_FSID PRIMARY KEY(object_id);

-- 子表
CREATE TABLE foreign_sub AS SELECT object_id, object_name FROM all_objects;
DELETE FROM foreign_sub WHERE object_name = 'FOREIGN_MAIN'; COMMIT;

-- 建立外鍵 (預設 NO ACTION)
ALTER TABLE foreign_sub ADD CONSTRAINT FR_FSSID FOREIGN KEY(object_id) REFERENCES foreign_main(object_id);

-- 測試:插入父表不存在的值
INSERT INTO foreign_sub VALUES(1, 'ts');
-- ORA-02291: integrity constraint violated - parent key not found

級聯刪除測試 (ON DELETE CASCADE)

-- 重建外鍵啟用級聯
ALTER TABLE foreign_sub DROP CONSTRAINT FR_FSSID;
ALTER TABLE foreign_sub ADD CONSTRAINT FK_FS_OID FOREIGN KEY(object_id) 
  REFERENCES foreign_main(object_id) ON DELETE CASCADE;

-- 父表刪除 → 子表關聯行自動刪除
DELETE FROM foreign_main WHERE object_id=52010; COMMIT;
SELECT * FROM foreign_sub WHERE object_id=52010; -- no rows selected

-- 注意:CASCADE 僅支援刪除,不支援 UPDATE 父鍵值
UPDATE foreign_main SET object_id=52012 WHERE object_id=52010;
-- ORA-02292: integrity constraint violated - child record found

三、SQL92 定義的五種參考動作

動作關鍵字行為Oracle 支援
限制RESTRICT拒絕父表更新/刪除隱含支援 (預設 NO ACTION)
置空SET NULL子表外鍵欄位設 NULL支援 ON DELETE SET NULL
置默認值SET DEFAULT子表設為默認值不支援
級聯CASCADE子表同步刪除/更新支援 ON DELETE CASCADE,不支援 UPDATE CASCADE
無動作NO ACTION語句結束後檢查,違反則回滾預設行為

四、常用外鍵管理查詢

-- 查表的外鍵
SELECT * FROM user_constraints WHERE constraint_type='R' AND table_name='TABLE_NAME';

-- 查外鍵引用的父表欄位
SELECT * FROM user_cons_columns WHERE constraint_name='FK_NAME';

-- 多表關聯查詢
SELECT a.constraint_name, a.table_name, a.constraint_type, 
       b.column_name, c.table_name AS ref_table
FROM user_constraints a
JOIN user_cons_columns b ON a.constraint_name = b.constraint_name
JOIN user_constraints c ON a.r_constraint_name = c.constraint_name
WHERE a.constraint_type = 'R' AND a.table_name = 'CHILD_TABLE';

-- 暫停/啟用外鍵
ALTER TABLE table_name DISABLE CONSTRAINT fk_name;
ALTER TABLE table_name ENABLE CONSTRAINT fk_name;

五、GoldenGate 同步衝突實戰

錯誤現象

2013-12-26 04:51:25 WARNING OGG-00869 OCI Error ORA-02292: integrity constraint (SCOTT.FR_FOREIGN_SUB_OBJECT_ID) violated - child record found (status = 2292). DELETE FROM "SCOTT"."FOREIGN_MAIN" WHERE "OBJECT_ID" = :b0.
2013-12-26 04:51:25 ERROR OGG-01668 PROCESS ABENDING.

根因分析

  • OGG Replicat 在目標端重放源端的 DELETE 父表記錄
  • 目標端子表仍存在關聯行 (因同步延遲、過濾、初始化不全等)
  • 外鍵約束生效,阻止父表刪除,Replicat ABEND

解決方案組合

方案適用場景操作風險
1. 目標端暫停外鍵初始載入、大批量同步ALTER TABLE ... DISABLE CONSTRAINT ... 同步完成後 ENABLE同步期間完整性暫時失效
2. Replicat 參數 HANDLECOLLISIONS初始同步、主鍵衝突自動轉換 INSERT/UPDATE/DELETE 處理重複/缺失不處理外鍵約束錯誤
3. SQLEXEC 捕獲錯誤延遲重試間歇性衝突Replicat 參數檔編寫錯誤處理邏輯複雜度高
4. 源端啟用級聯刪除業務允許級聯ON DELETE CASCADE,目標端同步建立業務邏輯變更
5. 同步順序控制多表同步先同步子表刪除,再同步父表刪除 (OGG 依賴主鍵順序)需精心設計映射規則

生產建議最佳組合

  1. 初始載入階段:目標端 DISABLE CONSTRAINT 所有外鍵,載入完成後 ENABLE NOVALIDATE 再 VALIDATE
  2. 增量同步階段:確保源端業務邏輯與目標端約束一致 (如均啟用 CASCADE)
  3. Replicat 參數:GROUPTRANSOPS 1000、HANDLECOLLISIONS (初始階段)、錯誤處理 REPERROR (DEFAULT, ABEND)
  4. 監控:GGSCI> INFO REP *, DETAIL 定期檢查延遲與錯誤

外鍵是資料完整性的守門員,但在高吞吐異構同步中需靈活「開門」。掌握約束管理語法與 OGG 參數配合,讓完整性與可用性共存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved