Tại sao lại chọn hướng đi ngược: Từ PostgreSQL sang MySQL?
Dù PostgreSQL thường được đánh giá cao hơn về tính năng, thực tế đôi khi buộc chúng ta phải làm điều ngược lại. Một năm trước, mình quản lý hệ thống 50GB dữ liệu trên AWS chạy MySQL 8.0. Team dev mới tiếp nhận dự án rất rành MySQL nhưng lại lóng ngóng với PostgreSQL. Việc bảo trì và tối ưu query trở nên cực kỳ chậm chạp. Để đồng bộ stack công nghệ, mình quyết định thực hiện cú “quay xe” này.
Lý do chính thường nằm ở hệ sinh thái (Ecosystem). Có thể ứng dụng của bạn dùng CMS hoặc Framework hỗ trợ MySQL tốt hơn. Đôi khi, chi phí Managed Service của MySQL trên các cloud provider cũng rẻ hơn đáng kể. Tuy nhiên, việc migrate không chỉ đơn giản là export rồi import. Hai hệ quản trị này có tư duy về kiểu dữ liệu và cú pháp SQL rất khác biệt.
Công cụ hỗ trợ: Đừng làm thủ công
Để giảm bớt rủi ro, bạn nên dùng công cụ thay vì tự viết script. MySQL Workbench Migration Wizard là lựa chọn ổn định nhất mình từng thử. Nó xử lý khâu mapping kiểu dữ liệu khá mượt mà.
Trước khi bắt đầu, hãy chuẩn bị:
- MySQL Workbench bản mới nhất trên máy local hoặc server trung gian.
- Driver ODBC cho PostgreSQL (psqlODBC) để Workbench kết nối được với Postgres.
- Quyền
SUPERhoặc tối thiểu làCREATEvàINSERTtrên MySQL đích.
# Cài đặt driver ODBC trên Ubuntu:
sudo apt-get install odbc-postgresql
Sau khi cài xong, bạn mở Workbench, truy cập Database -> Migration Wizard. Quy trình chính thức bắt đầu từ đây.
3 giai đoạn migrate quan trọng
Dưới đây là lộ trình mình đã áp dụng để chuyển đổi thành công 50GB dữ liệu trong khoảng 4 tiếng đồng hồ.
1. Mapping cấu trúc (Schema)
PostgreSQL dùng Schema để phân cấp bên trong một Database. Ngược lại, MySQL coi mỗi Database chính là một Schema. Bạn cần lưu ý kỹ các kiểu dữ liệu sau:
- Boolean: Postgres có
BOOLEAN, MySQL sẽ tự map sangTINYINT(1). - Serial:
SERIALcủa Postgres phải chuyển thànhAUTO_INCREMENTtrong MySQL. - JSON: PostgreSQL mạnh về
JSONB, MySQL 8.0 hỗ trợJSONnhưng tốc độ truy vấn sẽ khác. - Dữ liệu lớn:
TEXTtrong Postgres rất linh hoạt. Với MySQL, hãy cân nhắc dùngMEDIUMTEXThoặcLONGTEXTnếu dữ liệu vượt quá 64KB.
2. Chỉnh sửa cú pháp SQL
Khi Workbench tạo script CREATE TABLE, đừng vội nhấn Next. Hãy dừng lại kiểm tra các ràng buộc (Constraints). PostgreSQL cho phép đặt tên Index trùng nhau giữa các bảng, nhưng MySQL yêu cầu tên Index phải là duy nhất trong toàn bộ schema.
-- PostgreSQL
CREATE TABLE users (
id SERIAL PRIMARY KEY,
metadata JSONB
);
-- Chuyển sang MySQL cần sửa thành:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
metadata JSON
) CHARACTER SET utf8mb4;
Kinh nghiệm xương máu: Hãy viết lại Stored Procedures và Triggers bằng tay. Cú pháp PL/pgSQL và MySQL khác nhau một trời một vực. Các công cụ tự động thường tạo ra code lỗi ở phần này.
3. Đẩy dữ liệu (Data Migration)
Mình thường chia nhỏ dữ liệu thành các batch khoảng 5,000 – 10,000 dòng để tránh timeout. Nếu làm thủ công qua file SQL, hãy kiểm tra kỹ định dạng ngày tháng và các ký tự escape. MySQL khắt khe hơn về sql_mode, dễ gây lỗi nếu dữ liệu Postgres chứa các ký tự đặc biệt không được xử lý.
Kiểm tra và tối ưu sau migrate
Tuyệt đối không tin tưởng hoàn toàn vào công cụ. Việc đầu tiên cần làm là so sánh số dòng (Row Count) giữa hai bên.
-- Chạy lệnh này ở cả hai phía để đối chiếu
SELECT count(*) FROM orders;
Tiếp theo, hãy chọn ngẫu nhiên khoảng 100 bản ghi quan trọng để so sánh từng trường dữ liệu. Một mẹo nhỏ là dùng hàm CHECKSUM TABLE trong MySQL để đối chiếu với giá trị hash tương ứng từ Postgres.
Về hiệu năng, đừng quên chạy ANALYZE TABLE ngay sau khi xong. Lệnh này giúp MySQL cập nhật lại thống kê (statistics) cho bộ tối ưu hóa truy vấn.
ANALYZE TABLE users, orders, products;
Trong tuần đầu, hãy bật Slow Query Log. Một số câu query chạy rất nhanh trên Postgres nhờ Index đặc thù nhưng có thể gây Full Table Scan trên MySQL. Phát hiện sớm giúp bạn bổ sung Index kịp thời, tránh treo hệ thống khi traffic cao.
Migrate database cũng giống như chuyển nhà. Đồ đạc rất dễ thất lạc hoặc hư hỏng nếu không kiểm kê kỹ. Chỉ cần nắm vững sự khác biệt giữa hai hệ quản trị, bạn sẽ đưa dữ liệu về đích an toàn.

