마에스트로 DB 데이터 백업+삭제, 복원 스크립트
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user