centos

CentOS Tomcat如何备份数据

小樊
40
2025-12-07 18:06:31
栏目: 智能运维

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

四 恢复与验证

五 关键注意事项

0
看了该问题的人还看了