萬盛學電腦網

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

SQL Server 遷移 MySQL 異構同步架構:Perl + ODBC + HandlerSocket 實戰

記錄一次千萬列表 5 分鐘、15 GB 資料庫半小時的異構遷移實戰,架構採「雙執行端 + 單接收端」,解決編碼、效能與一致性難題。

架構拓撲

  • 接收端:Linux + MySQL 5.6.14(支援 GIS 地理座標)
  • 執行端 × N:Linux + Perl + DBD::mysql + unixODBC (連 SQL Server) + HandlerSocket
  • 表切分平行跑批,執行端越多、網路頻寬允許下吞吐越高。

關鍵元件安裝要點

1. Perl + DBD::mysql

cpan DBD::mysql  # 或 yum install perl-DBD-MySQL

2. unixODBC + FreeTDS 連 SQL Server

yum install unixODBC unixODBC-devel freetds freetds-devel
# /etc/odbcinst.ini 註冊 FreeTDS 驅動
# /etc/odbc.ini 定義 DSN 指向 SQL Server

3. HandlerSocket(兩端皆裝)

繞過 SQL 層直接存取 InnoDB,寫入延遲極低。編譯 MySQL 時需 -DWITH_HANDLERSOCKET=1 或另行編譯 plugin。

資料流向與轉換邏輯

  1. 執行端透過 ODBC 從 SQL Server 讀取批次資料。
  2. Perl 腳本進行型別映射(如 datetime→DATETIME、uniqueidentifier→CHAR(36)、GIS 欄位轉 WKB)。
  3. 編碼統一轉 UTF-8,解決中文亂碼。
  4. 經 HandlerSocket 批次寫入 MySQL,單批次 1 萬列左右。

效能基準

資料量耗時備註
1,000 萬列單表~5 分鐘4 執行端平行
3 GB 整庫~30 分鐘
15 GB 整庫~5 小時含索引建立

避坑清單

  • SQL Server text/ntext/image → MySQL TEXT/BLOB,需分塊讀寫防止記憶體暴增。
  • 自增主鍵衝突:目標庫先 ALTER TABLE ... AUTO_INCREMENT=最大值+1。
  • HandlerSocket 無事務,若需原子性請在 Perl 層自行補償或改用 INSERT ... ON DUPLICATE KEY UPDATE。
  • 網路抖動導致同步中斷:設計斷點續傳機制(記錄最後成功 PK/Offset)。

此架構在「異構、大量、低延遲」三重約束下經過生產驗證,可作為類似遷移專案的參考藍圖。

copyright © 萬盛學電腦網 all rights reserved