Vấn đề: Khi mysqldump trở thành “nỗi ám ảnh” trên production
Hồi mới làm DevOps, mình từng nếm trái đắng với một database MySQL tầm 150GB. Cứ đến 2h sáng, khi cronjob mysqldump chạy, hệ thống lại bắt đầu nhảy cảnh báo slow query liên tục. Thậm chí có hôm website còn treo cứng vì table bị khóa (lock) quá lâu.
Vấn đề nằm ở chỗ: mysqldump là dạng logical backup. Nó đọc từng dòng dữ liệu rồi chuyển thành lệnh SQL INSERT. Với DB nhỏ thì ổn, nhưng khi bảng users chạm mốc 50 triệu row, mysqldump chạy chậm như rùa và ngốn I/O kinh khủng. Dù bạn dùng --single-transaction, việc khóa bảng vẫn có thể xảy ra ở một số giai đoạn nhạy cảm, gây gián đoạn dịch vụ ngay lập tức.
Đó là lúc mình chuyển sang Percona XtraBackup. Công cụ này thực hiện “Hot Backup” – sao lưu ngay khi database đang hoạt động mà không gây khóa bảng (non-blocking). Dưới đây là cách mình triển khai thực tế để anh em áp dụng.
Tại sao Percona XtraBackup lại nhanh và an toàn hơn?
Khác với kiểu “đọc từng dòng” của mysqldump, Percona XtraBackup là công cụ physical backup. Bạn cứ tưởng tượng nó giống như việc copy trực tiếp các file .ibd, .frm từ ổ cứng sang nơi khác vậy.
Cơ chế của nó rất thực tế. Khi đang copy dữ liệu, nếu phát sinh giao dịch (transaction) mới, XtraBackup sẽ ghi lại vào file redo log. Sau đó, nó tự động áp các thay đổi này để đảm bảo bản backup luôn nhất quán.
Những con số biết nói:
- Tốc độ: Thử nghiệm thực tế với DB 100GB, mysqldump mất gần 3 tiếng, trong khi XtraBackup chỉ cần 25-30 phút.
- Zero Downtime: User vẫn đọc/ghi bình thường, tỷ lệ khóa bảng là 0%.
- Khôi phục: Chỉ việc copy ngược lại file vào thư mục data của MySQL, nhanh hơn nhiều so với việc ngồi chờ server chạy lại hàng triệu lệnh SQL.
Triển khai Hot Backup trên Ubuntu
Trước khi gõ lệnh, anh em cần kiểm tra phiên bản MySQL. Nếu đang dùng bản 8.0, hãy cài XtraBackup 8.0. Với MySQL 5.7 trở xuống, bản 2.4 là lựa chọn chuẩn nhất.
1. Cài đặt Percona XtraBackup
Mình ưu tiên dùng repo chính thức từ Percona để nhận các bản vá lỗi mới nhất:
# Tải và cài đặt gói repo
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb
# Cập nhật và cài đặt bản cho MySQL 8.0
sudo apt update
sudo apt install percona-xtrabackup-80
2. Cấu hình user chuyên dụng
Đừng bao giờ dùng quyền root để chạy backup vì rủi ro bảo mật rất cao. Hãy tạo một user với các quyền vừa đủ:
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'MatKhauBaoMat123';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
3. Lệnh thực hiện Full Backup
Giả sử bạn cần lưu backup vào /data/backups/full_backup. Hãy chạy lệnh sau:
xtrabackup --backup --user=backup_user --password=MatKhauBaoMat123 --target-dir=/data/backups/full_backup
Dù database đang gánh hàng ngàn request mỗi giây, XtraBackup vẫn âm thầm copy dữ liệu ở tầng đĩa cứng mà không làm ảnh hưởng đến trải nghiệm người dùng.
4. Giai đoạn Prepare – Bước quyết định thành bại
Đây là lỗi phổ biến nhất của người mới. Dữ liệu sau khi copy xong chưa thể dùng ngay vì có thể chứa các giao dịch chưa hoàn tất. Chúng ta cần bước “Prepare” để chốt sổ dữ liệu:
xtrabackup --prepare --target-dir=/data/backups/full_backup
Khi màn hình hiện completed OK!, bản backup của bạn đã ở trạng thái sạch, nhất quán và sẵn sàng phục hồi bất cứ lúc nào.
Quy trình khôi phục khi có sự cố
Khi database “lên đường”, bạn cần bình tĩnh thực hiện theo các bước sau:
- Tắt ngay service MySQL:
sudo systemctl stop mysql - Dọn dẹp thư mục data cũ (nên move thay vì xóa):
sudo mv /var/lib/mysql /var/lib/mysql_old - Bắn dữ liệu từ bản backup về:
xtrabackup --copy-back --target-dir=/data/backups/full_backup
Lưu ý quan trọng: Sau khi copy-back, các file sẽ thuộc quyền root. Bạn phải trả lại quyền sở hữu cho user mysql, nếu không service sẽ không thể khởi động:
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql
Góc nhìn từ thực tế vận hành hệ thống lớn
Sau 5 năm quản trị các cụm DB từ 500GB đến vài TB, mình có vài lời khuyên cho anh em:
- Canh chừng dung lượng đĩa: Luôn chừa trống ít nhất 60-70% ổ cứng. Mình từng gặp ca backup làm đầy đĩa (full disk), khiến cả server production bị treo vì không thể ghi thêm log.
- Đẩy dữ liệu đi xa (Streaming): Nếu server không đủ chỗ chứa, hãy đẩy trực tiếp sang server backup qua SSH bằng pipe. Việc này vừa an toàn vừa tiết kiệm tài nguyên máy chủ gốc.
- Incremental Backup: Với DB trên 500GB, đừng ngày nào cũng full backup. Hãy kết hợp backup lũy kế để chỉ lưu những thay đổi nhỏ trong ngày, giúp giảm tải băng thông đáng kể.
Lời kết
Sử dụng Percona XtraBackup là lựa chọn bắt buộc nếu bạn muốn quản trị MySQL chuyên nghiệp. Nó không chỉ giải quyết triệt để lỗi khóa bảng mà còn giúp bạn tự tin hơn khi đối mặt với các kịch bản khôi phục dữ liệu lớn. Nếu hệ thống của bạn đang lớn dần, hãy bỏ mysqldump và chuyển sang XtraBackup ngay hôm nay.

