前言:
前一段时间,接到一个任务,要完成一个下属子公司要把所有的业务数据实时同步到集团的数据库中去。
数据流图如下:
第一章:愉快
由于下属子公司是用的sql server数据库。集团是oracle数据库。我第一个想到的就是使用微软的 事务复制 功能。
在公司里安装sql server 2005,oracle 10g,配置发布、订阅、分发、测试。由于事务复制 支持异构数据库,如oracle 。 在sql server 中做增删改操作,数据瞬间同步到oracle数据库中。一切进行的非常顺利。 微笑。。。。。。
第二章:深渊
在一次和客户的沟通中,客户提到了集团oracle 的字符集是 SIMPLIFIED CHINESE_CHINA.US7ASCII。赶紧修改参数,链接到该oracle数据库中。 再做测试,问题来了,对于中文的内容 同步到oracle 中全部出现了乱码。 汗~~~~
赶紧google。 噢,修改一下客户端的注册表 NLS_LANG = SIMPLIFIED CHINESE_CHINA.US7ASCII ,再测,涛声依旧。
赶紧和客户沟通,集团先装一台字符集为SIMPLIFIED CHINESE_CHINA.ZHS16GBK 的oracle数据库,先临时使用。找到解决方法后,在切换到 的字符集 为US7ASCII 的数据库中。 此问题先搁置下。
第三章:绝望
在公司我已经把 事务复制 的部署玩的很溜了,正好一个出差机会,我去一家集团下属的子公司部署该事务复制。
在现场链接上数据库,找到复制,右击新建,噔! 弹出一个提示框
Google一把,了解了,用计算机名登录,在新建,ok,这个框不提示了。但是,等等,等等,等等,等等,等等 客户这边做的双机热备, 两台计算机名称是不一样的,但ip地址虚拟了一个。 这可如何是好?
现在问题是 双机热备的两台电脑中,必有一台 无法配置 复制的发布功能。
网上 google 了好几天,也没有找到解决方案。 哭啊。。。。。。。
第四章:条条大路通罗马
看来微软的工具是指望不上了。现在只有一个解决方案,在业务库中的 每张表 都添加一个触发器,在做 delete,update 和insert 时,把表名,主键名称,主键值 操作类型等信息写进一张中间表中。然后做个console 程序,读取这中间表,就获得了 增量数据,再把这些数据 写进oracle 数据库。 最后,通过sql 的job 实现每天定时 执行。
这个机制运行了两个月,效果还不错。
第五章:老问题
读者也许有个疑惑,那字符集问题怎么解决的啊。 解决的方法是这样的。
1:修改客户端注册表。改为和服务端一样的字符集名称。
2:不要用 System.Data.Oracle 类集,改用System.Data.OleDb。 在链接字符串中 加入 provider=msdaora.1 (我使用c# 语音开发)
问题解决。
第五章:尾声
微软的复制功能,目前有两个局限
1:无法解决字符集问题。
2:无法解决双机热备问题。
我目前采用的方式,是在牺牲业务系统性能的基础上做的。是我能想到的最后一招。
还请各位有什么其它的方法,能不吝赐教啊。
也非常期待有哪位大侠能告诉我:其实微软的复制功能 能够解决这两个问题。