通過觸發器實現跨庫同步表數據


文章實現了postgresql和mysql兩種數據庫的跨庫同步數據表。


 

1.postgresql實現跨庫同步表數據

postgresql采用postgres_fdw插件實現跨庫同步,在編寫跨庫同步腳本前,需要先准備好postgres_fdw的執行環境。

1.1安裝插件、創建遠程服務

如已配置好遠程服務,可以忽略此步驟

-- 安裝 postgres_fdw 插件 
CREATE EXTENSION postgres_fdw;
 
-- 創建遠程服務 
CREATE SERVER remote_server FOREIGN DATA WRAPPER postgres_fdw;
 
-- 查看遠程服務
select * from pg_foreign_server ;
 
-- 修改遠程服務 
alter server remote_server options (add hostaddr '11.216.10.215', 
                          add port '5432', add dbname 'db_des');

1.2創建需要跨庫同步的兩個數據表

實現將數據庫DATABASE_A中的DEMO_TABLE表數據同步到數據庫DATABASE_B中的DEMO_TABLE表

--在數據庫DATABASE_A和DATABASE_B中分別創建表--
CREATE TABLE "DEMO_TABLE" (
"id" serial PRIMARY KEY,
"priv_prod_id" int4,
"shr_type_id" int4,
"start_date" date,
"end_date" date,
"commission" numeric(10,4),
"create_by" varchar(10) COLLATE "default",
"create_time" timestamp(6),
"update_by" varchar(10) COLLATE "default",
"update_time" timestamp(6),
"rec_stat" varchar(1) COLLATE "default",
"version" int2
);

1.3創建遠程控制表

遠程控制表需要與跨庫待同步的數據表結構保持一致,能自動將insert、update、delete命令同步在關聯跨庫表中執行。

------------創建遠程控制表-------------------
DROP TABLE IF EXISTS "public"."fdw_DEMO_TABLE";
CREATE FOREIGN TABLE "public"."fdw_DEMO_TABLE" (
  "id" int4,
  "prod_id" int4,
  "shr_type_id" int4,
  "start_date" date,
  "end_date" date,
  "commission" numeric(10,4),
  "create_by" varchar(10) COLLATE "pg_catalog"."default",
  "create_time" timestamp(6),
  "update_by" varchar(10) COLLATE "pg_catalog"."default",
  "update_time" timestamp(6),
  "rec_stat" varchar(1) COLLATE "pg_catalog"."default",
  "version" int2
)
----使用已經配置好的數據庫外部服務----------
SERVER "pg_fdw_DEMO_TABLE"
----關聯外部數據庫服務的數據表,表結構需要與遠程控制表一致----------
OPTIONS ("table_name" 'demo_table')
;

1.4創建觸發器和函數,實時將數據表中的數據同步到遠程控制表

--創建同步函數--
-------delete函數---------
CREATE OR REPLACE FUNCTION "public"."fuc_DEMO_TABLE_delete"()
  RETURNS "pg_catalog"."trigger" AS $BODY$
BEGIN
        DELETE FROM fdw_DEMO_TABLE WHERE id = OLD.id;
        RETURN OLD;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
-------insert函數---------     
CREATE OR REPLACE FUNCTION "public"."fuc_DEMO_TABLE_insert"()
  RETURNS "pg_catalog"."trigger" AS $BODY$
BEGIN
        INSERT INTO fdw_DEMO_TABLE ( id, prod_id, shr_type_id, start_date, end_date, commission, create_by, create_time, update_by, update_time, rec_stat, version )
  VALUES(new.id, new.priv_prod_id, new.shr_type_id, new.start_date, new.end_date, new.commission, new.create_by, new.create_time, new.update_by, new.update_time, 
        new.rec_stat, new.version);
        RETURN new;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
-------update函數---------  
CREATE OR REPLACE FUNCTION "public"."fuc_DEMO_TABLE_update"()
  RETURNS "pg_catalog"."trigger" AS $BODY$
        BEGIN
         UPDATE fdw_DEMO_TABLE SET prod_id = NEW.priv_prod_id , shr_type_id = NEW.shr_type_id, start_date = NEW.start_date, end_date = NEW.end_date, commission = NEW.commission, create_by = NEW.create_by, create_time = NEW.create_time, update_by = NEW.update_by, update_time = NEW.update_time, rec_stat = NEW.rec_stat, version = NEW.version WHERE id = NEW.id;

        RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
--3.創建觸發器--
CREATE TRIGGER "tg_DEMO_TABLE_delete" AFTER DELETE ON "public"."DEMO_TABLE"
FOR EACH ROW
EXECUTE PROCEDURE "fuc_DEMO_TABLE_delete"();

CREATE TRIGGER "tg_DEMO_TABLE_insert" AFTER INSERT ON "public"."DEMO_TABLE"
FOR EACH ROW
EXECUTE PROCEDURE "fuc_DEMO_TABLE_insert"();

CREATE TRIGGER "tg_DEMO_TABLE_update" AFTER UPDATE ON "public"."DEMO_TABLE"
FOR EACH ROW
EXECUTE PROCEDURE "fuc_DEMO_TABLE_update"();

以上就是postgresql跨庫同步數據的全部實現


 

2.MySql實現跨庫同步表數據

mysql采用fed的方式實現跨庫同步,數據庫默認未開啟fed功能模塊。

2.1開啟fed功能

執行 show ENGINES; 語句

 

 

Support值為NO,說明未支持該引擎。需修改mysql的配置文件進行設置。

找到mysql的配置文件,在[mysqld]后添加federated即可;添加完成,重啟mysql服務再次查詢該引擎狀態為YES即為支持。

2.2創建需要跨庫同步的兩個數據表

參照1.2中的執行腳本

2.3創建fed遠程控制表

遠程控制表需要與跨庫待同步的數據表結構保持一致,能自動將insert、update、delete命令同步在關聯跨庫表中執行。

CREATE TABLE `learn`.`fed_DEMO_TABLE`  (
  `id` varchar(36),
  `code` char(8),
  `version` int(0),
  `create_time` datetime(0),
  `user_name` varchar(100),
  `password` varchar(100),
  `password_salt` varchar(100),
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `idx_DEMO_TABLE_user_name`(`user_name`) USING BTREE
) ENGINE=FEDERATED  CONNECTION = 'mysql://root:root@192.168.92.128:3306/shrio/DEMO_TABLE';
-----
CONNECTION 的鏈接格式為CONNECTION = 'mysql://username:password@ip:port/database/tablename';
-----

2.4創建觸發器,實時將數據表中的數據同步到遠程控制表

-------insert觸發器---------
DELIMITER $
create trigger DEMO_TABLE_insert_trigger after insert
on DEMO_TABLE for each row
begin
INSERT INTO fed_DEMO_TABLE(id,code,version,create_time,user_name,password,password_salt) VALUES(new.id,new.code,new.version,new.create_time,new.user_name,new.password,new.password_salt);
END$;
DELIMITER ;

-------update觸發器---------
DELIMITER $
create trigger DEMO_TABLE_update_trigger after update
on DEMO_TABLE for each row
begin
update fed_DEMO_TABLE set id=new.id,code=new.code,version=new.version,create_time=new.create_time,user_name=new.user_name,password=new.password,password_salt=new.password_salt where id=old.id;
END$;
DELIMITER ;

-------delete觸發器---------
DELIMITER $
create trigger DEMO_TABLE_delete_trigger after delete
on DEMO_TABLE for each row
begin
delete from fed_DEMO_TABLE where id=old.id;
END$;
DELIMITER ;

以上是實現mysql跨庫同步表的方式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM