Nỗi ám ảnh mang tên mysqldump khi database “phình to”
Ngồi nhìn thanh progress của mysqldump chạy rùa bò suốt 5-10 tiếng cho một database vài trăm GB là trải nghiệm cực kỳ mệt mỏi. Cách làm truyền thống này (logical backup) thực chất là đọc từng bản ghi rồi ghi ra file dưới dạng câu lệnh SQL INSERT. Khi restore, MySQL lại phải hì hục thực thi hàng triệu câu lệnh đó để xây dựng lại index – một quá trình ngốn CPU và IO khủng khiếp.
Mình từng quản lý một hệ thống MySQL 8.0 với khoảng 100GB data. Trước đây, mỗi lần chuyển server là mất nguyên một đêm trực. Từ khi dùng Clone Plugin, mọi thứ thay đổi hoàn toàn. Thay vì tốn 4 tiếng dump và 6 tiếng restore, giờ đây việc tạo một bản sao hoàn chỉnh chỉ mất khoảng 15-20 phút. Nếu bạn cần dựng nhanh server Slave hoặc migrate dữ liệu mà không muốn downtime quá lâu, đây chính là giải pháp số một.
Tại sao MySQL Clone Plugin lại nhanh khủng khiếp?
Ra đời từ bản 8.0.17, Clone Plugin cho phép sao chép dữ liệu trực tiếp từ Donor (nguồn) sang Recipient (đích) mà không cần tắt server. Cơ chế của nó rất khác biệt.
Nó thực hiện Physical Backup. Thay vì chuyển đổi dữ liệu thành văn bản, nó bê nguyên các file vật lý (InnoDB tablespaces, redo logs…) từ ổ cứng server này sang server kia. Tốc độ lúc này không còn phụ thuộc vào sức mạnh xử lý SQL của MySQL nữa. Nó chỉ phụ thuộc vào băng thông mạng và tốc độ đọc ghi của SSD.
3 lợi thế khiến mysqldump trở nên lỗi thời:
- Chạm đỉnh băng thông: Tốc độ copy thường đạt 80-90% giới hạn card mạng (ví dụ mạng 1Gbps sẽ đạt khoảng 100MB/s).
- Không file trung gian: Dữ liệu đổ thẳng từ nguồn sang đích, tiết kiệm dung lượng ổ cứng cho file dump.
- Tự động hóa hoàn toàn: Server đích tự cấu hình và khởi động lại với dữ liệu mới mà không cần bạn can thiệp thủ công.
Điều kiện để “vận hành” Clone Plugin
Đừng vội gõ lệnh ngay. Hãy đảm bảo hai bên đã khớp nhau các thông số sau để tránh lỗi giữa chừng:
- Version: Cả hai server phải cùng phiên bản chính xác (ví dụ 8.0.35).
- Nền tảng: Phải cùng hệ điều hành (cùng Linux x64 hoặc cùng Windows).
- Cấu hình InnoDB: Các thông số
innodb_page_sizephải giống hệt nhau. - Plugin: File
mysql_clone.sophải được cài ở cả hai đầu.
Thực chiến: 4 bước clone dữ liệu qua mạng
Giả sử server Donor (192.168.1.10) đang có data và Recipient (192.168.1.20) là server mới.
Bước 1: Kích hoạt Plugin
Thực hiện lệnh này trên cả hai server:
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Bước 2: Phân quyền User
Trên Donor, tạo user có quyền đọc file hệ thống:
CREATE USER 'clone_user'@'192.168.1.20' IDENTIFIED BY 'PassSieuKho';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'192.168.1.20';
Trên Recipient, cấp quyền thực hiện ghi đè dữ liệu:
CREATE USER 'rcp_user'@'localhost' IDENTIFIED BY 'PassSieuKho';
GRANT CLONE_ADMIN ON *.* TO 'rcp_user'@'localhost';
Mẹo nhỏ: Quyền CLONE_ADMIN sẽ tự động thực hiện lệnh SHUTDOWN sau khi clone xong để server tự load data mới.
Bước 3: Khai báo nguồn tin cậy
Ở server đích, bạn cần xác nhận chỉ nhận data từ server nguồn này:
SET GLOBAL clone_valid_donor_list = '192.168.1.10:3306';
Bước 4: Bấm nút “Copy”
Từ server Recipient, hãy chạy lệnh kích hoạt:
CLONE INSTANCE FROM 'clone_user'@'192.168.1.10':3306 IDENTIFIED BY 'PassSieuKho';
Cách theo dõi tiến độ (Performance Schema)
Với database lớn, việc ngồi chờ mà không biết máy đang làm gì rất sốt ruột. Bạn hãy mở một tab Terminal mới và truy vấn bảng sau:
-- Xem dung lượng đã copy được bao nhiêu MB
SELECT STAGE, STATE, CAST(BEGIN_TIME AS DATETIME) AS START,
CONCAT(TRUNCATE(DATA/1024/1024,2), ' MB') AS DATA_TRANSFERRED
FROM performance_schema.clone_progress;
Kinh nghiệm thực tế: Luôn chạy lệnh clone trong screen hoặc tmux. Nếu mất kết nối SSH giữa chừng mà lệnh bị ngắt, bạn sẽ phải tốn công chạy lại từ đầu vì dữ liệu lúc đó đã bị xóa dở dang.
Những lưu ý “xương máu”
Dù rất mạnh, Clone Plugin vẫn có những điểm bạn cần lưu ý để tránh mất dữ liệu:
- Dữ liệu đích sẽ bị xóa sạch: Lệnh
CLONE INSTANCEsẽ xóa toàn bộ database hiện có trên Recipient trước khi copy cái mới vào. Hãy chắc chắn server đích là server trống. - Băng thông mạng: Nếu dùng card 1Gbps, tốc độ kịch kim là 110MB/s. Với database 1TB, bạn vẫn mất khoảng 2.5 tiếng. Nếu có mạng 10Gbps, thời gian rút ngắn xuống còn chưa đầy 20 phút.
- Docker Restart Policy: Vì plugin sẽ tắt MySQL để restart, nếu bạn dùng Docker mà không set
restart: always, container sẽ “ngủm” luôn sau khi clone.
Lời kết
MySQL Clone Plugin là bước đột phá cho anh em DBA. Nó biến việc migrate database từ nỗi ám ảnh thành một tác vụ nhẹ nhàng. Nếu bạn đang quản lý database trên 50GB, hãy từ bỏ thói quen dùng dump file và chuyển sang Clone Plugin ngay hôm nay để tận dụng tối đa sức mạnh phần cứng hiện đại.

