#!/usr/bin/env bash # # restore_maestro.sh # ------------------------------------------------------------ # backup_maestro.sh 로 만든 백업(.sql) 파일을 지정한 DB에 # 복원하는 스크립트. # # 사용법: # chmod +x restore_maestro.sh # ./restore_maestro.sh # 운영 DB (기본) # ./restore_maestro.sh --test # 테스트 DB # ------------------------------------------------------------ set -euo pipefail # Synology NAS 의 MariaDB10 패키지 바이너리 경로. # 기본 PATH 에 포함되지 않는 경우가 많아 명시적으로 추가합니다. export PATH="$PATH:/var/packages/MariaDB10/target/usr/local/mariadb10.11/bin" # ===================== DB 접속 정보 ===================== # 운영 DB (기본) PROD_DB_HOST="chocomae.jinaju.com" PROD_DB_PORT="3306" PROD_DB_USER="chocomae" PROD_DB_NAME="chocomae" # 테스트 DB (--test 옵션으로 활성화) TEST_DB_HOST="mariadb.jisangs.com" TEST_DB_PORT="30001" TEST_DB_USER="chocomae" TEST_DB_NAME="chocomae" # ========================================================= # ---- 인자 파싱 (순서 자유: --test 는 앞/뒤 어디에 와도 됨) ---- USE_TEST=false BACKUP_FILE="" while [ $# -gt 0 ]; do case "$1" in -t|--test) USE_TEST=true shift ;; -h|--help) echo "사용법: $0 [--test] " exit 0 ;; -*) echo "알 수 없는 옵션: $1" exit 1 ;; *) if [ -z "$BACKUP_FILE" ]; then BACKUP_FILE="$1" else echo "인자가 너무 많습니다: $1" exit 1 fi shift ;; esac done if [ -z "$BACKUP_FILE" ]; then echo "사용법: $0 [--test] " exit 1 fi if [ ! -f "$BACKUP_FILE" ]; then echo "파일을 찾을 수 없습니다: $BACKUP_FILE" exit 1 fi # ---- 대상 DB 확정 ---- if [ "$USE_TEST" = true ]; then DB_HOST="$TEST_DB_HOST" DB_PORT="$TEST_DB_PORT" DB_USER="$TEST_DB_USER" DB_NAME="$TEST_DB_NAME" TARGET_LABEL="TEST" else DB_HOST="$PROD_DB_HOST" DB_PORT="$PROD_DB_PORT" DB_USER="$PROD_DB_USER" DB_NAME="$PROD_DB_NAME" TARGET_LABEL="PROD" fi # Synology NAS 에서는 mariadb CLI 로 설치되는 경우가 많습니다. if command -v mariadb >/dev/null 2>&1; then MYSQL_CMD="mariadb" elif command -v mysql >/dev/null 2>&1; then MYSQL_CMD="mysql" else echo "mariadb / mysql 명령을 찾을 수 없습니다. NAS 에 MariaDB client 를 먼저 설치하세요." exit 1 fi # 파일명 규칙: maestro__backup_<타임스탬프>.sql # 규칙에 맞으면 MaestroID 를 뽑아 안내에 노출합니다. (없어도 복원은 정상 동작) BACKUP_BASENAME=$(basename "$BACKUP_FILE") DETECTED_MAESTRO_ID="" if [[ "$BACKUP_BASENAME" =~ ^maestro_([0-9]+)_backup_ ]]; then DETECTED_MAESTRO_ID="${BASH_REMATCH[1]}" fi echo "복원 대상 : [${TARGET_LABEL}] ${DB_USER}@${DB_HOST}:${DB_PORT}/${DB_NAME}" echo "백업 파일 : ${BACKUP_FILE}" if [ -n "$DETECTED_MAESTRO_ID" ]; then echo "MaestroID : ${DETECTED_MAESTRO_ID} (파일명에서 추출)" else echo "MaestroID : (파일명 규칙과 달라 확인 불가)" fi echo echo "주의: 이미 동일한 MaestroID 데이터가 대상 DB에 존재하면" echo " Primary/Unique Key 충돌로 실패할 수 있습니다." echo " (신규 서버 또는 데이터가 없는 상태에서 복원을 권장)" echo read -r -p "계속 진행하시겠습니까? (y/N) " CONFIRM if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then echo "취소되었습니다." exit 0 fi # 운영 서버 대상일 경우 실수 방지용 재확인. if [ "$TARGET_LABEL" = "PROD" ]; then echo echo "!! 대상은 운영(PROD) DB 입니다. 실제 데이터가 변경됩니다." read -r -p "계속하려면 'PROD' 를 입력하세요: " PROD_CONFIRM if [ "$PROD_CONFIRM" != "PROD" ]; then echo "취소되었습니다." exit 0 fi fi read -r -s -p "DB(${DB_USER}@${DB_HOST}) 비밀번호: " DB_PASS echo export MYSQL_PWD="$DB_PASS" echo ">> 복원을 시작합니다..." if "$MYSQL_CMD" --protocol=TCP --default-character-set=utf8mb4 \ -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" "$DB_NAME" < "$BACKUP_FILE"; then echo "복원이 완료되었습니다." else echo "복원 중 오류가 발생했습니다. 백업 파일 내용과 대상 DB 스키마를 확인하세요." unset MYSQL_PWD exit 1 fi unset MYSQL_PWD