#!/bin/bash
# /usr/sbin/bakmysql_physical
BAK_DIR="/mysqldata"
DATA_DIR="/var/lib/mysql" # 確認實際 datadir
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BAK_DIR"
# 停寫或加讀鎖 (MyISAM 必須)
# mysql -u root -p"pass" -e "FLUSH TABLES WITH READ LOCK;"
tar czf "${BAK_DIR}/mysql_${DATE}.tar.gz" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"
# 解鎖
# mysql -u root -p"pass" -e "UNLOCK TABLES;"
# 保留 7 天
find "$BAK_DIR" -name "mysql_*.tar.gz" -mtime +7 -delete
#!/bin/bash
# /usr/sbin/bakmysql_logical
BAK_DIR="/mysqldata"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BAK_DIR"
mysqldump -u root -p"YourPassword" \
--single-transaction \
--quick \
--master-data=2 \
--hex-blob \
--routines --triggers --events \
--all-databases | gzip > "${BAK_DIR}/mysql_${DATE}.sql.gz"
# 保留 7 天
find "$BAK_DIR" -name "mysql_*.sql.gz" -mtime +7 -delete
# 1. 賦予執行權限
chmod +x /usr/sbin/bakmysql_logical
# 2. 編輯 crontab (root 用戶)
crontab -e
# 3. 添加定時任務 (每天凌晨 3:01 執行)
01 3 * * * /usr/sbin/bakmysql_logical >> /var/log/mysql_backup.log 2>&1
# 格式解釋:分 時 日 月 周 命令
# 01 3 * * * = 每天 03:01
# /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 示例:每天 3:01 root 執行邏輯備份
01 3 * * * root /usr/sbin/bakmysql_logical
# 示例:每小時增量備份 (需配合 binlog)
0 * * * * mysqlbinlog --start-position=... > /mysqldata/incr_$(date +\%H).sql
gzip -t mysql_20240115_030101.sql.gz。gunzip -c mysql_20240115_030101.sql.gz | mysql -u root -p test_restorersync -avz /mysqldata/ backup-server:/remote/backup/mysql/。~/.my.cnf [client] password=xxx (chmod 600)。--single-transaction 可能導致 Undo Log 膨脹,監控 History list length,必要時分庫備份。df -h /mysqldata 判斷剩餘空間 > 備份預估 2 倍。Linux MySQL 自動備份三步走:**規範腳本 (mysqldump 核心參數) → Crontab 定時 → 異地複製 + 定期恢復演練**。邏輯備份通用性最強,物理備份適合極大唯讀庫。備份未驗證等於無備份,恢復演練是底線。