首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Linux 定時備份 MySQL 與 Nginx Access Log 切割 Shell 腳本實戰 Linux 定時備份 MySQL 與 Nginx Access Log 切割 Shell 腳本實戰

     編輯:MySQL 資料庫相關知識

生產環境需自動化備份資料庫與輪轉日誌。本文提供兩個可直接部署至 /etc/cron.hourly/ 的 Shell 腳本:MySQL 逐小時備份保留 3 天、Nginx access.log 逐小時切割保留 3 天,含壓縮、清理舊檔、平滑重新開啟日誌完整流程。

一、MySQL 逐小時備份腳本

#!/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

二、Nginx Access Log 逐小時切割腳本

#!/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

平滑切割原理

  1. 壓縮並刪除 access.log(檔案實體仍存在於磁碟,Nginx 進程持有開啟描述符繼續寫入)
  2. kill -USR1 觸發 Nginx 重新開啟日誌檔案,產生新的 access.log
  3. 舊檔案描述符關閉,磁碟空間真正釋放

三、部署與驗證清單

  1. 腳本存放於 /etc/cron.hourly/ 並具備執行權限:chmod +x /etc/cron.hourly/*.sh
  2. 確認 cron 服務運行:systemctl status crond
  3. 手動測試執行:/etc/cron.hourly/mysql_backup.sh
  4. 檢查備份目錄生成 db-YYYY-MM-DD-HH.tar.gz 及 access-YYYY-MM-DD-HH.tar.gz
  5. 驗證 Nginx 重新開啟日誌:ls -l /data1/logs/access.log 時間戳更新
  6. 確認舊檔自動清理機制生效

四、進階擴充建議

  • 加入備份成功/失敗通知(郵件、Slack、Webhook)
  • 將備份同步至遠端儲存(rsync、S3、OSS)
  • 使用 logrotate 替代 Nginx 手動切割,功能更豐富
  • MySQL 備份改用 xtrabackup 實現熱備份不鎖表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved