日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Oracle使用dblink同步數據

作者:kangaroo. 更新時間: 2022-07-11 編程語言

兩臺Oracle之間進行數據同步,可以借助Oracle的dblink完成,如果是Oracle與其他數據庫之間,則可以使用Oracle提供的Database Gateways+dblink實現,當然,也可以使用開源ETL工具如kettle完成。

這里提供兩種在Oracle之間同步數據的簡單解決方案。

0 需求

A(192.168.68.129)、B(192.168.68.143)兩個數據庫,當 A 中的表 T_TEST 數據發生改變時,B 數據庫中的 表 T_TEST 自動更新,實現數據主動推送或者主動拉取

1 dblink + 觸發器

1.1 源庫 A 創建dblink

在 源數據庫 A 中創建 dblink,指向 目標庫 B

CREATE database link DBLINK_TEST CONNECT TO SCOTT IDENTIFIED BY "123456" using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.68.143)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SID = ORCL) ) )';

查詢是否創建成功

SELECT * FROM T_TEST @DBLINK_TEST;

1.2 源庫 A 創建觸發器

在 源數據庫 A 中創建觸發器,更新 目標庫 B

CREATE OR REPLACE TRIGGER TRIGGER_SYN_TEST
AFTER INSERT OR UPDATE OR DELETE ON T_TEST FOR each ROW
BEGIN
	IF INSERTING THEN
		INSERT INTO T_TEST @DBLINK_TEST
		VALUES
			( : new.ID,: new.ROLE_NAME,: new.NOTE );
	ELSIF UPDATING THEN
		UPDATE T_TEST @DBLINK_TEST 
		SET ROLE_NAME = : new.ROLE_NAME,NOTE = : new.NOTE
		WHERE
			ID = : new.ID;
	ELSIF DELETING THEN
		DELETE 
		FROM
			T_TEST @DBLINK_TEST 
		WHERE
			ID = : old.ID;
	END IF;
END;

測試是否生效

INSERT INTO T_TEST VALUES(2, '測試角色','測試角色');

UPDATE T_TEST SET ROLE_NAME = '測試角色更新' WHERE ID = 2;

DELETE FROM T_TEST WHERE ID = 2;

2 dblink + 物化視圖

2.1 源庫 A 創建物化視圖日志表

在源庫中創建物化視圖日志表

CREATE MATERIALIZED VIEW LOG ON "T_TEST" WITH ROWID;

2.2 目標庫 B 創建dblink

在 目標庫 B 中創建指向 源庫 A 的dblink

CREATE PUBLIC database link DBLINK_TEST CONNECT TO SCOTT IDENTIFIED BY "123456" using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.68.129)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SID = ORCL) ) )';

2.3 目標庫 B 創建物化視圖

# 創建,不會自動刷新
CREATE MATERIALIZED VIEW MV_TEST refresh fast ON demand WITH ROWID AS 
SELECT * FROM T_TEST @DBLINK_TEST;

# 每分鐘刷新一次
CREATE MATERIALIZED VIEW MV_TEST refresh fast ON demand WITH ROWID NEXT to_date( to_char( SYSDATE + 1/1440, 'dd-mm-yyyy hh24:mi:ss' ), 'dd-mm-yyyy hh24:mi:ss' ) AS 
SELECT * FROM T_TEST @DBLINK_TEST;

# 刪除
DROP MATERIALIZED VIEW mv_name

一天為24個小時 1440分鐘 86400秒
故:
一個小時后時間為 sysdate+1/24

select sysdate + 1/24 from dual

一分鐘后時間為 sysdate+1/1440

select sysdate + 1/1440 from dual

一秒鐘后時間為 sysdate+1/86400

select sysdate + 1/86400 from dual

2.4 手動同步數據

call dbms_mview.refresh ( 'MV_TEST' );

原文鏈接:https://blog.csdn.net/Vampire_1122/article/details/125092229

欄目分類
最近更新