| 欄位 | 範例值 | 說明 |
| Data Source Name | MySQL_Lenovo | 自訂名稱,Linked Server 會用到 |
| Description | Lenovo MySQL Source | 描述 |
| Server | 10.13.216.125 | MySQL 伺服器 IP |
| Port | 3306 | 預設埠 |
| User | lenovoms | MySQL 帳號 |
| Password | ****** | 密碼 |
| Database | lenovoms | 預設資料庫 (可留空) |
點擊 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+ 常失敗)
- 物件總管 → 伺服器物件 → 連結伺服器 → 右鍵「新增連結伺服器」
- 一般頁面:名稱=MySQL_Server、伺服器類型=其他資料來源、提供者=Microsoft OLE DB Provider for ODBC Drivers、資料來源=MySQL_Lenovo
- 安全性頁面:建立對應、遠端登入/密碼填 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
五、常見問題與解決方案
| 錯誤現象 | 原因 | 解決 |
| "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 | 一次性遷移、開發測試、小型專案 |
七、最佳實踐總結
- 一律使用 64 位元:SQL Server、ODBC 驅動、DSN、Linked Server 提供者
- 使用 Unicode Driver:徹底解決中文/表情符號編碼問題
- 偏好 OPENQUERY:將篩選邏輯下推到 MySQL 執行,減少跨網路傳輸
- 大量資料改用 SSIS/BCP:Linked Server 不適合 TB 級遷移
- 文件化 DSN 與 Linked Server 定義:納入基礎設施即代碼 (IaC) 管理
掌握此方案,即可在無額外工具授權成本下,實現 MySQL 到 SQL Server 的可靠資料存取與遷移。
- 上一篇文章: Microsoft Access 數據庫規範與容量上限完整表
- 下一篇文章: MySQL 字元集完整設定指南:從連線層到儲存層徹底解決亂碼問題
Copyright ©
程式碼之家 All Rights Reserved