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

涉及到多个数据库之间的同步,由于某些原因(某些数据库只需要表内部分数据;数据库类型目前为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/

时间: 2024-09-27 07:45:39

数据库表记录的一种同步方案的相关文章

link中的主从数据库表如何实现动态数据同步的功能?

问题描述 link中的主从数据库表如何实现动态数据同步的功能? link中的主从数据库表如何实现动态数据同步的功能? 解决方案 http://www.cnblogs.com/yjmyzz/archive/2009/06/14/1502921.html

SQL SERVER数据库表记录只保留N天图文教程_MsSql

本文通过图文并茂的方式给大家展示SQL SERVER数据库表记录只保留N天图文教程,具体方法步骤请看下文: 第一步:首先设置SQL Server 代理服务为自动启动: "开始"-->"控制面板"-->"管理工具"-->"服务"-->右键" SQL SERVER 代理"-->"属性"-->"启动类型",选择 "自动启动 &q

SQL SERVER数据库表记录只保留N天图文教程

本文通过图文并茂的方式给大家展示SQL SERVER数据库表记录只保留N天图文教程,具体方法步骤请看下文: 第一步:首先设置SQL Server 代理服务为自动启动: "开始"-->"控制面板"-->"管理工具"-->"服务"-->右键" SQL SERVER 代理"-->"属性"-->"启动类型",选择 "自动启动 &q

根据sql脚本修改数据库表结构的几种解决方案

最近由于项目需要要做一个小工具. 需求:客户用的老库并存储了一些数据,用了一段时间,我们根据客户提出新功能在老库的基础上对新库进行修改.这些修改有很多细节方面的修改,包含存储过程,增加表,修改表字段类型,添加字段. 然后我们自己更新并测试好软件后,需要改动客户那边的老库,老库的数据是要保存的. 解决方案一:很快我就想到用SQL SERVER 08 R2 自带的功能,生成新库脚本.把老库改个名字,跑新库脚本,然后通过数据库自带功能把老库数据导入到新库数据.测试的时候,数据量不大,速度还比较理想.

mysql数据库表记录数

经常用到,在这里记录一下,使用的命令 use information_schema; select table_name,table_rows from tables where TABLE_SCHEMA = '数据库名' order by table_rows desc; 查询出来的是每张表的行数

根据sql脚本修改数据库表结构的几种解决方案_MsSql

最近由于项目需要要做一个小工具. 需求:客户用的老库并存储了一些数据,用了一段时间,我们根据客户提出新功能在老库的基础上对新库进行修改.这些修改有很多细节方面的修改,包含存储过程,增加表,修改表字段类型,添加字段. 然后我们自己更新并测试好软件后,需要改动客户那边的老库,老库的数据是要保存的. 解决方案一:很快我就想到用SQL SERVER 08 R2 自带的功能,生成新库脚本.把老库改个名字,跑新库脚本,然后通过数据库自带功能把老库数据导入到新库数据.测试的时候,数据量不大,速度还比较理想.

powerDNS 数据库表记录简要说明

数据库连接方法 [root@gd02-qa-plxt2-nodomain /]# mysql -u vipdns -pvipdns -h 10.0.3.99 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | pdns | +--------------------+ 2 rows in set (0.00 sec) 注: -u 指定用

【转】微服务MySQL分库分表数据到MongoDB同步方案

需求背景 近年来,微服务概念持续火热,网络上针对微服务和单体架构的讨论也是越来越多,面对日益增长的业务需求是,很多公司做技术架构升级时优先选用微服务方式.我所在公司也是选的这个方向来升级技术架构,以支撑更大访问量和更方便的业务扩展. 发现问题 微服务拆分主要分两种方式:拆分业务系统不拆分数据库,拆分业务系统拆分库.如果数据规模小的话大可不必拆分数据库,因为拆分数据看必将面对多维度数据查询,跨进程之间的事务等问题.而我所在公司随着业务发展单数据库实例已经不能满足业务需要,所以选择了拆分业务系统同时

Oracle数据库表空间恢复方案

oracle|恢复|数据|数据库 一. 用户表空间 错误: 在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,在关闭数据库(使用shutdown normal或shutdown immediate) 时将导致错误ORA -01116,ORA-01110以及操作系统级错误ORA-07368 解决,以下有两种解决方案: 1.用户的表空间可以被轻易地重建 即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等.在这种情况下,最简单的方法是offline