Việc backup database MySQL định kỳ là cực kỳ quan trọng để đảm bảo an toàn dữ liệu. Trong bài viết này, bạn sẽ học cách:
-
Backup tất cả database bằng mysqldump
-
Nén file bằng gzip
-
Tự động chạy bằng crontab
-
Gửi thông báo qua Telegram
-
Tự động xóa backup cũ
1. Tạo file script backup
Tạo file:
Dán nội dung sau:
#!/bin/bash
# Fix PATH khi chạy bằng cron
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
IPADDR=$(curl -s ifconfig.me)
# Cấu hình
backup_dir="/backupmysql"
date_format=$(date +'%d-%m-%Y')
backup_path="$backup_dir/$date_format"
max_backup_count=30
MYSQL_UNAME="root"
MYSQL_PWORD="password"
# Telegram
telegram_bot_token="YOUR_BOT_TOKEN"
telegram_chat_id="YOUR_CHAT_ID"
# Tạo thư mục backup
mkdir -p "$backup_path"
# Lấy danh sách database
databases=$(mysql -u$MYSQL_UNAME -p$MYSQL_PWORD -e "SHOW DATABASES" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
# Đếm số DB
database_count=$(echo "$databases" | wc -l)
# Backup từng database
for db in $databases; do
mysqldump -u$MYSQL_UNAME -p$MYSQL_PWORD "$db" | gzip > "$backup_path/$db-$date_format.sql.gz"
done
# Đếm file backup
file_count=$(find "$backup_path" -type f | wc -l)
# Nội dung gửi Telegram
message="$IPADDR - Backup MySQL %0A
Ngày: $date_format %0A
Số database: $database_count %0A
Đã backup: $file_count"
# Gửi Telegram
curl -s -X POST https://api.telegram.org/bot$telegram_bot_token/sendMessage \
-d chat_id=$telegram_chat_id \
-d text="$message" > /dev/null
# Xóa backup cũ
find "$backup_dir" -mindepth 1 -maxdepth 1 -type d -printf '%T+ %p\n' \
| sort -r \
| tail -n +$((max_backup_count+1)) \
| cut -d' ' -f2- \
| xargs rm -rf
2. Cấp quyền chạy script
3. Test chạy thử
Kiểm tra:
4. Thiết lập chạy tự động với Crontab
Mở crontab:
Ví dụ chạy mỗi ngày lúc 2h sáng:
5. Lưu ý quan trọng
-
Cron có môi trường khác khi chạy tay → cần khai báo PATH
-
Nên dùng find thay vì ls để đếm file
-
Kiểm tra MySQL hoạt động trước khi backup
-
Không nên hardcode password (có thể dùng .my.cnf)
6. Mẹo nâng cao (khuyên dùng)
Dùng file .my.cnf để bảo mật
Tạo file:
Nội dung
user=root
password=yourpassword
set quyền
Sau đó bỏ -u -p trong script
Debug khi cron lỗi
Thêm vào script:
set -x
Chúc các bạn thành công