`
pda158
  • 浏览: 190192 次
社区版块
存档分类
最新评论

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

阅读更多
涉及到多个数据库之间的同步,由于某些原因(某些数据库只需要表内部分数据;数据库类型目前为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,否则访问远端数据库会简单些。
4
9
分享到:
评论

相关推荐

    基于Flex技术的云同步方案 (2015年)

    设计出一种基于Flex技术的日志解析远程云同步方案,以实现数据共享.它不仅可以实现数据库中记录级数据同步、表一级数据同步、异构表间的实时数据同步,而且同步效率极高,非常适用于跨校区的远程数据同步.

    数据库操作语句大全(sql)

    两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时...

    Goldengate 双向同步最佳解决方案

    在双向复制(Bidirectional)方案中,可以采用以下两种部署方式: 方式一:配置源和目标数据库可以同时保持Active 状态,同时进行应用系统的事务处理, 此时需由应用系统进行控制,避免对同一记录进行处理产生的冲突...

    redis非关系型数据库

    3 支持数据库主从复制,主库master数据会同步到从库slave,同步策略有全量同步、增量同步; 4 分布式系统下,Redis可以利用哨兵模式Sentinel监控主机工作状态,在Master主服务器发生故障的时候,可以实现Maste

    Postgres主从流复制+pgpool高可用方案.docx

    流复制是搭建主备库的一种有效方式,它不需要额外增加软件,只需要单数据库模式的基础上,再复制一份PostgreSQL数据库到另外的一台机器上,对两台数据库进行参数配置,即可实现。这两套数据库之间的数据,通过wal...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    02-文件及DB各种同步方案大集合介绍讲解.avi 03-mysql主从复制介绍及分布式数据库架构实现介绍.avi 04-主从同步的应用场景及切换从库不丢数据多方案介绍.avi 05-mysql数据库读写分离介绍及企业生产实现方案.avi 06-...

    煤矿企业纯软件方式的双机热备系统研究

    针对煤矿监控系统双机热备标准方案中硬件设备昂贵、维护成本较高的问题,设计了一种纯软件方式的双机热备系统。该系统利用文件差异备份以及MYSQL增量备份相结合的方式将数据保存到主、备机中,即采用RSYNC文件同步算法...

    一种基于Java企业内部及时通讯软件设计.doc

    一种基于Java企业内部及时通讯软件设计 摘要:基于Socket的局域网通讯软件能为企业局域网提供一种安全、快速的通信机制, 使用Java Swing 技术设计系统界面,以Derby作为数据库服务器,用Socket编程技术实现网络通讯...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

    C#开发基于FreeSql多库分布式事务、跨库查询、跨库分页查询、跨库增删改等功能实现源码+项目说明+sln.zip

    防止出现换库的情况)、支持分库分表** 等等,这时候第一时间就想到了 [FreeSql](https://github.com/dotnetcore/FreeSql) ,FreeSql的架构设计非常好,每一种支持的数据库都有对应的Provider实现 做到行为一致,...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障...11.2 用户信息表水平拆表方案 296 11.3 阿里巴巴中间件cobar水平拆表方案 299

    移动远程教育方案(附整体预算)

    系统为每一种文书提供了文书仿真输入,可以快速输入系统形成文书的必须内容,而不必把文书的所有内容都输入电脑,系统生成标准格式的文书文件。可以直接打印使用。同时包括信息汇总整理与备份,定期汇总各类信息,...

    sql经典语句一部分

    两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时...

    ado[1].net中文手册 学习 ado.net的重要资料

    DiffGram:提供有关 DiffGram 的详细信息,DiffGram 是一种用于读写 DataSet 内容的 XML 格式。 从 XML 中加载 DataSet:讨论在从 XML 文档中加载 DataSet 内容时需考虑的不同选项。 以 XML 数据形式编写 DataSet:...

    单点登陆解决方案

    各个应用系统都存在自己独立的用户信息数据库和授权管理机制,故而如何实现中央用户目录数据、门户用户数据与各应用系统用户数据之间的用户数据同步和登录帐号/密码的对照,也是信息化建设面临的重要挑战之一。...

    经典SQL语句大全

    两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时...

    Delphi5开发人员指南

    11.1.1 一种新型的多任务 304 11.1.2 在Delphi程序中使用多线程 304 11.1.3 关于线程的滥用 305 11.2 TThread对象 305 11.2.1 TThread基础 305 11.2.2 TThread实例 307 11.2.3 线程的终止 307 11.2.4 与VCL同步 308 ...

    简历封面制作软件_伯乐助手 v2.3.19 正式版.zip

    第二,伯乐助手提供了List信息与简历信息的同步,也即是说,点击任何一条List信息时,与之关联的沟通记录会同时呈现在用户面前。用户也可以在此界面的沟通记录窗口增加沟通记录,同时,该记录也会同步到简历管理。 ...

Global site tag (gtag.js) - Google Analytics