数据库在应用程序中是必不可少的部分,mysql是开源的,所以很多人它,mssql是微软的,用在windows平台上是非常方便的,所以也有很多人用它。现在问题来了,如何将这两个数据库同步,即数据内容保持完全一致。

MySQL Migration Toolkit是MySQL提供的开源GUI软件工具,可以针对Microsoft Access、Microsoft SQL Server、Oracle、MySQL、Sybase Server、MaxDB Database Server数据库向MySQL数据库迁移数据,这就解决了mssql同步到mysql的问题了;SQL Server迁移助手(SSMA)团队开发了针对MySQL的迁移助手Microsoft SQL Server Migration Assistant 2008 for MySQL。微软同时发布了其他三个迁移助手: SSMA for Access, SSMA for Oracle, and SSMA for Sybase (all v4.2),所以它可以解决mysql到mssql的问题,方法详见:MySQL到MsSQL的迁移工具——SSMA,实现了,结束。

……

开个玩笑,上面说的工具非常好用,可以留着备用。现在才是真正的问题:如何将这两个数据库实时同步(mysql到mssql),即数据内容实时保持完全一致。说白了,就是mysql插入(或修改、删除)一条记录,mssql也跟着同时插入(或修改、删除)该条记录,实时同步,不得有误。

问题

所谓mysql到mssql的实时同步数据。其要求是:

(1)当mysql数据库中插入一条记录,mssql数据库也同时插入对应记录;

(2)当mysql数据库中更新某些记录,mssql数据库也同时更新对应记录;

(3)当mysql数据库中删除某条记录,mssql数据库也同时删除对应记录;

这些记录变更的时间和方式都是随机的,不确定的,所以需要随时监测它的变化。同时,如下约定:

A.    在数据库同步之前,mysql和mssql数据库结构和内容完全一致;

B.    只对数据进行插入、更新和删除操作,不更改主键和结构。

分析

要实现数据库实时同步,解决方案一般有三种:一是编写程序来操作两个数据库,先将目标数据库删除,再根据原数据库进行重新生成目标数据库,但这种方法对于数据量大的数据库操作显然不可行;二是使用SQL中的触发器、存储过程和定时作业来完成实时同步;三是借助第三方的软件,如SyncNavigator,但综合经济性、稳定性和易维护性等因素,此方案慎用。

实现

(1)新建mysql临时和mssql临时数据库,数据结构与对应正式数据库相当,仅在每一个表中增加新字段OpType(用于记录数据修改的操作方式);

(2)在mysql数据库中建立触发器,作用是当mysql数据库中更改,mysql临时数据库相应表生成相应记录,并记录OpType字段(I表示插入记录,U表示修改记录,D表示删除记录);

(3)新建mysql临时数据库与mssql临时数据库之间的连接;

(4)在mssql临时数据库新建存储过程,当执行存储过程时,更新mssql临时数据库的内容,使之与mysql临时数据库内容完全一致,同时删除mysql临时数据库的内容;

(5)新建定时作业,定时调用mssql临时数据库中的存储过程;

(6)在mssql临时数据库建立触发器,根据OpType字段类型,更新mssql数据库的内容,同时删除mssql临时数据库的内容。

至此,实现了mysql数据库到mssql数据库的实时同步,其中,mysql临时数据库和mssql临时数据库只是过程数据,在同步完成后,数据表中的记录将被删除。这里所谓的实时,还取决于mssql中定时作业的计划。

Mssql连接mysql的方法

EXEC sp_addlinkedserver
@server = 'MySQL',
@srvproduct='MySql' ,
@provider = 'MSDASQL',
@provstr = 'Driver={MySQL ODBC 5.2 UNICODE Driver};
Server=localhost;
Database=mysql_temp;
User=root;
Password=****;
Option=3;'

  增加权限:

EXEC sp_addlinkedsrvlogin
@rmtsrvname='MySql' ,
@useself='false' ,
@locallogin='sa' ,
@rmtuser='root' ,
@rmtpassword='****'

  优化

由于实际数据库可能在极短时间内对一条记录进行多次频繁更新,为防止同步错误,可以两张临时表中再建立状态字段(IsUpdate)。具体操作方法:

(1)当mysql修改记录时,触发的mysql_temp表中的IsUpdate字段值标记为0;

(2)当存储过程调用时,将mysql_temp表中更新到mssql_temp的同时,将mysql_temp表中的IsUpdate字段值标记为1,并删除值为1的记录;(先更新值,再复制,最后删除,下同。)

