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

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

데이터베이스

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

iwoohaha 2024. 11. 16. 16:13
728x90
반응형

사용자 생성과 데이터베이스 생성

root 권한 사용자에게 소유권이 부여되면 된다.

#!/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 서비스 상태를 확인합니다..."
sudo systemctl status postgresql | grep "Active: active (running)"

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

# PostgreSQL 슈퍼유저 역할 생성
sudo -u postgres 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

# $DB_USER 사용자 생성
sudo -u postgres psql <<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..."
sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER TEMPLATE template0 LC_COLLATE='C';" 2>/dev/null

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

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

데이터베이스 삭제 와 사용자 삭제

root 권한 사용자에게 소유권이 부여되면 된다.

#!/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..."
sudo -u postgres psql -c "REVOKE CONNECT ON DATABASE $DB_NAME FROM public;" 2>/dev/null
sudo -u postgres psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME';" 2>/dev/null
sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null

# 사용자 삭제 (데이터베이스 삭제 후)
echo "Dropping user $DB_USER if it exists..."
sudo -u postgres psql -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
#     sudo -u postgres psql -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

# 이 스크립트는 sudo 권한을 가진 사용자 또는 root 계정으로 실행되며, 주요 명령은 postgres 계정으로 수행됩니다.

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

DB_NAME="$1"
BACKUP_DIR="$2"

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

# 변수 선언
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 ! sudo -u postgres pg_isready -U postgres -h localhost -p 5432; 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..."
        sudo systemctl 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"
    sudo rm -rf "$BACKUP_ROOT_DIR"
fi

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

# 백업을 수행함 (postgres 계정으로 실행)
BACKUP_FILE="$BACKUP_ROOT_DIR/$DATE_ONLY/${DB_NAME}_${TIME_ONLY}.sql"
sudo -u postgres 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"
sudo -u postgres 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

# 이 스크립트는 sudo 권한을 가진 사용자 또는 root 계정으로 실행되며, 주요 명령은 postgres 계정으로 수행됩니다.

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

DB_NAME="$1"
BACKUP_DIR="$2"

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

# 변수 선언
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 ! sudo -u postgres pg_isready -U postgres -h localhost -p 5432; 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..."
        sudo systemctl 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"
    sudo rm -rf "$BACKUP_ROOT_DIR"
fi

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

# 백업을 수행함 (postgres 계정으로 실행)
BACKUP_FILE="$BACKUP_ROOT_DIR/$DATE_ONLY/${DB_NAME}_schema.sql"
sudo -u postgres 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"
sudo -u postgres 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"

# 백업 파일 압축 해제
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

# PostgreSQL 데이터베이스 복원
echo "Restoring database $DB_NAME from $SQL_FILE..."
sudo -u postgres 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!"
반응형