idss*)逐庫備份mysqldump --single-transaction --flush-logs 確保一致性與二進位日誌切換庫名-YYYYMMDD-HHMM.sql.tgz 命名,自動壓縮與清理原始 SQLmailutils)DBFullyBak.sh)#!/bin/bash
# MySQL 全量備份腳本 - 每週執行一次
# 需配合 crontab: 0 3 * * 0 /root/DBFullyBak.sh
USER=root
PASSWORD=your_strong_password
BACKUP_DIR=/mysql_bak
LOGFILE=${BACKUP_DIR}/data_backup.log
DATE=$(date '+%Y%m%d-%H%M')
# 確保備份目錄存在
mkdir -p "${BACKUP_DIR}"
# 遍歷符合前綴的資料庫
for DATABASE in $(ls /mysql/data/mysql/ | grep '^idss'); do
DUMPFILE="${DATABASE}-${DATE}.sql"
ARCHIVE="${DUMPFILE}.tgz"
echo "" >> "${LOGFILE}"
echo "----------------------" >> "${LOGFILE}"
echo "BACKUP DATE: $(date '+%Y-%m-%d %H:%M:%S')" >> "${LOGFILE}"
echo "----------------------" >> "${LOGFILE}"
cd "${BACKUP_DIR}"
# 刪除 5 天前備份
DATE_5=$(date -d "-5 day" '+%Y%m%d')
rm -rf "${DATABASE}-${DATE_5}"*
# 執行備份(單一事務 + 刷新日誌)
mysqldump --opt --single-transaction --flush-logs \
-u"${USER}" -p"${PASSWORD}" "${DATABASE}" > "${DUMPFILE}"
if [[ $? -eq 0 ]]; then
tar czf "${ARCHIVE}" "${DUMPFILE}" >> "${LOGFILE}" 2>&1
echo "[${ARCHIVE}] Backup Successful!" >> "${LOGFILE}"
rm -f "${DUMPFILE}"
else
echo "Database Backup Fail!" >> "${LOGFILE}"
# mail -s "DB:${DATABASE} Backup Failed" admin@example.com
fi
done
echo "Backup Process Done"
| 參數 | 作用 |
|---|---|
--single-transaction | InnoDB 熱備份核心,取得一致性快照不鎖表 |
--flush-logs | 備份前切換 binlog,配合增量備份使用 |
--opt | 啟用快速導出優化(含鎖表、延遲插入等),InnoDB 下配合 single-transaction 實際不鎖表 |
tar czf | gzip 壓縮,節省 60%+ 空間 |
全量備份週日執行,週一至週六每日增量備份(複製新生成的 mysql-bin.*)。全量備份時 --flush-logs --delete-master-logs 會清空舊 binlog,增量腳本需在全量備份之後運行或協調好 binlog 索引。
SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, RELOAD, REPLICATION CLIENT 權限。~/.my.cnf(chmod 600)避免腳本明文洩露。tar xzf xxx.tgz | mysql -u root -p db。