💾 Backup MySQL Database
📋 Chuẩn Bị
1. Tạo Thư Mục Backup
# Tạo thư mục backup
sudo mkdir -p /data/backup/mysql
# Phân quyền thư mục
sudo chown -R mysql:mysql /data/backup/mysql
sudo chmod 755 /data/backup/mysql
🚀 Thực Hiện Backup
1. Backup Sử Dụng mysqldump
a. Backup Database Đơn Lẻ
mysqldump -h hostname -u username -p \
--single-transaction \
--quick \
--lock-tables=false \
database_name | gzip > /data/backup/mysql/database_$(date '+%Y%m%d_%H%M%S').sql.gz
Giải Thích Tham Số
-h hostname
: Địa chỉ host MySQL-u username
: Tên user MySQL-p
: Nhắc nhập mật khẩu--single-transaction
: Đảm bảo tính nhất quán dữ liệu--quick
: Tối ưu tốc độ backup--lock-tables=false
: Không khóa bảng khi backup
b. Backup Nhiều Database
mysqldump -h hostname -u username -p \
--single-transaction \
--quick \
--lock-tables=false \
--databases db1 db2 db3 | gzip > /data/backup/mysql/multi_db_$(date '+%Y%m%d_%H%M%S').sql.gz
c. Backup Toàn Bộ Databases
mysqldump -h hostname -u username -p \
--single-transaction \
--quick \
--lock-tables=false \
--all-databases | gzip > /data/backup/mysql/all_databases_$(date '+%Y%m%d_%H%M%S').sql.gz
2. Dump Database
a. Dump Toàn Bộ Database
# Dump với khóa toàn bộ bảng (không khuyến nghị cho production)
mysqldump --lock-all-tables --all-databases --events > mysql_dump.sql
# Dump với transaction (khuyến nghị cho production)
mysqldump --single-transaction --all-databases --events > mysql_dump.sql
cẩn thận
--lock-all-tables
: Khóa đọc/ghi toàn bộ bảng, không nên dùng trong môi trường production--single-transaction
: An toàn hơn, đảm bảo tính nhất quán dữ liệu mà không khóa bảng
b. Dump Database Cụ Thể
# Dump một database cụ thể
mysqldump database_name --single-transaction --events > database_dump.sql
# Dump và nén file
mysqldump database_name --single-transaction --events | gzip > database_dump.sql.gz
🤖 Thông Báo Kết Quả qua Telegram
Để thêm thông báo kết quả backup qua Telegram, bạn có thể sử dụng script có sẵn:
📜 Script Backup Tự Động
1. Tạo Script Backup
Tạo file mysql_backup.sh
:
#!/bin/bash
# Cấu hình
BACKUP_DIR="/data/backup/mysql"
DB_NAME="your_database"
DB_USER="your_username"
DB_HOST="your_host"
DATE=$(date '+%Y%m%d_%H%M%S')
LOG_FILE="/var/log/mysql/backup_${DATE}.log"
# Tạo thư mục backup nếu chưa tồn tại
mkdir -p $BACKUP_DIR
# Xóa backup cũ (giữ lại 7 ngày)
find $BACKUP_DIR -name "*.sql.gz" -type f -mtime +7 -delete
# Thông báo bắt đầu backup
telegram-send "🚀 <b>Bắt đầu backup MySQL</b>
📊 Database: $DB_NAME
⏰ Thời gian: $(date '+%Y-%m-%d %H:%M:%S')"
# Thực hiện backup
if mysqldump -h $DB_HOST -u $DB_USER -p \
--single-transaction \
--quick \
--lock-tables=false \
$DB_NAME | gzip > "${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"; then
# Backup thành công
SIZE=$(ls -lh ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz | awk '{print $5}')
telegram-send "✅ <b>Backup MySQL thành công</b>
📊 Database: $DB_NAME
📦 Kích thước: $SIZE
⏱ Thời gian: $(date '+%Y-%m-%d %H:%M:%S')
📂 File: ${DB_NAME}_${DATE}.sql.gz"
else
# Backup thất bại
telegram-send "❌ <b>Backup MySQL thất bại</b>
📊 Database: $DB_NAME
⚠️ Kiểm tra log tại: $LOG_FILE"
fi
# Thông báo xóa backup cũ
OLD_COUNT=$(find $BACKUP_DIR -name "*.sql.gz" -type f -mtime +7 | wc -l)
if [ $OLD_COUNT -gt 0 ]; then
telegram-send "🧹 <b>Dọn dẹp backup cũ</b>
🗑️ Đã xóa $OLD_COUNT file backup cũ hơn 7 ngày"
fi
2. Cấu Hình Cron Job
# Mở crontab
crontab -e
# Thêm lịch backup (ví dụ: chạy lúc 2 giờ sáng hàng ngày)
0 2 * * * /path/to/mysql_backup.sh
Câu Lệnh Backup và Gửi Tin Qua Telegram
# Thực hiện backup và gửi thông báo
mysqldump -h hostname -u username -p \
--single-transaction \
--quick \
--lock-tables=false \
database_name | gzip > /data/backup/mysql/database_$(date '+%Y%m%d_%H%M%S').sql.gz && \
telegram-send "✅ Backup MySQL thành công
📊 Database: database_name
⏱ Thời gian: $(date '+%Y-%m-%d %H:%M:%S')" || \
telegram-send "❌ Backup MySQL thất bại
📊 Database: database_name
⚠️ Kiểm tra log để biết thêm chi tiết"
Hoặc nếu muốn thêm thông tin về kích thước file:
# Backup với thông tin kích thước file
BACKUP_FILE="/data/backup/mysql/database_$(date '+%Y%m%d_%H%M%S').sql.gz" && \
mysqldump -h hostname -u username -p \
--single-transaction \
--quick \
--lock-tables=false \
database_name | gzip > $BACKUP_FILE && \
SIZE=$(ls -lh $BACKUP_FILE | awk '{print $5}') && \
telegram-send "✅ Backup MySQL thành công
📊 Database: database_name
📦 Kích thước: $SIZE
⏱ Thời gian: $(date '+%Y-%m-%d %H:%M:%S')
📂 File: $(basename $BACKUP_FILE)" || \
telegram-send "❌ Backup MySQL thất bại"
mẹo
Xem hướng dẫn cài đặt và sử dụng Telegram Bot tại Phát Triển Bot Telegram