Chuyển tới nội dung chính

💾 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