start.sh 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/bin/bash
  2. # ============================================
  3. # 安装定时任务:每天 00:00、12:00 备份生产库 shanxia2.0
  4. # 用法:./start.sh
  5. # ============================================
  6. set -euo pipefail
  7. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  8. BACKUP_SH="$SCRIPT_DIR/backup-mysql.sh"
  9. CONF_FILE="$SCRIPT_DIR/backup.conf"
  10. CRON_TAG="shanxia2.0-mysql-backup"
  11. RED='\033[0;31m'
  12. GREEN='\033[0;32m'
  13. YELLOW='\033[1;33m'
  14. NC='\033[0m'
  15. log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
  16. log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
  17. log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
  18. die() {
  19. log_error "$1"
  20. exit 1
  21. }
  22. if [ ! -f "$CONF_FILE" ]; then
  23. die "缺少 $CONF_FILE ,请先执行: cp backup.conf.example backup.conf 并填写 MYSQL_PASSWORD"
  24. fi
  25. if [ ! -x "$BACKUP_SH" ]; then
  26. chmod +x "$BACKUP_SH" "$SCRIPT_DIR/start.sh" "$SCRIPT_DIR/stop.sh" "$SCRIPT_DIR/status.sh" 2>/dev/null || true
  27. fi
  28. # 从 conf 读日志目录,写入 cron 重定向
  29. # shellcheck disable=SC1090
  30. source "$CONF_FILE"
  31. LOG_DIR="${LOG_DIR:-/iflytek/shanxia2.0/db-backup/logs}"
  32. mkdir -p "$LOG_DIR"
  33. CRON_LOG="$LOG_DIR/cron-backup.log"
  34. CRON_LINE="0 0,12 * * * /bin/bash ${BACKUP_SH} >> ${CRON_LOG} 2>&1 # ${CRON_TAG}"
  35. # 探测依赖
  36. command -v mysql >/dev/null 2>&1 || die "未找到 mysql,请先安装: yum install -y mysql 或 apt-get install -y mysql-client"
  37. command -v mysqldump >/dev/null 2>&1 || die "未找到 mysqldump"
  38. # 先跑一次连通性/配置校验(不强制成功备份也可装 cron;这里做轻量 SELECT)
  39. DEFAULTS_TMP="$(mktemp)"
  40. chmod 600 "$DEFAULTS_TMP"
  41. cat >"$DEFAULTS_TMP" <<EOF
  42. [client]
  43. host=${MYSQL_HOST}
  44. port=${MYSQL_PORT}
  45. user=${MYSQL_USER}
  46. password=${MYSQL_PASSWORD}
  47. EOF
  48. if ! mysql --defaults-extra-file="$DEFAULTS_TMP" -e "SELECT 1;" >/dev/null 2>&1; then
  49. rm -f "$DEFAULTS_TMP"
  50. die "MySQL 连接失败,请检查 backup.conf 中的主机/账号/密码"
  51. fi
  52. rm -f "$DEFAULTS_TMP"
  53. log_info "MySQL 连接正常: ${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}"
  54. # 安装 / 更新 crontab(按标记去重)
  55. EXISTING="$(crontab -l 2>/dev/null || true)"
  56. FILTERED="$(echo "$EXISTING" | grep -v "${CRON_TAG}" || true)"
  57. {
  58. echo "$FILTERED"
  59. echo "$CRON_LINE"
  60. } | grep -v '^$' | crontab -
  61. log_info "已安装 crontab:"
  62. echo " $CRON_LINE"
  63. log_info "日志: $CRON_LOG"
  64. log_info "立即执行一次备份可运行: $BACKUP_SH"
  65. log_info "查看状态: $SCRIPT_DIR/status.sh"
  66. log_info "停止定时备份: $SCRIPT_DIR/stop.sh"