Migrate MSSQL sang MySQL: Tuyệt chiêu ‘vượt hố’ và xử lý lỗi kiểu dữ liệu

MySQL tutorial - IT technology blog
MySQL tutorial - IT technology blog

Chạy ngay đi: Quy trình Migration 6 bước

Nếu bạn đang cần chuyển gấp vài table để test, đây là lộ trình ngắn nhất. Hãy đảm bảo máy đã cài sẵn MySQL WorkbenchODBC Driver cho SQL Server trước khi bắt đầu.

  1. Mở Wizard: Vào menu Database -> Migration Wizard.
  2. Kết nối Nguồn (MSSQL): Chọn Microsoft SQL Server. Hãy dùng ODBC Data Source để tránh lỗi kết nối vặt.
  3. Kết nối Đích (MySQL): Trỏ về instance MySQL bạn muốn đổ dữ liệu vào.
  4. Chọn Schema: Tích chọn các database cần “bê” đi.
  5. Reverse Engineer: Workbench sẽ quét cấu trúc bảng. Đừng nhấn Next quá nhanh, hãy dừng lại kiểm tra mapping ở đây.
  6. Đẩy data: Nhấn Next để tool tự tạo schema và copy dữ liệu.

Đời không như là mơ. Với những database thực tế, tỉ lệ “ăn hành” ở bước 5 và 6 là rất cao. Thường thì lỗi sẽ đến từ việc lệch pha giữa T-SQL và MySQL.

Tại sao chuyển đổi MSSQL sang MySQL lại gây đau đầu?

Tôi từng tham gia dự án chuyển đổi hệ thống ERP với hơn 200 bảng và 500GB dữ liệu từ SQL Server sang MySQL. Ban đầu, team cứ tưởng chỉ cần nhấn nút là xong. Kết quả? Chúng tôi thức trắng 2 đêm chỉ để xử lý lỗi Data truncation và hiệu năng query tụt dốc không phanh.

Nguyên nhân chính là do triết lý lưu trữ khác nhau. MSSQL rất “nuông chiều” người dùng với các kiểu dữ liệu linh hoạt. Ngược lại, MySQL yêu cầu sự chính xác tuyệt đối về độ dài và cấu hình lưu trữ. Nếu để tool tự động mapping hoàn toàn, bạn rất dễ nhận về một đống dữ liệu rác.

Chi tiết quy trình xử lý tương thích (The Technical Meat)

1. Cấu hình kết nối qua ODBC

Thay vì nhập IP trực tiếp vào Workbench, hãy vào Control Panel -> ODBC Data Sources (64-bit). Tạo một System DSN trỏ tới SQL Server. Cách này giúp kết nối ổn định hơn, đặc biệt khi bạn cần migrate lượng dữ liệu lớn qua mạng LAN nội bộ.

# Kiểm tra nhanh quyền truy cập SQL Server
sqlcmd -S 192.168.1.10 -U sa -P YourStrongPassword

2. Mapping kiểu dữ liệu: Những điểm cần lưu ý

Đây là bảng mapping “xương máu” giúp bạn tránh lỗi mất dữ liệu (Data loss). Trong bước Object Migration, hãy chọn Show Selection để chỉnh sửa thủ công:

  • DATETIME2 sang DATETIME(6): MSSQL DATETIME2 có độ chính xác đến 100 nanosec. Nếu chỉ map sang DATETIME mặc định của MySQL, bạn sẽ mất trắng phần milisecond. Hãy dùng DATETIME(6) để giữ nguyên độ chính xác.
  • NVARCHAR(MAX) sang VARCHAR(n): Workbench thường tự đổi sang LONGTEXT. Tuy nhiên, nếu dữ liệu thực tế chỉ dưới 4000 ký tự, hãy ép về VARCHAR(4000). Việc này giúp bạn tận dụng được Index, thứ mà LONGTEXT hỗ trợ rất kém.
  • BIT sang TINYINT(1): MySQL không có kiểu Boolean thực thụ, nó dùng TINYINT(1). Hãy kiểm tra logic ở tầng ứng dụng (Code) để đảm bảo nó hiểu 0/1 là True/False.
  • UNIQUEIDENTIFIER sang CHAR(36): MySQL thiếu kiểu UUID chuyên dụng. Cách tốt nhất là dùng CHAR(36) và xử lý hàm UUID() ở tầng Application.

3. Xử lý Store Procedure và Trigger

Lưu ý quan trọng: Workbench Migration Wizard cực kỳ tệ trong việc dịch logic code. Cú pháp T-SQL dùng @Variable, còn MySQL lại dùng DECLARE. MSSQL có TOP, MySQL dùng LIMIT.

Lời khuyên của tôi: Skip hoàn toàn phần Routine/Trigger trong Wizard. Hãy migrate data trước, sau đó viết lại logic bằng tay để tối ưu cho MySQL.

Tuyệt chiêu xử lý dữ liệu lớn (Big Data)

Nếu database của bạn lớn hơn 20GB, việc đẩy data trực tiếp qua Workbench là “tự sát” vì rất dễ timeout. Hãy áp dụng quy trình 3 bước của dân chuyên nghiệp:

  1. Dùng Wizard để chỉ tạo cấu trúc bảng (Schema only).
  2. Sử dụng công cụ bcp (Bulk Copy Program) của MSSQL để xuất dữ liệu ra file CSV.
  3. Dùng lệnh LOAD DATA INFILE để nạp CSV vào MySQL. Phương pháp này có thể giúp bạn giảm thời gian migrate từ 10 tiếng xuống còn 30 phút.
-- Tốc độ nạp dữ liệu cực nhanh với LOAD DATA
LOAD DATA INFILE '/var/lib/mysql-files/data.csv'
INTO TABLE users
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

Kinh nghiệm thực tế để không phải “đền tiền”

Lỗi Font tiếng Việt: MSSQL thường dùng collation SQL_Latin1_General_CP1_CI_AS. Khi sang MySQL, bắt buộc phải chọn utf8mb4 (đặc biệt là utf8mb4_0900_ai_ci trên MySQL 8.0). Đừng để khách hàng than phiền vì tên họ biến thành dấu chấm hỏi.

Phân biệt hoa thường: Trên Linux, MySQL phân biệt hoa thường ở tên bảng (ví dụ: Users khác users). Nếu code cũ của bạn viết lộn xộn, hãy chỉnh tham số lower_case_table_names=1 trong file my.cnf trước khi migrate.

Kiểm tra khóa ngoại: Dữ liệu cũ đôi khi có những bản ghi “mồ côi”. MySQL với Strict Mode sẽ chặn không cho tạo Foreign Key nếu dữ liệu không khớp. Hãy tạm tắt check để dọn dẹp sau.

SET FOREIGN_KEY_CHECKS = 0;
-- Thực hiện nạp data hoặc sửa lỗi tại đây
SET FOREIGN_KEY_CHECKS = 1;

Tóm lại, migration là một cuộc chiến về sự tỉ mỉ. Đừng bao giờ tin hoàn toàn vào công cụ tự động. Hãy luôn test kỹ trên một bản backup trước khi thực hiện trên production. Nếu bạn gặp lỗi mapping nào “khó đỡ”, hãy để lại bình luận bên dưới nhé!

Share: