数据库表记录的一种同步方案

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
涉及到多个 数据库之间的同步,由于某些原因(某些数据库只需要表内部分数据;数据库类型目前为 MySQL,但可能后期部分数据库采用 Oracle),不能采用MySQL的主从同步机制。由于对同步的实时性要求不高,记录个数也不是太多,另外做了一种简易的同步方案。
   一、 通过触发器生成数据表版本号
  将数据表的每次更新时间记录到另一张版本表中。
drop table if exists Tab_Version_Tab;
create table Tab_Version_Tab
(
Tab_Name            char(40)    not null,       #表名  #
TrigVersion         int         null,       #触发版本号#
SourceVersion           int         null,       #源版本号#
LocalVersion            int         null,       #本地版本号#
constraint pk_Tab_Version_Tab primary key(Tab_Name)
);
delete from Tab_Version_Tab;
insert into Tab_Version_Tab values("Demo1_Tab", 0, 0, 0);
  触发器脚本如下:
drop trigger if exists trig_insert_Demo1_Tab;
delimiter |
create trigger trig_insert_Demo1_Tab after insert on Demo_Tab
for each row
begin
update Tab_Version_Tab set TrigVersion=UNIX_TIMESTAMP() where Tab_Name = 'Demo1_Tab';
end;
|
delimiter ;
  同样可以建立update,delete的触发器。郁闷的是MySQL的触发器只支持for each row,效率会较低。

 在实际应用中,触发器脚本是用LUA脚本生成的。
local file_in = "d:\\sync_tables.sql"
local file_out = "d:\\sync_trigs.sql"
local tbl_prop = {}
local fp = io.open(file_in, "r")
if fp then
while true do
s1 = fp:read("*l")
if not s1 then break end
_,_,s2 = string.find(s1, "\"([%w%_]+)\"")
if s2 then
tbl_prop[s2] = 1
end
end
end
local sql_prep = [[
drop trigger if exists trig_$OP_$TAB;
delimiter |
create trigger trig_$OP_$TAB after $OP on $TAB
for each row
begin
update Tab_Version_Tab set TrigVersion=UNIX_TIMESTAMP() where Tab_Name = '$TAB';
end;
|
delimiter ;
]]
local tbl_rep = {"insert", "update", "delete"}
local fp_out = io.open(file_out, "w")
if fp_out then
fp_out:write("use xopensdb\n")
for k,v in pairs(tbl_prop) do
fp_out:write("-- triggers of " .. k .. "\n")
for k1,v1 in pairs(tbl_rep) do
local sql_out = sql_prep
sql_out = string.gsub( sql_out, "$TAB", k);
sql_out = string.gsub( sql_out, "$OP", v1);
fp_out:write(sql_out)
fp_out:write("\n")
end
fp_out:write("\n")
end
end
   二、 维护表记录一致
  从数据库定时访问Tab_Version_Tab,检查是否发生变化,如果发生变化,则将主数据库的数据表按条件导入到从数据库的临时表中,然后比较临时表和本地表的记录是否相同:
   1. 比较两者记录个数是否相同
  2. 用natural join取出的记录个数和本地表记录是否相同
  SELECT COUNT(*) FROM table_local NATURAL JOIN table_tmp;
  如果不同,则清空本地表,从临时表插入。
  MySQL无DBLINK,否则访问远端数据库会简单些。

最新内容请见作者的GitHub页:http://qaseven.github.io/

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 Oracle 关系型数据库
Dataphin常见问题之想要周期执行任务如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
6月前
|
关系型数据库 MySQL 数据库
掌握MySQL数据库基础知识 同步练习与实训
掌握MySQL数据库基础知识 同步练习与实训。
85 0
|
7月前
|
存储 关系型数据库 MySQL
掌握MySQL数据库基础知识的同步练习与实训
进行掌握MySQL数据库基础知识的同步练习与实训。
102 0
|
4月前
|
中间件 关系型数据库 Java
MySQL数据库分库分表方案
MySQL数据库分库分表方案
138 0
MySQL数据库分库分表方案
|
5月前
|
关系型数据库 MySQL 数据库
淘东电商项目(42) -利用Logstash自动同步数据库内容到ES(多文件方式)
淘东电商项目(42) -利用Logstash自动同步数据库内容到ES(多文件方式)
42 0
|
5月前
|
数据库
Mac NavicatPrenium远程同步数据库
Mac NavicatPrenium远程同步数据库
32 0
|
3月前
|
关系型数据库 MySQL 数据库
使用Flink同步MySQL到doris数据库中,时间格式异常
当我完成同步时,我发现Doris数据库中的所有时间格式都变为了如此:1970-02-01 11:00:00.000000,在所有时间格式后面追加了一个点和6个零,这是怎样造成的,该如何解决这个问题
|
4月前
|
消息中间件 关系型数据库 MySQL
在kafka connect 同步 mysql 主从数据库
在kafka connect 同步 mysql 主从数据库
45 0
|
4月前
|
关系型数据库 数据库 PostgreSQL
postgresql|数据库|恢复备份的时候报错:pg_restore: implied data-only restore的处理方案
postgresql|数据库|恢复备份的时候报错:pg_restore: implied data-only restore的处理方案
63 0
|
18天前
|
SQL 存储 关系型数据库
向 MySQL 数据库插入 100w 条数据的优化方案
向 MySQL 数据库插入 100w 条数据的优化方案
35 1

热门文章

最新文章