首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 資料遷移至 SQL Server 完整實戰:Linked Server + OPENQUERY 方案

     編輯:MySQL 資料庫相關知識

架構概覽

利用 SQL Server Linked Server (連結伺服器) 機制,透過 MySQL ODBC 驅動建立異構資料來源連線,再使用 OPENQUERY 或四部分命名查詢/匯入資料。

一、前置作業:安裝 MySQL ODBC 驅動

  1. 下載 MySQL Connector/ODBC 5.1+** (對應作業系統位元數):
    https://dev.mysql.com/downloads/connector/odbc/
  2. 執行安裝,選擇 Unicode 驅動 (支援中文)
  3. 驗證:C:\Windows\System32\odbcad32.exe (64位) 或 C:\Windows\SysWOW64\odbcad32.exe (32位) 中出現 "MySQL ODBC 5.1 Driver"
  4. 二、建立系統 DSN (資料來源名稱)

    1. 開啟 ODBC 資料來源管理員 (64位) → 系統 DSN → 新增
    2. 選擇 MySQL ODBC 5.1 Unicode Driver
    3. 填寫連線資訊:

    點擊 Test 確認連線成功,儲存 DSN。

    三、在 SQL Server 建立 Linked Server

    方法一:T-SQL 指令 (推薦,可腳本化、版控)

    EXEC master.dbo.sp_addlinkedserver
        @server = N'MySQL_Server',           -- 連結伺服器名稱 (自訂)
        @srvproduct = N'MySQL',              -- 產品名稱 (任意)
        @provider = N'MSDASQL',              -- OLE DB Provider for ODBC (固定)
        @datasrc = N'MySQL_Lenovo',          -- **剛建立的系統 DSN 名稱**
        @provstr = N'DRIVER={MySQL ODBC 5.1 Unicode Driver};SERVER=10.13.216.125;DATABASE=lenovoms;UID=lenovoms;PWD=your_password;OPTION=3';
    

    方法二:SSMS 圖形化介面 (僅供參考,Windows Server 2012+ 常失敗)

    1. 物件總管 → 伺服器物件 → 連結伺服器 → 右鍵「新增連結伺服器」
    2. 一般頁面:名稱=MySQL_Server、伺服器類型=其他資料來源、提供者=Microsoft OLE DB Provider for ODBC Drivers、資料來源=MySQL_Lenovo
    3. 安全性頁面:建立對應、遠端登入/密碼填 MySQL 帳密
    ⚠ 重要:Windows Server 2012/2016/2019 圖形化建立常報錯「提供者未註冊」。**請務必使用 T-SQL 指令方式**,穩定可靠。

    四、查詢與匯入資料實戰

    1. 測試連線查詢

    -- 使用 OPENQUERY (推薦:在遠端執行,減少網路傳輸)
    SELECT * FROM OPENQUERY(MySQL_Server, 'SELECT * FROM lenovoms.ms_knowledge LIMIT 0, 2');
    

    2. 將 MySQL 整張表匯入 SQL Server

    -- 建立新表並匯入 (SELECT INTO)
    SELECT * INTO LenovoBYD.dbo.ms_knowledge_migrated
    FROM OPENQUERY(MySQL_Server, 'SELECT * FROM lenovoms.ms_knowledge');
    
    -- 或匯入既有表 (INSERT INTO)
    INSERT INTO LenovoBYD.dbo.ms_knowledge_target (col1, col2, col3)
    SELECT col1, col2, col3
    FROM OPENQUERY(MySQL_Server, 'SELECT col1, col2, col3 FROM lenovoms.ms_knowledge');
    

    3. 參數化查詢 (防注入、計畫重用)

    DECLARE @sql NVARCHAR(MAX), @id INT = 100;
    SET @sql = 'SELECT * FROM OPENQUERY(MySQL_Server, ''SELECT * FROM lenovoms.ms_knowledge WHERE id > ?'')';
    EXEC sp_executesql @sql, N'@id INT', @id;  -- 注意:OPENQUERY 內部不支援參數化,需動態 SQL
    

    五、常見問題與解決方案

    欄位範例值說明
    Data Source NameMySQL_Lenovo自訂名稱,Linked Server 會用到
    DescriptionLenovo MySQL Source描述
    Server10.13.216.125MySQL 伺服器 IP
    Port3306預設埠
    UserlenovomsMySQL 帳號
    Password******密碼
    Databaselenovoms預設資料庫 (可留空)
    錯誤現象原因解決
    "The OLE DB provider MSDASQL has not been registered"32/64 位元不匹配確認 SQL Server、ODBC 驅動、DSN 皆為同位元 (生產環境一律用 64 位)
    "Data source name not found and no default driver specified"DSN 名稱錯誤檢查 sp_addlinkedserver @datasrc 參數與 ODBC 管理員中系統 DSN 名稱完全一致
    中文亂碼字元集轉換錯誤使用 Unicode Driver;MySQL 表/欄位 charset=utf8mb4;SQL Server 欄位用 NVARCHAR
    查詢極慢 / 逾時大量資料透過 Linked Server 拉取改用 OPENQUERY 推算到遠端;或分批匯入;或使用 SSIS/BCP 高效工具
    "Cannot create an instance of OLE DB provider MSDASQL"權限不足SQL Server 服務帳戶需有存取 ODBC 驅動的權限;或改用本地系統帳戶測試

    六、進階替代方案比較

    方案優點缺點適用場景
    Linked Server + OPENQUERY零工具、T-SQL 原生、即時查詢效能較差、大量資料慢、除錯難少量資料、臨時查詢、異構聯查
    SSIS (Integration Services)視覺化、平行、錯誤處理、增量載入學習曲線、需部署套件企業級 ETL、定時同步、複雜轉換
    BCP + 命令列腳本極快、無相依、易自動化需中繼檔案、型別對應手動大量離線遷移、初始載入
    第三方工具 (Navicat, DBeaver, DataGrip)GUI 友善、型別自動映射、支援多源付費、難納入 CI/CD一次性遷移、開發測試、小型專案

    七、最佳實踐總結

    1. 一律使用 64 位元:SQL Server、ODBC 驅動、DSN、Linked Server 提供者
    2. 使用 Unicode Driver:徹底解決中文/表情符號編碼問題
    3. 偏好 OPENQUERY:將篩選邏輯下推到 MySQL 執行,減少跨網路傳輸
    4. 大量資料改用 SSIS/BCP:Linked Server 不適合 TB 級遷移
    5. 文件化 DSN 與 Linked Server 定義:納入基礎設施即代碼 (IaC) 管理

    掌握此方案,即可在無額外工具授權成本下,實現 MySQL 到 SQL Server 的可靠資料存取與遷移。

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