#!/bin/bash # ============================================ # 安装定时任务:每天 00:00、12:00 备份生产库 shanxia2.0 # 用法:./start.sh # ============================================ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKUP_SH="$SCRIPT_DIR/backup-mysql.sh" CONF_FILE="$SCRIPT_DIR/backup.conf" CRON_TAG="shanxia2.0-mysql-backup" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } die() { log_error "$1" exit 1 } if [ ! -f "$CONF_FILE" ]; then die "缺少 $CONF_FILE ,请先执行: cp backup.conf.example backup.conf 并填写 MYSQL_PASSWORD" fi if [ ! -x "$BACKUP_SH" ]; then chmod +x "$BACKUP_SH" "$SCRIPT_DIR/start.sh" "$SCRIPT_DIR/stop.sh" "$SCRIPT_DIR/status.sh" 2>/dev/null || true fi # 从 conf 读日志目录,写入 cron 重定向 # shellcheck disable=SC1090 source "$CONF_FILE" LOG_DIR="${LOG_DIR:-/iflytek/shanxia2.0/db-backup/logs}" mkdir -p "$LOG_DIR" CRON_LOG="$LOG_DIR/cron-backup.log" CRON_LINE="0 0,12 * * * /bin/bash ${BACKUP_SH} >> ${CRON_LOG} 2>&1 # ${CRON_TAG}" # 探测依赖 command -v mysql >/dev/null 2>&1 || die "未找到 mysql,请先安装: yum install -y mysql 或 apt-get install -y mysql-client" command -v mysqldump >/dev/null 2>&1 || die "未找到 mysqldump" # 先跑一次连通性/配置校验(不强制成功备份也可装 cron;这里做轻量 SELECT) DEFAULTS_TMP="$(mktemp)" chmod 600 "$DEFAULTS_TMP" cat >"$DEFAULTS_TMP" </dev/null 2>&1; then rm -f "$DEFAULTS_TMP" die "MySQL 连接失败,请检查 backup.conf 中的主机/账号/密码" fi rm -f "$DEFAULTS_TMP" log_info "MySQL 连接正常: ${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}" # 安装 / 更新 crontab(按标记去重) EXISTING="$(crontab -l 2>/dev/null || true)" FILTERED="$(echo "$EXISTING" | grep -v "${CRON_TAG}" || true)" { echo "$FILTERED" echo "$CRON_LINE" } | grep -v '^$' | crontab - log_info "已安装 crontab:" echo " $CRON_LINE" log_info "日志: $CRON_LOG" log_info "立即执行一次备份可运行: $BACKUP_SH" log_info "查看状态: $SCRIPT_DIR/status.sh" log_info "停止定时备份: $SCRIPT_DIR/stop.sh"