文章實現了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跨庫同步表的方式。