因為業務需要要要實現 sqlserver和 mysql 異構數據庫 數據同步;起先一點思路都沒有,於是到網上一頓好找;
最后找到了2種解決方案:
1、利用第三方工具實現;
2、利用ODBC實現;
第一種測試結果不理想,弊端是:1、不穩定 2、出了問題不易定位3、不夠智能
最后采用了第二種ODBC來實現,運行了快1年沒有出過問題;今天共享出來以幫助其他朋友;
---安裝安裝mysqlconnector http://www.mysql.com/products/connector/ /* 配置mysqlconnector ODBC數據管理器->系統DSN->添加->mysql ODBC 5.3 ANSI driver->填入data source name如jt,mysql的ip、用戶名、密碼即可
--新建鏈接服務器
exec
sp_addlinkedserver
@server
=
'MySqll_Aggregation'
,
--ODBC里面data source name
@srvproduct
=
'MySql'
,
--自己隨便
@provider
=
'MSDASQL'
,
--固定這個
@datasrc
=NULL,
@location
=NULL,
@provstr
=
'DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=172.17.22.3;DATABASE=bi;UID=zhaowenzhong;PORT=3306;'
,
@catalog
=
NULL

---創建連接mysql數據庫的賬號及密碼
exec
sp_addlinkedsrvlogin
@rmtsrvname
=
'
MySqll_Aggregation
'
,
----
ODBC里面data source name
@useself
=
'false'
,
@rmtuser
=
'zhaowenzhong'
,
---mysql賬號
@rmtpassword
=
'mysqldba@2015'
;
--mysql賬號其密碼



---測試是否可以訪問mysql數據庫中的表
select
*
from
openquery
(
MySqll_Aggregation
,
'SELECT * FROM tb; '
)
-----建立允許遠程訪問連接操作
USE
[master]
GO
EXEC
master
.
dbo
.
sp_serveroption
@server
=
N'MySqll_Aggregation'
,
@optname
=
N'rpc out'
,
@optvalue
=
N'TRUE'
GO
EXEC
master
.
dbo
.
sp_serveroption
@server
=
N'MySqll_Aggregation'
,
@optname
=
N'remote proc transaction promotion'
,
@optvalue
=
N'false'
GO
--建立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
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
CREATE
PROCEDURE
SP_INSERT
@ID
INT
,
@QTY
INT
AS
BEGIN
SET
NOCOUNT
ON
INSERT
OPENQUERY
(
db_ty2015
,
'select * from tb'
)(
id
,
qty
)
values
(
@id
,
@qty
);
SET
NOCOUNT
OFF
END
---update
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
CREATE
PROCEDURE
SP_UPDATE
@ID
INT
,
@QTY
INT
AS
BEGIN
SET
NOCOUNT
ON
UPDATE
OPENQUERY
(
db_ty2015
,
'select * from tb'
)
set
qty
=
@qty
where
id
=
@id
SET
NOCOUNT
OFF
END
--delete
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
CREATE
PROCEDURE
SP_DELETE
@ID
INT
AS
BEGIN
SET
NOCOUNT
ON
DELETE
OPENQUERY
(
db_ty2015
,
'select * from tb'
)
where
id
=
@id
SET
NOCOUNT
OFF
END
-------初始化數據
表已存在的情況
insert
openquery
(
MySqll_Aggregation
,
'select * from bi.tb'
)
select
*
from
[FSLogin]
.
[dbo]
.
[tb]
with
(
nolock
)
---從mysql同步表結構及數據到sqlserver上(與本案例無關)
select
*
into
[SqlServerDBName]
.
dbo
.
tb
from
openquery
(
localmysql
,
'select * from mysqldbname.weibosession'
)