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