採用Materialized View (Snapshot) + DB Link + Trigger 架構,可實現低延遲、可控的資料表同步,適用於異構或同構環境。
CREATE PUBLIC DATABASE LINK dblink_src CONNECT TO usr IDENTIFIED BY pwd USING 'src_tns';CREATE TABLE test_user (id NUMBER(10) PRIMARY KEY, name VARCHAR2(12), age NUMBER(3));SELECT * FROM test_user@dblink_src;CREATE MATERIALIZED VIEW LOG ON test_user;CREATE MATERIALIZED VIEW mv_test_user AS SELECT * FROM test_user@dblink_src;ALTER MATERIALIZED VIEW mv_test_user REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/1440 WITH PRIMARY KEY;(每分鐘)ALTER MATERIALIZED VIEW mv_test_user REFRESH COMPLETE START WITH SYSDATE NEXT SYSDATE + 1/1440;BEGIN DBMS_MVIEW.REFRESH('mv_test_user', 'F'); END; -- F=Fast, C=Complete
EXEC DBMS_SNAPSHOT.REFRESH('mv_test_user','F');
CREATE OR REPLACE TRIGGER trg_mv_test_user_afr
AFTER INSERT OR UPDATE OR DELETE ON mv_test_user
FOR EACH ROW
BEGIN
IF DELETING THEN
DELETE FROM test_user WHERE id = :OLD.id;
ELSIF INSERTING THEN
INSERT INTO test_user (id, name, age) VALUES (:NEW.id, :NEW.name, :NEW.age);
ELSIF UPDATING THEN
UPDATE test_user SET name = :NEW.name, age = :NEW.age WHERE id = :OLD.id;
END IF;
END;
/
Source 端同樣建立 MV + Trigger,但在 Trigger 中必須判斷資料是否真正異動,避免 Target 刷新 → 觸發 Source Trigger → 回寫 Target → 再刷新…無限循環。
CREATE OR REPLACE TRIGGER trg_test_user_bidir
AFTER INSERT OR UPDATE OR DELETE ON test_user
FOR EACH ROW
DECLARE
v_cnt NUMBER;
BEGIN
IF INSERTING THEN
SELECT COUNT(*) INTO v_cnt FROM test_user@dblink_tgt WHERE id = :NEW.id;
IF v_cnt = 0 THEN
INSERT INTO test_user@dblink_tgt (id, name, age) VALUES (:NEW.id, :NEW.name, :NEW.age);
END IF;
ELSIF UPDATING THEN
SELECT COUNT(*) INTO v_cnt FROM test_user@dblink_tgt
WHERE id = :OLD.id AND (name != :NEW.name OR age != :NEW.age);
IF v_cnt > 0 THEN
UPDATE test_user@dblink_tgt SET name = :NEW.name, age = :NEW.age WHERE id = :OLD.id;
END IF;
ELSIF DELETING THEN
DELETE FROM test_user@dblink_tgt WHERE id = :OLD.id;
END IF;
END;
/
| 需求 | NEXT 子句 |
|---|---|
| 30 秒 | SYSDATE + 30/86400 |
| 1 分鐘 | SYSDATE + 1/1440 |
| 30 分鐘 | SYSDATE + 30/1440 |
| 1 小時 | SYSDATE + 1/24 |
| 1 天 | SYSDATE + 1 |
ALL_SNAPSHOT_REFRESH_TIMES:最後刷新時間。USER_JOBS:下次排程時間(NEXT_DATE)。Materialized View 同步架構簡單、無需額外授權、支援快速刷新,是中小規模異地同步的首選方案。