[技巧] Pg2MSSQL数据同步工具简介

Pg2MSSQL是swish群主开发的一个可以同步PostgreSQL、MSSQL的工具软件,使用了我们熟悉的QWorker作为引擎,可以高效的并发执行数据库同步任务。

您可以到QDAC官方群或者本站下载页面找到Pg2MSSQL的下载地址,并免费使用部分功能。如果您觉得好用,可以和swish联系购买注册码。详细的注册信息和注册功能可以通过点击软件上的“注册”按钮查看。

下面我们先来看看软件的主界面吧:

001

嗯,废话不多说了,下面我们就来一步步的实现如何同步两个数据库。

【第一步】

首先,我们要设置好源数据库与目标数据库的地址、账号密码、数据库名称。嗯,就是上图的左上角部分。参考下图:

QQ截图20160106094640

选择好库类型,填写完连接信息后,可以点击测试按钮,看见连接成功的提示说明设置正确。

源数据库和目标数据库,都可以是PostgreSQL或MSSQL,可以是相同类似的库,也可以是不同类型的库。

 

【第二步】

添加作业安排。也就是设置作业计划。我们可以为数据库同步设置多个步骤,还可以步骤放到到不同的分组。

通过点击“作业计划”中的“+”按钮,会出来一个popmenu,可以看到有“分组”和“步骤”两个菜单项,可以用来添加分组和步骤。分组只是为了将步骤归类,不影响任务的执行。我们可以给步骤分组,也可以不分组。步骤可以有一个,也可以有多个,具体多少,要看最终需要同步的数据。

我们先添加一个分组“测试”,再添加一个步骤“同步j_position_city表”。添加的时候输入名称后就可以点击“√”确定了。具体的任务内容,可以随时点击步骤树形列表修改。

QQ截图20160106095633

嗯,添加了步骤,可以看到我们能给它指定同步方向,是源到目标呢,还是目标到源呢,都是可以的。设定好方向后,我们还需要给步骤编写相关的获取脚本和更新脚本。故名思义,获取脚本就是用来读取源数据库的;更新脚本就是用来在将数据源写入目标数据库时执行的。

我要读出源库中j_position_city表的所有行,写入目标库的position_city中。

现在我先写出获取脚本:

SELECT id
,province_id
,city_id
,city_name
FROM j_position_city

QQ截图20160106100618

然后编写更新脚本:

Update position_city
set
province_id=[province_id],
city_id=[city_id],
city_name=[city_name.Quoted]
where id=[id]
if @@rowcount=0
INSERT INTO position_city (id, province_id, city_id, city_name) VALUES ([id], [province_id], [city_id], [city_name.Quoted])

QQ截图20160106101713

编写完脚本,一定要记得点击上面工具栏的“√”按钮保存修改。

从上面的脚本可以看出,和标准的SQL语句基本一样。但还是有所不同:

  1. 编写获取脚本时,字段名最好不要带[]号。
  2. 编写更新脚本时,要使用获取脚本返回的数据中某个字段的值时,需要用 [字段名] 的方式来写。
  3. 更新脚本中,一般需要判断是否更新成功,如果不成功,则需要插入新行。可以通过判断 @@rowcount 变量的方式来判断。
  4. 如碰到自增字段,则需要通过set identity_insert <表> on方式来插入以保持数据一致性。
  5. 脚本中还定义了一些宏(您可以在脚本中使用这些宏):
    System.SessionId – 同步会话编码
    System.Today – 返回按 yyyy-mm-dd 格式化的表示今天的字符串
    System.Time – 返回当前时间(hh:nn:ss.zzz格式)
    System.Now – 返回当前时间(含年月日)
    System.Host – 执行同步的计算机名
  6. 字段内容是字符串需要加单引号时,使用 [字段名.Quoted] 即可。

 

我们在编写脚本的时候,还可以看到界面上有几个复选框:“不返回结果集”、“无记录时中断循环”、“忽略错误”,这些是什么意思?

  • 不返回结果集: 就是单纯的执行脚本。比如删除一个表等等,并不会返回数据集,这时候就可以勾选它了。
  • 无记录时中断循环: 当步骤所属分组,勾选了“重复执行”时,直到这个分组取不到需要同步的数据时,中止这个分组的执行。一个同步的分组就是一个循环。一般选中了分组“重复执行”时,需要勾选此项,否则可能永远不会执行下一步。
  • 忽略错误:忽略任务中发生的错误。这个很好理解吧。
  • 重复执行: 勾选后重复执行这个分组,否则只执行一次。但下次任务时间到达时,会再次执行。(仅分组中有此选项)

 

【第三步】

完成了脚本编写,我们还必须设置执行时间。

执行时间我们可以有多种方式。可以指定执行的月份、周、天、时、分、任意等等。

那么,我们想让上面的测试代码,在每周三的10:52分执行一次同步,应该怎么设置呢?

请看下图:

QQ截图20160106104809

QQ截图20160106104842

先勾选分组的重复执行项,再按上图勾选即可。

 

【第四步】

设置完成了。当然是点击“保存设置”了,以便将来打开时不再重复操作。

保存好后,可以点击一次“立即执行”查看执行效果,这样可以用来判断脚本是否错误,及时改正。当确定无误后,就可以启动计划,让它按我们设置的时间来执行任务了。

我们还可以点击“查看日志”来查看任务执行的情况。

QQ截图20160106111301

当然,你别把这个工具关闭了。

 

【附言】

swish的一些使用建议(原话):

(群主)实际上,我的建议是同步的时候,先从目标数据库是获取末次同步的状态信息的

(群主)第一步:目标数据库->源数据库 作用:取末次的同步状态信息,然后写入到源数据库,以便后面的脚本使用。

写本地的话,一旦你换数据库就没法玩了

(小白)取数据时判断这些状态信息吗?

(群主)是呀,第二步同步的时候,源数据库就知道这次同步的信息了

(群主)常量 System.SessionId 用来唯一标记一次同步的

 

更多的问题,可以联系swish,即本站的boss来获取。^-6

 

滚动至顶部