萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 即時同步資料至 MySQL:連結伺服器 + 觸發器 + 迴環完整實作

架構概覽

SQL Server (來源) → 連結伺服器 (MySQL ODBC) → 觸發器 → 迴環連結伺服器 → 預存程序 → 寫入 MySQL。

1. 安裝 MySQL ODBC Driver 並建立系統 DSN

  • 下載 MySQL Connector/ODBC 5.3 (ANSI/Unicode 均可)。
  • ODBC 資料來源管理員 → 系統 DSN → 新增 → 選 MySQL ODBC 5.3 ANSI Driver。
  • Data Source Name: jt,填入 MySQL IP、Port、Database、UID、PWD。

2. 建立連結伺服器

EXEC sp_addlinkedserver 
  @server='jt', @srvproduct='mysql', @provider='MSDASQL',
  @datasrc=NULL, @location=NULL,
  @provstr='DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=192.168.5.188;DATABASE=suzhou;UID=root;PORT=3306;',
  @catalog=NULL;

EXEC sp_addlinkedsrvlogin @rmtsrvname='jt', @useself='false', @rmtuser='root', @rmtpassword='password';

-- 允許 RPC 輸出、關閉分散式交易提升
EXEC sp_serveroption @server='jt', @optname='rpc out', @optvalue='TRUE';
EXEC sp_serveroption @server='jt', @optname='remote proc transaction promotion', @optvalue='FALSE';

3. 建立迴環連結伺服器 (Loopback)

EXEC sp_addlinkedserver @server=N'loopback', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=@@SERVERNAME;
EXEC sp_serveroption @server='loopback', @optname='rpc out', @optvalue='TRUE';
EXEC sp_serveroption @server='loopback', @optname='remote proc transaction promotion', @optvalue='FALSE';

4. 建立來源/目標資料表

-- SQL Server
CREATE DATABASE suzhou;
CREATE TABLE sz (
  id INT IDENTITY(1,1) PRIMARY KEY,
  orderno CHAR(20) NOT NULL,
  ordertime DATETIME NOT NULL DEFAULT GETDATE(),
  remark VARCHAR(200)
);

-- MySQL
CREATE TABLE sz (
  id INT(11) NOT NULL,
  orderno CHAR(20) NOT NULL,
  ordertime DATETIME(6) NOT NULL,
  remark VARCHAR(200),
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

5. 觸發器 + 預存程序實作 (INSERT/UPDATE/DELETE)

-- INSERT 觸發器
CREATE TRIGGER tr_insert_sz ON suzhou.dbo.sz FOR INSERT AS
BEGIN
  DECLARE @id INT, @orderno CHAR(20), @ordertime DATETIME, @remark VARCHAR(200);
  SELECT @id=id, @orderno=orderno, @ordertime=ordertime, @remark=remark FROM inserted;
  EXEC loopback.suzhou.dbo.sp_insert @id, @orderno, @ordertime, @remark;
END;

-- INSERT 預存程序
CREATE PROCEDURE sp_insert @id INT, @orderno CHAR(20), @ordertime DATETIME, @remark VARCHAR(200) AS
BEGIN
  SET NOCOUNT ON;
  INSERT OPENQUERY(jt, 'SELECT * FROM sz') (id, orderno, ordertime, remark)
  VALUES (@id, @orderno, @ordertime, @remark);
END;

-- UPDATE/DELETE 同理,略

6. 測試驗證

USE suzhou;
INSERT INTO sz (orderno, remark) VALUES ('a001', 'test');
UPDATE sz SET remark='ocpyang' WHERE orderno='a001';
DELETE FROM sz WHERE orderno='a001';

檢查 MySQL 端資料是否同步。

注意事項

  • 需開啟 SQL Server 「Ad Hoc Distributed Queries」:sp_configure 'show advanced options',1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries',1; RECONFIGURE;
  • 大量資料同步建議改用 CDC / SSIS / Debezium 等成熟方案,觸發器模式有效能上限。
copyright © 萬盛學電腦網 all rights reserved