首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 連結伺服器存取 MySQL 完整實作指南:ODBC 驅動、DSN 設定、雙向查詢與腳本化部署

     編輯:關於SqlServer

環境與版本

  • 作業系統:Windows 7 / Server 2008 R2+
  • SQL Server:2005 / 2008 / 2012+
  • MySQL:5.0 / 5.5 / 5.7 / 8.0
  • 架構:64 位元作業系統 (關鍵:需安裝 64 位 ODBC 驅動)

步驟 1:安裝 MySQL ODBC 驅動 (64 位元)

  1. 下載:MySQL Connector/ODBC → 選擇 Windows (x86, 64-bit), MSI Installer。
  2. 執行安裝:一路 Next → Typical → Install → Finish。
  3. 驅動名稱範例:MySQL ODBC 8.0 Unicode Driver / MySQL ODBC 8.0 ANSI Driver。
    建議選 Unicode 版 (支援完整字符集),除非舊系統強制 ANSI。

MySQL ODBC 下載頁面

選擇驅動類型

步驟 2:建立系統 DSN (System Data Source)

  1. 控制台 → 系統管理工具 → ODBC 資料來源 (64 位元) (或輸入 odbcad32.exe)。
  2. 切換 系統 DSN 索引標籤 → 新增。
  3. 選擇 MySQL ODBC 8.0 Unicode Driver → 完成。
  4. 填寫設定:
    • Data Source Name:MySQL_Link (自訂,後續連結伺服器引用)
    • Description:選填
    • TCP/IP Server:MySQL 伺服器 IP (如 192.168.0.119)
    • Port:3306 (預設)
    • User:MySQL 帳號 (如 root)
    • Password:密碼
    • Database:預設資料庫 (如 asteriskcdrdb)
  5. 點擊 測試 → 顯示「連線成功」 → 確定。

ODBC 資料來源管理員

MySQL ODBC 設定

測試成功

DSN 建立完成

步驟 3:建立 SQL Server 連結伺服器

方法一:SSMS 圖形化

  1. 物件總管 → 伺服器物件 → 連結伺服器 → 右鍵 新增連結伺服器。
  2. 一般頁籤:
    • 連結伺服器:MYSQL_LINK (自動大寫)
    • 伺服器類型:其他資料來源
    • 提供者:Microsoft OLE DB Provider for ODBC Drivers (非 SQL Server 提供者!)
    • 產品名稱:MySQL (任意)
    • 資料來源:MySQL_Link (步驟 2 的 DSN 名稱)
    • 提供者字串/位置/目錄:留空
  3. 安全性頁籤:選擇 使用此安全性內容建立連接 → 輸入 MySQL 遠端登入帳號密碼 → 確定。

連結伺服器一般設定

安全性設定

連結伺服器建立完成

方法二:T-SQL 腳本化部署 (生產環境標準)

-- 刪除舊同名連結伺服器 (若存在)
IF EXISTS (SELECT * FROM sys.servers WHERE name = 'MYSQL_LINK2')
    EXEC sp_dropserver 'MYSQL_LINK2', 'droplogins';
GO

-- 建立連結伺服器
EXEC sp_addlinkedserver
    @server = 'MYSQL_LINK2',                    -- 連結伺服器名稱
    @srvproduct = 'MySQL',                      -- 產品名稱
    @provider = 'MSDASQL',                      -- 固定:OLE DB for ODBC
    @datasrc = NULL,
    @location = NULL,
    @provstr = 'DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=192.168.0.119;DATABASE=asteriskcdrdb;UID=root;PWD=root;PORT=3306;',
    @catalog = NULL;
GO

-- 設定遠端登入認證
EXEC sp_addlinkedsrvlogin
    @rmtsrvname = 'MYSQL_LINK2',
    @useself = 'FALSE',                         -- 不使用當前登入上下文
    @rmtuser = 'root',                          -- MySQL 遠端用戶
    @rmtpassword = 'root';                      -- MySQL 遠端密碼
GO

關鍵點:@provider='MSDASQL' 固定不變;@provstr 中 DRIVER={...} **必須與 ODBC 驅動名稱完全一致** (含大小寫、空格)。

步驟 4:查詢驗證與雙向操作

4.1 OPENQUERY (推薦:下推查詢到 MySQL 執行,效能最佳)

-- 查詢 MySQL 表
SELECT * FROM OPENQUERY(MYSQL_LINK, 'SELECT * FROM cdr_ex LIMIT 10');

-- 帶參數查詢 (需動態 SQL)
DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM OPENQUERY(MYSQL_LINK, ''SELECT * FROM cdr_ex WHERE calldate > ''''2024-01-01'''' '')';
EXEC sp_executesql @sql;

4.2 四部分命名 (方便但可能拉回全表再篩選)

SELECT * FROM MYSQL_LINK...asteriskcdrdb.cdr_ex;  -- 伺服器...目錄.結構.表
-- 注意:MySQL 無結構概念,中間以點號佔位

4.3 寫入操作 (INSERT/UPDATE/DELETE)

-- 透過 OPENQUERY 寫入
INSERT OPENQUERY(MYSQL_LINK, 'SELECT id, name FROM cdr_ex')
VALUES (999, 'Test From SQL Server');

-- 異質性交易 (分散式交易) 需啟用 MSDTC
BEGIN DISTRIBUTED TRANSACTION;
  INSERT INTO LocalTable ...;
  INSERT OPENQUERY(MYSQL_LINK, 'SELECT ...') VALUES (...);
COMMIT TRANSACTION;

常見問題排查

錯誤現象原因解決
「找不到提供者」/「無法初始化資料來源」安裝 32 位驅動但 SQL Server 為 64 位**必裝 64 位 ODBC 驅動**
「驅動程式的 SQLSetConnectAttr 失敗」DSN 設定錯誤 / 密碼含特殊字元檢查 DSN 測試、密碼用單引號包裹
中文亂碼使用 ANSI 驅動 / 字符集不匹配改用 Unicode 驅動、確認 MySQL character_set_server=utf8mb4
查詢極慢四部分命名拉回全表**改用 OPENQUERY 下推 WHERE 條件**
「啟用分散式交易失敗」MSDTC 服務未啟動/防火牆阻擋啟用 MSDTC、開放 135/動態埠

結語

SQL Server 透過 **ODBC → OLE DB (MSDASQL) → 連結伺服器** 橋接 MySQL,核心在於:64 位驅動 + 系統 DSN + MSDASQL 提供者 + OPENQUERY 下推查詢。將建立腳本納入版控與自動化部署,即可實現異構資料庫無縫整合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved