Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 크래시로그
- 한 번만 실행
- 설치제거
- API
- GDI
- C/C++
- docker
- M8200
- 기념일관리
- 와이브로
- VS2008
- plcrashreporter
- .net
- net
- 데이터 전달
- Antialiasing
- php
- 블루투스 헤드셋
- ClickOnce
- 자바스크립트
- MFC
- phpmailer
- EUC-KR
- PDA
- C#
- JavaScript
- Font
- self-signed ssl
- protobuf-c
- crashlog
Archives
- Today
- Total
~☆~ 우하하!!~ 개발블로그
[postgresql@16] [macOS] 각종 자동화 스크립트 본문
728x90
반응형
사용자 생성과 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!"
반응형
'데이터베이스' 카테고리의 다른 글
소셜 로그인을 위한 회원정보 테이블 구성 (0) | 2024.11.19 |
---|---|
[postgresql@16] [ubuntu] 각종 자동화 스크립트 (0) | 2024.11.16 |