在线QQ客服:1922638
专业的SQL Server、MySQL数据库同步软件
此实验的主要思想是在创建数据库表时
通过添加一个附加字段(即时间戳字段)
例如,当同步表tt1和表tt2时,
通过检查该表是否为最新更新,将该表用作新表,另一个表为由新表中的数据更新的最旧表。
实验数据如下:
mysql数据库5.1
test.tt1(id int主键,名称varchar(50));
mysql.tt2(id int主键,名称varchar(50));
快照表,可以将其存储在测试数据库中,
另外,为简单起见,您可以将其创建为临时表类型。
数据显示在水壶1中
水壶1
================================================ ==== ============
主要过程显示在水壶2中
\水壶2
在准备中,将时间戳字段添加到tt1和tt2表中,
由于tt1和tt2所在的数据库不同,因此请在两个数据库之间创建连接。
准备
水壶3
\执行此作业后,查询数据库时将看到以下字段:
\
水壶4
然后,让我们在tt1表上执行插入操作和更新操作
水壶5
无论是对原始表的插入操作还是更新操作,相应的updateTime都会更改。
如果tt1表和tt2表中的updateTime字段是最新时间,则表示该表是新表。
以下是与main_thread对应的屏幕截图:
水壶6
在这里介绍Main的级别:
主要
开始
Main.prepare
Main.main_thread
{
开始
main_thread.create_tempTable
main_thread.insert_tempTable
main_thread.tt1_tt2_syn
成功
}
Main.finish
成功
main_thread中的过程如下:
作为一个整体,使它每200s循环一次,
在这种情况下,如果存在与更新或插入对应的指定表tt1或tt2,
该表中的updateTime字段将被捕获并同步。
如果没有更新,则交换机的默认路由将对应于写入日志。
继续循环。
首先创建一个快照表,然后将tt1和tt2表中的最大(最新)时间戳值插入快照表中。
然后,通过转换来确定该表的最新updateTime值,
选择是否更新与tt1表对应的tt2或tt2表;
main_thread.create_tempTable.JOB:
main_thread.insert_tempTable.Job:
PS:对于第二个SQL,应该对其进行更改(如果不对其进行修改,那将是错误的)
set @ var1 =(从tt2中选择MAX(更新时间));
插入test.temp值(2,@ var1);
因为conn对应于连接到mysql(数据库实例名称),
但是我们将快照表和tt1表都保存在测试中(数据库实例名称)。
上图中的相应语句是要实现的,在temp表中插入两行记录元组。
与id为1的元组相对应的temp.lastTime字段是从tt1表中选择的最新updateTime值,
与id为2的元组相对应的temp.lastTime字段是最新字段,其最新时间是从tt2表中选择的。
当然,id用作后续开关操作的参考,并用于指示最新的updateTime来自tt1还是tt2,
您还可以使用tableName varchar(50)字段来存储与最新updateTime相对应的数据库。数据表的名称也是可以接受的。
main_thread.tt1_tt2_syn.Transformation:
首先,创建与测试数据库的临时表的连接,
在临时表中选择具有最新lastTime值的记录
相应的ID号。
首先以降序对temp中的lastTime字段进行排序,
然后选择id并将选择记录限制为仅一行。
然后根据id的值选择开关。
LZ想要在这里使用它,SQL Executor,
但是它不能返回相应的id值。
但是表输入可以返回相应的id值,
并由开关接收。
下图对应于开关id = 1:tt1更新tt2
注意选择比较合并行的新数据源和旧数据源
在”插入/更新”中选择目标表
下图是开关id = 2时的情况:tt2更新tt1
注意选择比较合并行的新数据源和旧数据源
在”插入/更新”中选择目标表。
但是考虑到添加一列会浪费很多空间,
因此,完成同步后,请使用完成操作步骤删除updateTime字段。
这对应于Main中的准备操作。
Main.finish
在这种情况下,已经建立了实验环境,
接下来,对实验数据进行测试并将其写入下一个博客。
\当然,触发器也是同步的好方法,将其写在后续博客中
与触发器相比,时间戳方法更简单,更通用,
但是,数据库表中的timestamp字段非常占用空间,无法删除,
即删除表中的一行记录,该表应用作新表来更新表的其余部分,但是由于记录删除时间戳没有依赖性,因此无法记录。