80 lines
2.4 KiB
Bash
Executable File
80 lines
2.4 KiB
Bash
Executable File
#!/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"
|