Pg2MSSQL是swish群主开发的一个可以同步PostgreSQL、MSSQL的工具软件,使用了我们熟悉的QWorker作为引擎,可以高效的并发执行数据库同步任务。
您可以到QDAC官方群或者本站下载页面找到Pg2MSSQL的下载地址,并免费使用部分功能。如果您觉得好用,可以和swish联系购买注册码。详细的注册信息和注册功能可以通过点击软件上的“注册”按钮查看。
下面我们先来看看软件的主界面吧:
嗯,废话不多说了,下面我们就来一步步的实现如何同步两个数据库。
【第一步】
首先,我们要设置好源数据库与目标数据库的地址、账号密码、数据库名称。嗯,就是上图的左上角部分。参考下图:
选择好库类型,填写完连接信息后,可以点击测试按钮,看见连接成功的提示说明设置正确。
源数据库和目标数据库,都可以是PostgreSQL或MSSQL,可以是相同类似的库,也可以是不同类型的库。
【第二步】
添加作业安排。也就是设置作业计划。我们可以为数据库同步设置多个步骤,还可以步骤放到到不同的分组。
通过点击“作业计划”中的“+”按钮,会出来一个popmenu,可以看到有“分组”和“步骤”两个菜单项,可以用来添加分组和步骤。分组只是为了将步骤归类,不影响任务的执行。我们可以给步骤分组,也可以不分组。步骤可以有一个,也可以有多个,具体多少,要看最终需要同步的数据。
我们先添加一个分组“测试”,再添加一个步骤“同步j_position_city表”。添加的时候输入名称后就可以点击“√”确定了。具体的任务内容,可以随时点击步骤树形列表修改。
嗯,添加了步骤,可以看到我们能给它指定同步方向,是源到目标呢,还是目标到源呢,都是可以的。设定好方向后,我们还需要给步骤编写相关的获取脚本和更新脚本。故名思义,获取脚本就是用来读取源数据库的;更新脚本就是用来在将数据源写入目标数据库时执行的。
我要读出源库中j_position_city表的所有行,写入目标库的position_city中。
现在我先写出获取脚本:
SELECT id
,province_id
,city_id
,city_name
FROM j_position_city
然后编写更新脚本:
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])
编写完脚本,一定要记得点击上面工具栏的“√”按钮保存修改。
从上面的脚本可以看出,和标准的SQL语句基本一样。但还是有所不同:
- 编写获取脚本时,字段名最好不要带[]号。
- 编写更新脚本时,要使用获取脚本返回的数据中某个字段的值时,需要用 [字段名] 的方式来写。
- 更新脚本中,一般需要判断是否更新成功,如果不成功,则需要插入新行。可以通过判断 @@rowcount 变量的方式来判断。
- 如碰到自增字段,则需要通过set identity_insert <表> on方式来插入以保持数据一致性。
- 脚本中还定义了一些宏(您可以在脚本中使用这些宏):
System.SessionId – 同步会话编码
System.Today – 返回按 yyyy-mm-dd 格式化的表示今天的字符串
System.Time – 返回当前时间(hh:nn:ss.zzz格式)
System.Now – 返回当前时间(含年月日)
System.Host – 执行同步的计算机名 - 字段内容是字符串需要加单引号时,使用 [字段名.Quoted] 即可。
我们在编写脚本的时候,还可以看到界面上有几个复选框:“不返回结果集”、“无记录时中断循环”、“忽略错误”,这些是什么意思?
- 不返回结果集: 就是单纯的执行脚本。比如删除一个表等等,并不会返回数据集,这时候就可以勾选它了。
- 无记录时中断循环: 当步骤所属分组,勾选了“重复执行”时,直到这个分组取不到需要同步的数据时,中止这个分组的执行。一个同步的分组就是一个循环。一般选中了分组“重复执行”时,需要勾选此项,否则可能永远不会执行下一步。
- 忽略错误:忽略任务中发生的错误。这个很好理解吧。
- 重复执行: 勾选后重复执行这个分组,否则只执行一次。但下次任务时间到达时,会再次执行。(仅分组中有此选项)
【第三步】
完成了脚本编写,我们还必须设置执行时间。
执行时间我们可以有多种方式。可以指定执行的月份、周、天、时、分、任意等等。
那么,我们想让上面的测试代码,在每周三的10:52分执行一次同步,应该怎么设置呢?
请看下图:
先勾选分组的重复执行项,再按上图勾选即可。
【第四步】
设置完成了。当然是点击“保存设置”了,以便将来打开时不再重复操作。
保存好后,可以点击一次“立即执行”查看执行效果,这样可以用来判断脚本是否错误,及时改正。当确定无误后,就可以启动计划,让它按我们设置的时间来执行任务了。
我们还可以点击“查看日志”来查看任务执行的情况。
当然,你别把这个工具关闭了。
【附言】
swish的一些使用建议(原话):
(群主)实际上,我的建议是同步的时候,先从目标数据库是获取末次同步的状态信息的
(群主)第一步:目标数据库->源数据库 作用:取末次的同步状态信息,然后写入到源数据库,以便后面的脚本使用。
写本地的话,一旦你换数据库就没法玩了
(小白)取数据时判断这些状态信息吗?
(群主)是呀,第二步同步的时候,源数据库就知道这次同步的信息了
(群主)常量 System.SessionId 用来唯一标记一次同步的
更多的问题,可以联系swish,即本站的boss来获取。^-6