~☆~ 우하하!!~ 개발블로그

[postgresql@16] [macOS] 각종 자동화 스크립트 본문

데이터베이스

[postgresql@16] [macOS] 각종 자동화 스크립트

iwoohaha 2024. 11. 16. 15:37
반응형

사용자 생성과 DB 생성 스크립트

반드시 homebrew 가 설치되어 있는 상태여야 하고,

homebrew 를 이용하여 postgresql 을 설치한 상태여야 한다.

#!/bin/bash

# 파라미터 확인 및 변수 할당
if [ "$#" -ne 3 ]; then
    echo "Usage: $0 <DB_NAME> <DB_USER> <DB_PASSWORD>"
    exit 1
fi

DB_NAME="$1"
DB_USER="$2"
DB_PASSWORD="$3"

# PostgreSQL 서비스 상태 확인
echo "PostgreSQL 서비스 상태를 확인합니다..."
brew services list | grep "postgresql" | grep "started"

# PostgreSQL 버전 확인
echo "PostgreSQL 버전 확인:"
psql --version

# PostgreSQL 슈퍼유저 역할 생성
psql postgres <<EOF
DO \$\$
BEGIN
   IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'postgres') THEN
      CREATE USER postgres WITH SUPERUSER;
      RAISE NOTICE 'Role postgres created with SUPERUSER privileges.';
   ELSE
      RAISE NOTICE 'Role postgres already exists as SUPERUSER.';
   END IF;
END
\$\$;
EOF

# orca_user 사용자 생성
psql -U postgres <<EOF
DO \$\$
BEGIN
   IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$DB_USER') THEN
      CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
      RAISE NOTICE 'User $DB_USER created.';
   ELSE
      RAISE NOTICE 'User $DB_USER already exists.';
   END IF;
END
\$\$;
EOF

# 데이터베이스 생성 (함수 외부에서 직접 실행)
echo "Creating database $DB_NAME with owner $DB_USER..."
psql -U postgres -c "CREATE DATABASE $DB_NAME OWNER $DB_USER TEMPLATE template0 LC_COLLATE='C';" 2>/dev/null

# 권한 부여
psql -U postgres <<EOF
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
EOF

echo "$DB_USER 사용자와 $DB_NAME 데이터베이스 생성이 완료되었습니다."

DB 삭제와 사용자 삭제 

#!/bin/bash

# 파라미터 확인 및 변수 할당
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <DB_NAME> <DB_USER>"
    exit 1
fi

DB_NAME="$1"
DB_USER="$2"

# 데이터베이스 연결 종료 및 삭제
echo "Dropping database $DB_NAME if it exists..."
psql -U postgres -c "REVOKE CONNECT ON DATABASE $DB_NAME FROM public;" 2>/dev/null
psql -U postgres -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME';" 2>/dev/null
psql -U postgres -c "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null

# 사용자 삭제 (데이터베이스 삭제 후)
echo "Dropping user $DB_USER if it exists..."
psql -U postgres -c "DROP USER IF EXISTS $DB_USER;" 2>/dev/null

# # postgres 역할 삭제 (현재 사용자로 로그인되지 않은 상태에서만 가능)
# echo "Dropping role 'postgres' if it exists and not in use..."
# if [ "$(whoami)" != "postgres" ]; then
#     psql -U postgres -c "DROP USER IF EXISTS postgres;" 2>/dev/null
# else
#     echo "Cannot drop 'postgres' role as you are currently logged in as 'postgres'."
# fi

echo "Reversion of PostgreSQL setup completed: Database $DB_NAME, user $DB_USER."

DB전체 백업

#!/bin/bash

# 이 스크립트는 postgres 계정으로 실행된다.

# 파라미터 확인 및 변수 할당
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <DB_NAME> <BACKUP_DIR>"
    exit 1
fi

DB_NAME="$1"
BACKUP_DIR="${2%/}"  # 마지막 '/' 제거

# 변수 선언
BACKUP_ROOT_DIR="$BACKUP_DIR/backup_$DB_NAME"
DATE_ONLY=$(date +"%Y%m%d")  # 날짜만 포함
TIME_ONLY=$(date +"%H%M%S")  # 백업 시각
MAX_RETRIES=5
RETRY_INTERVAL=10
retry_count=0

echo "Checking if PostgreSQL server is running..."
while ! psql -U postgres -c '\q' 2>/dev/null; do
    if [ "$retry_count" -ge "$MAX_RETRIES" ]; then
        echo "PostgreSQL server is not running after $MAX_RETRIES attempts. Exiting backup process."
        exit 1
    fi
    
    if [ "$retry_count" -eq 0 ]; then
        echo "Starting PostgreSQL service..."
        brew services start postgresql
    fi
    
    echo "PostgreSQL server is not ready. Retrying in $RETRY_INTERVAL seconds... (Attempt $((retry_count + 1))/$MAX_RETRIES)"
    sleep "$RETRY_INTERVAL"
    retry_count=$((retry_count + 1))
done

echo "PostgreSQL server is running. Proceeding with backup."

# 기존 백업 디렉토리가 존재하면 삭제 후 작업
if [ -d "$BACKUP_ROOT_DIR" ]; then
    echo "Removing existing backup directory: $BACKUP_ROOT_DIR"
    rm -rf "$BACKUP_ROOT_DIR"