(3)mssql_temp触发器运行时,除了将mssql_temp的记录更新到mssql外,还将删除mssql_temp表中IsUpdate字段值标记为2,并删除值为2的记录。

这样,可达到两个效果:一是更新永远是实时同步,不会有误;二是可减少存储过程的调用频率,可节省资源。

参考:

http://blog.csdn.net/orichisonic/article/details/46557965

http://blog.csdn.net/orichisonic/article/details/46557835

mysql实时同步到mssql的解决方案的更多相关文章

  1. 深入解析Mysql 主从同步延迟原理及解决方案

    MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以 ...

  2. 谈谈Mysql主从同步延迟分析及解决方案

    一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 lo ...

  3. mysql数据实时同步到Elasticsearch

    业务需要把mysql的数据实时同步到ES,实现低延迟的检索到ES中的数据或者进行其它数据分析处理.本文给出以同步mysql binlog的方式实时同步数据到ES的思路, 实践并验证该方式的可行性,以供 ...

  4. ClickHouse和他的朋友们(9)MySQL实时复制与实现

    本文转自我司大神 BohuTANG的博客 . 很多人看到标题还以为自己走错了夜场,其实没有. ClickHouse 可以挂载为 MySQL 的一个从库 ,先全量再增量的实时同步 MySQL 数据,这个 ...

  5. logstash-input-jdbc实现mysql 与elasticsearch实时同步(ES与关系型数据库同步)

    引言: elasticsearch 的出现使得我们的存储.检索数据更快捷.方便.但很多情况下,我们的需求是:现在的数据存储在mysql.oracle等关系型传统数据库中,如何尽量不改变原有数据库表结构 ...

  6. 【转】美团 MySQL 数据实时同步到 Hive 的架构与实践

    文章转载自公众号  美团技术团队 , 作者 萌萌 背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的 ...

  7. canal整合springboot实现mysql数据实时同步到redis

    业务场景: 项目里需要频繁的查询mysql导致mysql的压力太大,此时考虑从内存型数据库redis里查询,但是管理平台里会较为频繁的修改增加mysql里的数据 问题来了: 如何才能保证mysql的数 ...

  8. 几篇关于MySQL数据同步到Elasticsearch的文章---第五篇:logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解

    文章转载自: https://blog.csdn.net/laoyang360/article/details/51747266 引言: elasticsearch 的出现使得我们的存储.检索数据更快 ...

  9. 几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88 ...

随机推荐

  1. php网页切图/js切图

    PhantomJS抓取网站页面信息以及网站截图 http://phantomjs.org/download.html PHP imagegrabscreen和imagegrabwindow(截取网站缩 ...

  2. Codeforces Round #236 (Div. 2) C. Searching for Graph(水构造)

    题目大意 我们说一个无向图是 p-interesting 当且仅当这个无向图满足如下条件: 1. 该图恰有 2 * n + p 条边 2. 该图没有自环和重边 3. 该图的任意一个包含 k 个节点的子 ...

  3. net组件转化成COM组件

    第一步:生成秘钥文件 强名称工具 (Sn.exe) 有助于使用强名称对程序集进行签名.Sn.exe 提供了用于密钥管理.签名生成和签名验证的选项. 1.使用Visual Studio 命令 Visua ...

  4. css3背景颜色渐变

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  5. 回归 从注释开始 appledoc

    好久没有管理这个blog了,些许空虚.不知道今天的回归能否坚持.简单介绍一个第三方注释 -- appledoc appledoc http://gentlebytes.com/appledoc/ 安装 ...

  6. NGUI 界面自适应

    关于 NGUI 的界面自动适应不同的手机分辨率,网上已经够多的了.如果你点进了这个网页,推荐一下这一篇吧: http://www.xuanyusong.com/archives/2536 下面是我自己 ...

  7. java io系列01之 "目录"

    java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...

  8. Hadoop第9周练习—Hive部署测试(含MySql部署)

    1.1 2 :搭建Hive环境 内容 2.2 3  运行环境说明 1.1  硬软件环境 线程,主频2.2G,6G内存 l  虚拟软件:VMware® Workstation 9.0.0 build-8 ...

  9. Direct3D11学习:(一)开发环境配置

    转载请注明出处:http://www.cnblogs.com/Ray1024   从今天开始,开启一个新的系列:Direct3D11的学习教程. 因为一直对3D方面比较感兴趣,最近决定开始学习D3D知 ...

  10. js关于对象键值为数字型时输出的对象自动排序问题的解决方法

    一.对象键值为数字型时输出的对象自动排序问题如: var objs = {    "1603":{id:"1603"},    "1702" ...