Backup MySQL Database with databack/mysql-backup using Docker Compose
Hướng Dẫn Thiết Lập Tự Động Backup MySQL Bằng Docker (An Toàn & Hiệu Quả)
Trong môi trường container hóa, việc đảm bảo dữ liệu database luôn được sao lưu (backup) định kỳ là yêu cầu sống còn. Bài viết này sẽ hướng dẫn bạn thiết lập một container mysql-backup chạy song song với database chính, tự động sao lưu lúc 03:00 sáng hàng ngày và tự động xoá các bản backup cũ quá 14 ngày.
Giải pháp này sử dụng image databack/mysql-backup tối ưu, nhẹ và đặc biệt là không chạy dưới quyền root, giúp bạn dễ dàng quản lý file backup trên máy chủ (host) mà không gặp lỗi "Permission denied".
1. Chuẩn Bị Môi Trường (Quan Trọng)
Để đảm bảo an toàn, chúng ta sẽ tạo một người dùng hệ thống riêng biệt để quản lý các bản sao lưu thay vì dùng user cá nhân hoặc root.
Bước 1: Tạo User backup chuyên biệt
Tạo một system user không có quyền login để tăng cường bảo mật.
# Tạo user mới tên là 'backup_user' (không có shell login, có thư mục home)
sudo useradd -r -m -s /bin/false backup_user
# Kiểm tra UID và GID của user vừa tạo
id -u backup_user # Thường là một số > 100 (Ví dụ: 998)
id -g backup_user # Thường là một số > 100 (Ví dụ: 998)
Ghi nhớ hai con số UID và GID này để điền vào cấu hình Docker Compose ở bước sau.
Bước 2: Tạo thư mục và phân quyền truy cập
Chúng ta sử dụng quyền 775 để đảm bảo backup_user và nhóm của nó có toàn quyền, giúp việc quản lý file an toàn hơn.
# Tạo thư mục chứa file backup
mkdir -p ./backups
# Chuyển quyền sở hữu thư mục cho backup_user vừa tạo
# Thay 998:998 bằng UID:GID thực tế bạn vừa kiểm tra ở Bước 1
sudo chown -R 998:998 ./backups
# Cấp quyền 775: Chủ sở hữu và Nhóm có quyền Đọc/Ghi/Xóa, người khác chỉ có quyền Đọc
sudo chmod -R 775 ./backups
2. Cấu Hình Docker Compose
Thêm service mysql-backup vào file docker-compose.yml của bạn. Dưới đây là cấu hình thực tế đang được sử dụng:
services:
mysql:
image: mysql:8.0
container_name: my_project_mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_DATABASE: "${MYSQL_DATABASE_NAME}"
volumes:
- mysql_data:/var/lib/mysql
mysql-backup:
image: databack/mysql-backup
user: "998:998"
container_name: mysql-backup
depends_on:
- mysql
environment:
TZ: Asia/Ho_Chi_Minh
DB_SERVER: mysql
DB_USER: root
DB_PASS: "${MYSQL_ROOT_PASSWORD}"
DB_NAMES: "${MYSQL_DATABASE_NAME}"
DB_DUMP_FREQUENCY: 1440
DB_DUMP_BEGIN: "0300"
DB_DUMP_RETENTION: 14d
DB_DUMP_TARGET: /backup
volumes:
- ./backups:/backup
command: "dump"
volumes:
mysql_data:
3. Giải Nghĩa Chi Tiết Các Biến Môi Trường (Environment Variables)
Đây là bảng tra cứu ý nghĩa từng biến chúng ta đã sử dụng để bạn hiểu rõ cơ chế hoạt động:
| Tên Biến | Ý Nghĩa (Ngắn Gọn) | Giá trị mẫu |
|---|---|---|
TZ |
Múi giờ hệ thống (quan trọng để chạy đúng giờ). | Asia/Ho_Chi_Minh |
DB_SERVER |
Hostname hoặc địa chỉ của Database Server. | mysql |
DB_USER |
Username đăng nhập Database. | root |
DB_PASS |
Password đăng nhập Database. | ${MYSQL_ROOT_PASSWORD} |
DB_NAMES |
Danh sách DB cần backup (Không bắt buộc) | ${MYSQL_DATABASE_NAME} |
DB_DUMP_FREQUENCY |
Tần suất chạy (tính bằng phút). 1440 = 24h. | 1440 |
DB_DUMP_BEGIN |
Giờ bắt đầu chạy (Format HHMM). 0300 = 3h sáng. | "0300" |
DB_DUMP_RETENTION |
Thời gian giữ file backup (d = ngày). | 14d |
DB_DUMP_TARGET |
Đường dẫn lưu file trong container (Mapping với volumes). | /backup |
4. Các Lệnh Vận Hành Thường Dùng
Kiểm tra trạng thái và log
Để xem backup có chạy đúng giờ hay có lỗi kết nối không:
docker logs -f mysql-backup
Dấu hiệu thành công: Log hiện thông báo beginning dump... sau đó là dump finished.
Chạy Backup thủ công ngay lập tức (Force Run)
Nếu bạn vừa sửa DB quan trọng và muốn backup ngay không cần đợi đến 3h sáng:
docker exec mysql-backup /entrypoint dump
Lệnh này sẽ tạo ngay một file backup mới có định dạng .tgz.
Kiểm tra file kết quả
ls -lh ./backups/
File sẽ có định dạng tên: db_backup_YYYY-MM-DDThhmmssZ.tgz. Đây là file nén .tar.gz rất nhẹ và chuẩn mực trên Linux.
Khôi phục dữ liệu (Restore)
Để khôi phục lại một file backup cụ thể vào database:
Cách 1 (Thủ công): Giải nén file .tgz ra file .sql rồi import.
Cách 2 (Dùng chính container backup):
# Restore file backup mới nhất
docker exec mysql-backup /entrypoint restore
# Hoặc restore một file cụ thể
docker exec mysql-backup /entrypoint restore backups/db_backup_2026-02-07T0300.tgz
5. Các Vấn Đề Thường Gặp (Troubleshooting)
-
Lỗi
Permission denied:- Nguyên nhân: Container chạy user backup nhưng thư mục trên máy chủ lại thuộc quyền root.
- Khắc phục: Đảm bảo đã thêm
user: "998:998"trong docker-compose và chạysudo chown -R 998:998 ./backups.
-
Lỗi
Connection refusedhoặcUnknown host:- Nguyên nhân: Sai biến
DB_SERVERhoặc DB chưa khởi động xong. - Khắc phục: Kiểm tra kỹ tên service MySQL trong docker-compose. Đợi DB
healthytrước khi backup chạy.
- Nguyên nhân: Sai biến
-
Lỗi
Invalid retention format:- Nguyên nhân:
DB_DUMP_RETENTIONđặt là14(thiếu đơn vị). - Khắc phục: Phải sửa thành
14d(14 days).
- Nguyên nhân:
Tác giả: Nguyễn Đức
All rights reserved