fi

# 새 백업 디렉터리 생성
mkdir -p "$BACKUP_ROOT_DIR/$DATE_ONLY"

# 백업을 수행함
BACKUP_FILE="$BACKUP_ROOT_DIR/$DATE_ONLY/${DB_NAME}_${TIME_ONLY}.sql"
pg_dump -F plain --clean --if-exists -d $DB_NAME -f "$BACKUP_FILE"

# 백업 성공 여부 확인
if [ $? -ne 0 ]; then
    echo "Backup failed. Exiting script."
    exit 1
fi

echo "$DB_NAME backuped to file: $BACKUP_FILE"

# 백업 파일 압축
BACKUP_ARCHIVE="$BACKUP_ROOT_DIR/$DATE_ONLY/${DB_NAME}_${TIME_ONLY}.tar.gz"
tar -czvf "$BACKUP_ARCHIVE" -C "$BACKUP_ROOT_DIR/$DATE_ONLY" "${DB_NAME}_${TIME_ONLY}.sql"
echo "Backup file compressed to $BACKUP_ARCHIVE"

DB 스키마만 백업

#!/bin/bash

# 이 스크립트는 postgres 계정으로 실행된다.

# 파라미터 확인 및 변수 할당
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <DB_NAME> <BACKUP_DIR>"
    exit 1
fi

DB_NAME="$1"
BACKUP_DIR="${2%/}"  # 마지막 '/' 제거

# 변수 선언
BACKUP_ROOT_DIR="$BACKUP_DIR/backup_$DB_NAME"
DATE_ONLY=$(date +"%Y%m%d")  # 날짜만 포함
TIME_ONLY=$(date +"%H%M%S")  # 백업 시각
MAX_RETRIES=5
RETRY_INTERVAL=10
retry_count=0

echo "Checking if PostgreSQL server is running..."
while ! psql -U postgres -c '\q' 2>/dev/null; do
    if [ "$retry_count" -ge "$MAX_RETRIES" ]; then
        echo "PostgreSQL server is not running after $MAX_RETRIES attempts. Exiting backup process."
        exit 1
    fi
    
    if [ "$retry_count" -eq 0 ]; then
        echo "Starting PostgreSQL service..."
        brew services start postgresql
    fi
    
    echo "PostgreSQL server is not ready. Retrying in $RETRY_INTERVAL seconds... (Attempt $((retry_count + 1))/$MAX_RETRIES)"
    sleep "$RETRY_INTERVAL"
    retry_count=$((retry_count + 1))
done

echo "PostgreSQL server is running. Proceeding with backup."

# 기존 백업 디렉토리가 존재하면 삭제 후 작업
if [ -d "$BACKUP_ROOT_DIR" ]; then
    echo "Removing existing backup directory: $BACKUP_ROOT_DIR"
    rm -rf "$BACKUP_ROOT_DIR"
fi

# 새 백업 디렉터리 생성
mkdir -p "$BACKUP_ROOT_DIR/$DATE_ONLY"

# 백업을 수행함
BACKUP_FILE="$BACKUP_ROOT_DIR/$DATE_ONLY/${DB_NAME}_schema.sql"
pg_dump -F plain --clean --if-exists --schema-only -d $DB_NAME -f "$BACKUP_FILE"

# 백업 성공 여부 확인
if [ $? -ne 0 ]; then
    echo "Backup failed. Exiting script."
    exit 1
fi

echo "$DB_NAME backuped to file: $BACKUP_FILE"

# 백업 파일 압축
BACKUP_ARCHIVE="$BACKUP_ROOT_DIR/$DATE_ONLY/${DB_NAME}_schema.tar.gz"
tar -czvf "$BACKUP_ARCHIVE" -C "$BACKUP_ROOT_DIR/$DATE_ONLY" "${DB_NAME}_schema.sql"
echo "Backup file compressed to $BACKUP_ARCHIVE"

DB 복원

#!/bin/bash

# 파라미터 확인 및 변수 할당
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <DB_NAME> <FULL_BACKUP_ARCHIVE>"
    exit 1
fi

DB_NAME="$1"
FULL_BACKUP_ARCHIVE="$2"

RESTORE_DIR="/tmp/restore"
# 기존 디렉토리가 존재하면 삭제 후 작업
if [ -d "$RESTORE_DIR" ]; then
    echo "Removing existing restore directory: $RESTORE_DIR"
    sudo rm -rf "$RESTORE_DIR"
fi
mkdir -p $RESTORE_DIR

# 4. 백업 파일 압축 해제
echo "Extracting backup file..."
tar -xzvf "$FULL_BACKUP_ARCHIVE" -C "$RESTORE_DIR"

# .sql 파일 찾기
SQL_FILE=$(find "$RESTORE_DIR" -name "*.sql")

if [ -z "$SQL_FILE" ]; then
    echo "No SQL file found after extracting backup. Exiting."
    exit 1
fi

# 5. PostgreSQL 데이터베이스 복원
echo "Restoring database $DB_NAME from $SQL_FILE..."
psql -d "$DB_NAME" -f "$SQL_FILE"

if [ $? -eq 0 ]; then
    echo "Database $DB_NAME restored successfully from $SQL_FILE."
else
    echo "Database restoration failed."
    exit 1
fi

echo "Database restoration process completed!"
반응형