MySQL의 실시간 동기화에 SQL 서버 데이터

동기화의 전제 아래, 환경 테스트가 버그 MySQL 설치의 번호에 여러 번 실패 연결되어야 할 때, 무대를 설정하고 다시 설치해야합니다

--- 설치 mysqlconnector

http://www.mysql.com/products/connector/      현재 버전 8.0은 이미입니다

----- 구성 mysqlconnector

ODBC 데이터 관리자 -> 시스템 DSN-> 추가 -> MySQL의 ODBC 5.3 ANSI 드라이버 -> JT 데이터 소스 이름으로 채워진 IP MySQL은, 사용자 이름, 암호

- 새 연결된 서버

간부 sp_addlinkedserver를

@ 서버 = 'MySqll_Aggregation는'- 커넥터 ODBC 데이터 소스 이름은 내부에 채워진

@ Srvproduct = 'MySQL을'- 자신의 캐주얼

@ 제공 = 'MSDASQL', - 고정

@ DATASRC = 'MySqll_Aggregation'---- ODBC 里面 데이터 소스 이름

@ 위치 = NULL,

- @ provstr = 'DRIVER = { MySQL의 ODBC 8.0 ANSI 드라이버}; SERVER = 127.0.0.1; DATABASE = mysql을; UID = 루트 = 3306 PORT;', // 커넥터 ODBC 구성 내용에 해당하는     이 구성의 @datasrc 모두 구성이 필요합니다

@ 카탈로그 = NULL

 

문을 실행

--- 연결 MySQL 데이터베이스 계정과 암호를 만들

간부 인 sp_addlinkedsrvlogin을

@rmtsrvname='MySqll_Aggregation',----ODBC里面data source name

@useself='false',

@rmtuser='root',---mysql账号

@rmtpassword='root';--mysql账号密码

执行语句

刷新对象资源管理器中的链接服务器,能看到的Connector ODBC里面填的data source name内容,目录下对应的是mysql里的数据库

在本地SQLSERVER数据库里建一张表(TB),在本地mysql数据库里建张表(tb),同步需要的,表结构一样(测试时的字段为id,qty

---测试是否可以访问mysql数据库中的表

select * from openquery(MySqll_Aggregation,'SELECT * FROM tb; ')

//tb 是本地数据库mysql里面的测试表

成功的结果如下:(tb表内的状态)

执行下面的语句

--建立LOOPBACK 服务器链接

EXEC sp_addlinkedserver@server=N'loopback',@srvproduct=N' ',@provider=N'SQLNCLI',

@datasrc=@@SERVERNAME

go

--设置服务器链接选项,阻止SQL Server 由于远过程调用而将本地事务提升为分布事务(重点)

USE [master]

GO

EXEC master.dbo.sp_serveroption@server=N'loopback',@optname=N'rpc out',@optvalue=N'TRUE'

GO

EXEC master.dbo.sp_serveroption@server=N'loopback',@optname=N'remote proc transaction promotion',@optvalue=N'false'

GO

 

---编写触发器和存储过程

--insert

新建单独查询窗口,否则会报错导致失败

CREATE PROCEDURE SP_INSERT

@ID INT,

@QTY INT

AS

BEGIN

                SET NOCOUNT ON

                                INSERT OPENQUERY(MySqll_Aggregation, 'select * from tb')(id,qty) values (@id,@qty);

                SET NOCOUNT OFF

END

 

创建另一查询窗口

db_ty2015是SQL SERVER里同步的表TB的所在数据库

CREATE TRIGGER TR_INSERT_TB ON  DB_TY2015.DBO.TB

FOR INSERT

AS

DECLARE @ID INT,

                                @QTY INT

                                SELECT @ID=ID, @QTY=QTY FROM INSERTED;

                                BEGIN

                                                EXEC loopback.db_ty2015.dbo.sp_insert  @id, @qty;

                                END

 

---update

单独查询窗口

CREATE PROCEDURE SP_UPDATE

@ID INT,

@QTY INT

AS

BEGIN

                SET NOCOUNT ON

                                UPDATE OPENQUERY(MySqll_Aggregation,'select * from tb') SET 

qty = @qty WHERE id=@id

                SET NOCOUNT OFF

END

 

 

CREATE TRIGGER  TR_UPDATE_TB ON DB_TY2015.DBO.TB

FOR UPDATE

AS

DECLARE  @ID INT, @QTY INT

SELECT @ID=ID, @QTY=QTY FROM INSERTED;

BEGIN

                EXEC  loopback.db_ty2015.dbo.sp_update  @id,  @qty;

END

 

--delete

CREATE PROCEDURE SP_DELETE

@ID INT

AS

BEGIN

                SET NOCOUNT ON

                                DELETE OPENQUERY(MySqll_Aggregation,'select * from tb') WHERE id=@id

                SET NOCOUNT OFF

END

 

CREATE TRIGGER TR_DELETE_TB ON DB_TY2015.DBO.TB

FOR DELETE

AS


 

                DECLARE @ID INT

                SELECT@ID=ID FROM DELETED;

BEGIN

                EXEC loopback.db_ty2015.dbo.sp_DELETE@id;

END

 

执行完增删改之后都能在mysql的表里看到结果

 

---从mysql同步表结构及数据到sqlserver上

测试语句

select * into  [DB_TY2015].[dbo].[tb3]  from   openquery([MySqll_Aggregation],'select * from mysql.tb')

tb3是创建的一张空表,执行完后表结构变成了tb的,表数据也复制过来了

 

-------初始化数据     表已存在的情况

INSERT OPENQUERY([MySqll_Aggregation],'select * from tb')(id,qty) select*from [DB_TY2015].[dbo].[tb3]with(nolock)

추천

출처www.cnblogs.com/HKROnline-SyncNavigator/p/10971747.html