生產環境需自動化備份資料庫與輪轉日誌。本文提供兩個可直接部署至 /etc/cron.hourly/ 的 Shell 腳本:MySQL 逐小時備份保留 3 天、Nginx access.log 逐小時切割保留 3 天,含壓縮、清理舊檔、平滑重新開啟日誌完整流程。
#!/bin/bash
# 放入 /etc/cron.hourly/ 目錄,每小時自動執行
DUMP=/usr/local/webserver/mysql/bin/mysqldump
OUT_DIR=/data1/backup/
DB_NAME=資料庫名
DB_USER=資料庫用戶
DB_PASS=資料庫密碼
# 保留天數與分鐘數(12小時 = 720分鐘)
DAYS=3
MINS=720
cd $OUT_DIR
DATE=$(date +%Y-%m-%d-%H)
OUT_SQL="${DATE}.sql"
TAR_SQL="db-${DATE}.tar.gz"
# 匯出、壓縮、刪除原始 SQL
$DUMP --default-character-set=utf8 --opt -u$DB_USER -p$DB_PASS $DB_NAME > $OUT_SQL
tar -czf $TAR_SQL ./$OUT_SQL
rm -f $OUT_SQL
# 清理超過 12 小時的備份檔(或改用 -mtime +$DAYS 按天清理)
find ./ -name "db*" -type f -mmin +$MINS -exec rm {} \;
# find ./ -name "db*" -type f -mtime +$DAYS -exec rm {} \;
exit 0
--opt:啟用 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset 組合,提升匯出效能--default-character-set=utf8:確保中文資料正確編碼-mmin +720:精確以分鐘清理,配合小時排程;若改為每日備份可用 -mtime +3#!/bin/bash
# 放入 /etc/cron.hourly/,建議在 00:00 執行(需配合 cron 時程)
logs_path="/data1/logs/"
DAYS=3
cd $logs_path
DATE=$(date +%Y-%m-%d-%H)
SRC_FILE="access.log"
TAR_FILE="access-${DATE}.tar.gz"
# 壓縮當前日誌
tar -czf $TAR_FILE $SRC_FILE
# 刪除原檔案(Nginx 仍持有檔案描述符,實際磁碟空間不釋放)
rm -f $SRC_FILE
# 清理 3 天前的舊壓縮檔
find ./ -name "access-*" -type f -mtime +$DAYS -exec rm {} \;
# 發送 USR1 信號讓 Nginx 重新開啟日誌檔案(平滑切割關鍵步驟)
kill -USR1 $(cat /usr/local/webserver/nginx/nginx.pid)
exit 0
access.log(檔案實體仍存在於磁碟,Nginx 進程持有開啟描述符繼續寫入)kill -USR1 觸發 Nginx 重新開啟日誌檔案,產生新的 access.log/etc/cron.hourly/ 並具備執行權限:chmod +x /etc/cron.hourly/*.shcron 服務運行:systemctl status crond/etc/cron.hourly/mysql_backup.shdb-YYYY-MM-DD-HH.tar.gz 及 access-YYYY-MM-DD-HH.tar.gzls -l /data1/logs/access.log 時間戳更新logrotate 替代 Nginx 手動切割,功能更豐富xtrabackup 實現熱備份不鎖表