您的位置:首页 > 数据库 > MySQL

SqlServer实时数据同步到mysql

2016-01-28 11:04 716 查看
因为业务需要要要实现sqlserver和mysql异构数据库数据同步;起先一点思路都没有,于是到网上一顿好找;

最后找到了2种解决方案:

1、利用第三方工具实现;

2、利用ODBC实现;

第一种测试结果不理想,弊端是:1、不稳定2、出了问题不易定位3、不够智能

最后采用了第二种ODBC来实现,运行了快1年没有出过问题;今天共享出来以帮助其他朋友;

---安装安装mysqlconnectorhttp://www.mysql.com/products/connector//*
配置mysqlconnector

ODBC数据管理器->系统DSN->添加->mysqlODBC5.3ANSIdriver->填入datasourcename如jt,mysql的ip、用户名、密码即可


[align=left]--新建链接服务器[/align]


[align=left]execsp_addlinkedserver[/align]
[align=left]@server='MySqll_Aggregation',--ODBC里面datasourcename[/align]
[align=left]@srvproduct='MySql',--自己随便[/align]
[align=left]@provider='MSDASQL',--固定这个[/align]
[align=left]@datasrc=NULL,[/align]
[align=left]@location=NULL,[/align]
[align=left]@provstr='DRIVER={MySQLODBC5.3ANSIDriver};SERVER=172.17.22.3;DATABASE=bi;UID=zhaowenzhong;PORT=3306;',[/align]


[align=left]@catalog=NULL[/align]



[align=left]---创建连接mysql数据库的账号及密码[/align]

[align=left]execsp_addlinkedsrvlogin[/align]

[align=left]@rmtsrvname='MySqll_Aggregation',----ODBC里面datasourcename[/align]

[align=left]@useself='false',[/align]

[align=left]@rmtuser='zhaowenzhong',---mysql账号[/align]
[align=left]@rmtpassword='mysqldba@2015';--mysql账号其密码[/align]



[align=left][/align]





[align=left]---测试是否可以访问mysql数据库中的表[/align]
[align=left]select*fromopenquery(MySqll_Aggregation,'SELECT*FROMtb;')[/align]
[align=left]-----建立允许远程访问连接操作[/align]
[align=left]USE[master][/align]
[align=left]GO[/align]

[align=left]EXECmaster.dbo.sp_serveroption@server=N'MySqll_Aggregation',@optname=N'rpcout',@optvalue=N'TRUE'[/align]
[align=left]GO[/align]
[align=left]EXECmaster.dbo.sp_serveroption@server=N'MySqll_Aggregation',@optname=N'remoteproctransactionpromotion',@optvalue=N'false'[/align]
[align=left]GO[/align]

[align=left][/align]
[align=left]--建立LOOPBACK服务器链接[/align]
[align=left]EXECsp_addlinkedserver@server=N'loopback',@srvproduct=N'',@provider=N'SQLNCLI',[/align]
[align=left]@datasrc=@@SERVERNAME[/align]
[align=left]go[/align]
[align=left]--设置服务器链接选项,阻止SQLServer由于远过程调用而将本地事务提升为分布事务(重点)[/align]
[align=left]USE[master][/align]
[align=left]GO[/align]
[align=left]EXECmaster.dbo.sp_serveroption@server=N'loopback',@optname=N'rpcout',@optvalue=N'TRUE'[/align]
[align=left]GO[/align]
[align=left]EXECmaster.dbo.sp_serveroption@server=N'loopback',@optname=N'remoteproctransactionpromotion',@optvalue=N'false'[/align]
[align=left]GO[/align]
[align=left]---编写触发器和存储过程[/align]
[align=left]--insert[/align]
[align=left]CREATETRIGGERTR_INSERT_TBONDB_TY2015.DBO.TB[/align]
[align=left]FORINSERT[/align]
[align=left]AS[/align]
[align=left]DECLARE@IDINT,[/align]
[align=left]@QTYINT[/align]
[align=left]SELECT@ID=ID,@QTY=QTYFROMINSERTED;[/align]
[align=left]BEGIN[/align]
[align=left]EXECloopback.db_ty2015.dbo.sp_insert@id,@qty;[/align]
[align=left]END[/align]
[align=left]CREATEPROCEDURESP_INSERT[/align]
[align=left]@IDINT,[/align]
[align=left]@QTYINT[/align]
[align=left]AS[/align]
[align=left]BEGIN[/align]
[align=left]SETNOCOUNTON[/align]
[align=left]INSERTOPENQUERY(db_ty2015,'select*fromtb')(id,qty)values(@id,@qty);[/align]
[align=left]SETNOCOUNTOFF[/align]
[align=left]END[/align]
[align=left][/align]
[align=left]---update[/align]
[align=left]CREATETRIGGERTR_UPDATE_TBONDB_TY2015.DBO.TB[/align]
[align=left]FORUPDATE[/align]
[align=left]AS[/align]
[align=left]DECLARE@IDINT,@QTYINT[/align]
[align=left]SELECT@ID=ID,@QTY=QTYFROMINSERTED;[/align]
[align=left]BEGIN[/align]
[align=left]EXECloopback.db_ty2015.dbo.sp_update@id,@qty;[/align]
[align=left]END[/align]
[align=left][/align]
[align=left]CREATEPROCEDURESP_UPDATE[/align]
[align=left]@IDINT,[/align]
[align=left]@QTYINT[/align]
[align=left]AS[/align]
[align=left]BEGIN[/align]
[align=left]SETNOCOUNTON[/align]
[align=left]UPDATEOPENQUERY(db_ty2015,'select*fromtb')setqty=@qtywhereid=@id[/align]
[align=left]SETNOCOUNTOFF[/align]
[align=left]END[/align]
[align=left][/align]
[align=left]--delete[/align]
[align=left]CREATETRIGGERTR_DELETE_TBONDB_TY2015.DBO.TB[/align]
[align=left]FORDELETE[/align]
[align=left]AS[/align]
[align=left][/align]
[align=left]DECLARE@IDINT[/align]
[align=left]SELECT@ID=IDFROMDELETED;[/align]
[align=left]BEGIN[/align]
[align=left]EXECloopback.db_ty2015.dbo.sp_DELETE@id;[/align]
[align=left]END[/align]
[align=left][/align]
[align=left]CREATEPROCEDURESP_DELETE[/align]
[align=left]@IDINT[/align]
[align=left]AS[/align]
[align=left]BEGIN[/align]
[align=left]SETNOCOUNTON[/align]
[align=left]DELETEOPENQUERY(db_ty2015,'select*fromtb')whereid=@id[/align]
[align=left]SETNOCOUNTOFF[/align]
[align=left]END[/align]
[align=left][/align]
[align=left]-------初始化数据表已存在的情况[/align]
[align=left]insertopenquery(MySqll_Aggregation,'select*frombi.tb')select*from[FSLogin].[dbo].[tb]with(nolock)[/align]
[align=left][/align]

[align=left]---从mysql同步表结构及数据到sqlserver上(与本案例无关)[/align]

[align=left]select*into[SqlServerDBName].dbo.tbfromopenquery(localmysql,'select*frommysqldbname.weibosession')[/align]

[align=left][/align]


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: