#!/bin/bash

# ==========================================================
# MySQL 데이터베이스 복사 스크립트
# 작성일: 2026-02-14
# 설명: 원본 서버의 DB를 복원 서버로 직접 스트리밍 복사
# ==========================================================

# [기본값 설정]
DEF_SRC_IP="192.168.56.201"
DEF_SRC_LIST=""
DEF_TAG_IP="192.168.56.202"
DEF_TAG_LIST=""

# [설정] 접속 계정 정보
SRC_DB_USER="root"
SRC_DB_PW="@smartserver"
TAG_DB_USER="root"
TAG_DB_PW="@smartserver"

# 웹(파라미터) / 터미널(대화형) 분기
if [ "$#" -gt 0 ]; then
    # 파라미터가 있을 경우 (웹 모드)
    SOURCE_DB_IP=${1:-$DEF_SRC_IP}
    
    SOURCE_DB_LIST=${2:-$DEF_SRC_LIST}
    SOURCE_DB_LIST=$(echo "$SOURCE_DB_LIST" | tr '[:lower:]' '[:upper:]')
    
    TARGET_DB_IP=${3:-$DEF_TAG_IP}
    
    TARGET_DB_LIST=${4:-$SOURCE_DB_LIST}
    TARGET_DB_LIST=$(echo "$TARGET_DB_LIST" | tr '[:lower:]' '[:upper:]')
else
    # 파라미터가 없을 경우 (대화형 모드)
    echo "----------------------------------------------------"
    echo "  MySQL 데이터베이스 복사 설정을 시작합니다."
    echo "  (입력 없이 Enter를 누르면 기본값이 사용됩니다.)"
    echo "----------------------------------------------------"

    read -p "1. 원본 서버 IP (기본: $DEF_SRC_IP): " SOURCE_DB_IP
    SOURCE_DB_IP=${SOURCE_DB_IP:-$DEF_SRC_IP}

    read -p "2. 원본 DB 이름 (기본: 전체): " SOURCE_DB_LIST
    SOURCE_DB_LIST=${SOURCE_DB_LIST:-$DEF_SRC_LIST}
    SOURCE_DB_LIST=$(echo "$SOURCE_DB_LIST" | tr '[:lower:]' '[:upper:]')

    read -p "3. 복원 서버 IP (기본: $DEF_TAG_IP): " TARGET_DB_IP
    TARGET_DB_IP=${TARGET_DB_IP:-$DEF_TAG_IP}

    read -p "4. 복원 DB 이름 (기본: 원본과 동일): " TARGET_DB_LIST
    TARGET_DB_LIST=${TARGET_DB_LIST:-$SOURCE_DB_LIST}
    TARGET_DB_LIST=$(echo "$TARGET_DB_LIST" | tr '[:lower:]' '[:upper:]')

    echo ""
    echo "----------------------------------------------------"
    echo " [입력 정보 확인]"
    echo " > 원본 서버 IP: $SOURCE_DB_IP"
    echo " > 복원 서버 IP: $TARGET_DB_IP"
    echo "----------------------------------------------------"
    read -p " 위 정보를 확인하셨습니까? (Enter를 누르면 시작합니다)" CONFIRM
fi

TARGET_IP_ARRAY=(${TARGET_DB_IP//,/ })

if [ -z "$SOURCE_DB_LIST" ]; then
 MYSQL_PWD="$SRC_DB_PW" mysql -h "$SOURCE_DB_IP" -u "$SRC_DB_USER" -e "SHOW DATABASES;" 2>/dev/null > /tmp/db_list.txt
 SOURCE_DB_LIST=$(cat /tmp/db_list.txt | grep -Ev "(Database|information_schema|performance_schema|mysql|sys|dbo)" | tr '\n' ',' | sed 's/,$//')
 TARGET_DB_LIST=${TARGET_DB_LIST:-$SOURCE_DB_LIST}
 rm -f /tmp/db_list.txt
fi

SOURCE_DB_ARRAY=(${SOURCE_DB_LIST//,/ })
TARGET_DB_ARRAY=(${TARGET_DB_LIST//,/ })

for T_IP in "${TARGET_IP_ARRAY[@]}"; do
    T_IP_CLEAN="${T_IP// /}"
    if [ "$SOURCE_DB_IP" == "$T_IP_CLEAN" ] && [ "$SOURCE_DB_LIST" == "$TARGET_DB_LIST" ]; then
     echo "오류: 동일 서버($T_IP_CLEAN) 내에서 원본과 대상의 DB명이 같을 수 없습니다."
     exit 1
    fi
done

if [ ${#SOURCE_DB_ARRAY[@]} -ne ${#TARGET_DB_ARRAY[@]} ]; then
 echo "오류: 원본 DB 개수(${#SOURCE_DB_ARRAY[@]})와 대상 DB 개수(${#TARGET_DB_ARRAY[@]})가 일치하지 않습니다."
 exit 1
fi

START_DATETIME=$(date "+%Y-%m-%d %H:%M:%S")

echo ""
echo "복원 시작: $START_DATETIME"
echo "----------------------------------------------------"

for T_IP in "${TARGET_IP_ARRAY[@]}"
do
 CURRENT_TARGET_IP="${T_IP// /}"
 echo ""
 echo "===================================================="
 echo " [타겟 서버: $CURRENT_TARGET_IP] 복사 진행"
 echo "===================================================="

 for i in "${!SOURCE_DB_ARRAY[@]}"
 do
  SOURCE_DATA="${SOURCE_DB_ARRAY[$i]}"
  TARGET_DATA="${TARGET_DB_ARRAY[$i]}"
  
  if [ -z "$TARGET_DATA" ]; then
    TARGET_DATA="$SOURCE_DATA"
  fi
  
  echo "[$SOURCE_DATA] -> [$CURRENT_TARGET_IP:$TARGET_DATA] 복사 중..."

  MYSQL_PWD="$TAG_DB_PW" mysql -h "$CURRENT_TARGET_IP" -u "$TAG_DB_USER" -e "CREATE DATABASE IF NOT EXISTS \`$TARGET_DATA\`;" 2>/dev/null

  MYSQL_PWD="$SRC_DB_PW" mysqldump -h "$SOURCE_DB_IP" -u "$SRC_DB_USER" --opt --single-transaction "$SOURCE_DATA" 2>/tmp/mysqldump_error.log | \
  MYSQL_PWD="$TAG_DB_PW" mysql -h "$CURRENT_TARGET_IP" -u "$TAG_DB_USER" "$TARGET_DATA" 2>/tmp/mysql_error.log

  PIPE_STATUS=(${PIPESTATUS[@]})
  
  if [ ${PIPE_STATUS[0]} -eq 0 ] && [ ${PIPE_STATUS[1]} -eq 0 ]; then
      echo "[$SOURCE_DATA] -> [$CURRENT_TARGET_IP:$TARGET_DATA] 복원완료"
  else
      echo ">>> [실패] $SOURCE_DATA -> $CURRENT_TARGET_IP:$TARGET_DATA 복사 중 에러 발생"
      if [ -s /tmp/mysqldump_error.log ]; then
          grep -vi "Warning" /tmp/mysqldump_error.log
      fi
      if [ -s /tmp/mysql_error.log ]; then
          grep -vi "Warning" /tmp/mysql_error.log
      fi
  fi
 done
done

END_DATETIME=$(date "+%Y-%m-%d %H:%M:%S")

echo "----------------------------------------------------"
echo "복원 완료: $END_DATETIME"
echo "----------------------------------------------------"