Files
2026-09-26 11:59:39 +08:00

80 lines
2.4 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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" <<EOF
[client]
host=${MYSQL_HOST}
port=${MYSQL_PORT}
user=${MYSQL_USER}
password=${MYSQL_PASSWORD}
EOF
if ! mysql --defaults-extra-file="$DEFAULTS_TMP" -e "SELECT 1;" >/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"