涉及到多个数据库之间的同步,由于某些原因(某些数据库只需要表内部分数据;数据库类型目前为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,否则访问远端数据库会简单些。
相关推荐
本文档主要介绍了一种针对MySQL环境下两个数据库表之间的双向数据同步方案。该方案适用于需要保持两个不同位置或不同环境中数据库表数据一致性的场景,例如分布式系统、数据中心备份或者跨地域的数据共享等。 #### ...
3. **镜像**:数据库镜像是主数据库与备份数据库之间的一种实时同步方式。主数据库的所有更改都会立即反映在备份数据库上,提供极高的数据可用性。 4. **快照复制**:定期创建主数据库的快照,并将其应用于备份...
线上同步表数据库同步是IT行业中一个重要...使用这些文件,你可以根据实际情况调整和部署你的数据库同步方案,确保数据在多个数据库间的一致性和完整性。记得在部署过程中进行充分的测试,以防止潜在的数据丢失或冲突。
这是一种单向同步策略,通常称为“推送”或“拉取”,取决于哪个数据库作为源,哪个作为目标。 数据库同步方法有很多种,比如: 1. **触发器同步**:在源数据库上设置触发器,当数据发生变化时,自动更新目标数据库...
3. **数据过滤与映射**:根据业务需求,可以设定过滤规则,只同步特定表或满足条件的记录。同时,字段映射功能可以将源数据库的字段与目标数据库的字段对应起来。 4. **网络与性能优化**:考虑到网络延迟和带宽限制...
总之,针对SQL Server无主键表的同步方案,需要结合使用SSIS和自定义脚本,以及可能的外部编程语言辅助,以克服特定数据类型的同步难题。这种方法虽然能有效处理大部分情况,但仍然需要不断优化和完善,特别是在处理...
在SQL Server中,同步其他异构数据库是一种常见的需求,特别是在多数据源整合或者实时数据交换的场景下。本文将详细探讨一种不依赖于特定编程语言,而是通过触发器和批处理文件来实现的方法。 首先,我们需要理解...
kettle 提供了一种对比增量更新的机制处理这种情况,可通过“合并记录”步骤实现,该步骤的输入是新旧两个数据源,通过关键字进行数据值比对,对比结果分为四种类型:“Identical”、“changed”、“new”、...
1. **C#编程语言**:C#是微软开发的一种面向对象的编程语言,广泛用于构建Windows桌面应用、Web应用以及服务端应用。在本项目中,C#将作为编写数据库同步服务的主要工具。 2. **Access数据库**:Access是由...
【基于触发器和控制表的数据库同步系统】是一种利用编程技术实现的数据库间数据实时或定期更新的解决方案,尤其在多数据中心或者分布式环境中有广泛应用。本系统由Java语言开发,专注于MySQL数据库之间的表数据同步...
- **物理备库**:是一种物理复制的方式,它通过在备用数据库上应用来自主数据库的归档日志来保持数据的一致性。 - **逻辑备库**:使用SQL Apply技术,将主数据库上的变更数据捕获并通过网络发送到备用数据库进行应用...
Galera replication是一种多主复制机制,提供强一致性保证,广泛应用于如MariaDB Galera Cluster和Percona XtraDB Cluster。Galera保证了所有节点的数据同步,适用于对数据一致性要求高的应用,如电商。然而,Galera...
Java是一种流行的、跨平台的编程语言,具有丰富的库支持和强大的网络功能,因此适合用于构建数据库同步解决方案。 数据库同步的技术方案多种多样,包括异步复制、半同步复制、多源复制等。MySQL中的复制功能允许一...
数据库双向同步是一种技术,用于在两个或多个数据库之间保持数据一致性。这种技术广泛应用于分布式系统、备份策略以及需要实时共享数据的多站点环境。在本文中,我们将深入探讨如何实现数据库的双向同步,并重点关注...
MySQL数据库双活同步复制方案是为了实现数据库的高可用性和数据一致性,主要分为几种常见的方法,包括MySQL原生复制主主同步、Galera replication、Group Replication以及第三方工具如canal。 1. MySQL原生复制主主...
标签 "C#" 暗示项目是用C#语言编写的,这是一种面向对象的编程语言,常用于开发Windows桌面应用程序和Web服务。在本例中,C#可能被用来编写数据同步逻辑,通过ADO.NET(.NET Framework的数据访问组件)连接并操作...
数据库表差异比较程序是一种用于分析和识别两个数据库之间表结构和数据差异的工具。这个程序在IT领域中具有广泛的应用,特别是在数据库管理、数据分析、软件升级和数据迁移等场景下。下面将详细介绍这个主题。 首先...
【SqlServer数据库同步】是项目中常见的一种技术需求,特别是在数据分散在不同的服务器上,并需要跨网域调用的场景下。数据库同步能够确保数据的一致性和实时性,提高系统的稳定性和可靠性。 首先,进行SqlServer...
在主服务器上启用二进制日志功能,记录所有对数据库的更改操作,这些日志被发送到从服务器,从而实现数据的实时同步。主服务器为当前支撑游戏运行的数据库,而从服务器则作为独立的备份服务器,其数据库版本和结构与...