CentOS 上备份 Tomcat 的可执行方案
一 备份范围与准备
二 手动备份与恢复步骤
三 自动化脚本与定时任务
#!/usr/bin/env bash
set -Eeuo pipefail
export LANG=en_US.UTF-8
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 配置区
TOMCAT_HOME="/opt/tomcat"
BACKUP_DIR="/opt/backup/tomcat"
TIMESTAMP=$(date +%Y%m%d%H%M%S)
RETENTION_DAYS=7
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="appuser"
DB_PASS="apppass"
DB_NAME="appdb"
RSYNC_TARGET="user@backup-server:/data/backups/tomcat/"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 0) 如能热备,先尝试用 catalina.sh stop 1 优雅停机(最多等30秒)
HOT_STOP=0
if [ -x "$TOMCAT_HOME/bin/catalina.sh" ]; then
echo "[$(date)] 尝试优雅停机..."
"$TOMCAT_HOME/bin/catalina.sh" stop 30 || true
sleep 5
if ! pgrep -x "java" -u tomcat >/dev/null 2>&1; then
HOT_STOP=1
echo "[$(date)] 优雅停机成功"
else
echo "[$(date)] 优雅停机失败,准备强制停机"
fi
fi
# 1) 备份函数
do_backup() {
local label="$1"; shift
local out="$BACKUP_DIR/${label}_${TIMESTAMP}.tar.gz"
tar -czf "$out" -C "$TOMCAT_HOME" "$@"
echo "[$(date)] 已生成: $out ($(du -h "$out" | awk '{print $1}'))"
}
# 2) 执行备份(尽量热备;若未停机则跳过 work)
if [ "$HOT_STOP" -eq 1 ]; then
do_backup "tomcat_full" "webapps" "conf" "logs" "work" "temp"
else
echo "[$(date)] 未停机,跳过 work 目录以减少不一致风险"
do_backup "tomcat_hot" "webapps" "conf" "logs" "temp"
fi
# 3) 备份数据库(如应用使用数据库)
if command -v mysqldump >/dev/null 2>&1; then
DB_DUMP="$BACKUP_DIR/db_${DB_NAME}_${TIMESTAMP}.sql.gz"
mysqldump -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" \
| gzip > "$DB_DUMP"
echo "[$(date)] 已生成: $DB_DUMP ($(du -h "$DB_DUMP" | awk '{print $1}'))"
fi
# 4) 清理旧备份
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +"$RETENTION_DAYS" -delete
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +"$RETENTION_DAYS" -delete
echo "[$(date)] 旧备份清理完成(保留近 $RETENTION_DAYS 天)"
# 5) 如之前停机,则启动
if [ "$HOT_STOP" -eq 1 ]; then
"$TOMCAT_HOME/bin/catalina.sh" start
echo "[$(date)] Tomcat 已启动"
fi
# 6) 可选:异地同步(需配置免密 SSH)
if [ -n "${RSYNC_TARGET}" ]; then
rsync -avz --partial --bwlimit=10240 "$BACKUP_DIR/" "$RSYNC_TARGET" && \
echo "[$(date)] 已同步到 $RSYNC_TARGET" || \
echo "[$(date)] 同步失败,请检查网络与 SSH 免密配置"
fi
四 恢复与验证
五 关键注意事项