150 lines
4.3 KiB
Bash
150 lines
4.3 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# restore_maestro.sh
|
|
# ------------------------------------------------------------
|
|
# backup_maestro.sh 로 만든 백업(.sql) 파일을 지정한 DB에
|
|
# 복원하는 스크립트.
|
|
#
|
|
# 사용법:
|
|
# chmod +x restore_maestro.sh
|
|
# ./restore_maestro.sh <backup_file.sql> # 운영 DB (기본)
|
|
# ./restore_maestro.sh --test <backup_file.sql> # 테스트 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] <backup_file.sql>"
|
|
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] <backup_file.sql>"
|
|
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_<MaestroID>_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
|