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 | 31 |
Tags
- 크래시로그
- Font
- EUC-KR
- docker
- php
- API
- crashlog
- phpmailer
- MFC
- protobuf-c
- plcrashreporter
- 자바스크립트
- 설치제거
- self-signed ssl
- 기념일관리
- 한 번만 실행
- 와이브로
- .net
- ClickOnce
- Antialiasing
- PDA
- net
- 데이터 전달
- VS2008
- 블루투스 헤드셋
- C#
- GDI
- M8200
- JavaScript
- C/C++
Archives
- Today
- Total
~☆~ 우하하!!~ 개발블로그
[postgresql@16] [ubuntu] 각종 자동화 스크립트 본문
반응형
사용자 생성과 데이터베이스 생성
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!"
반응형
'데이터베이스' 카테고리의 다른 글
[소셜로그인] 소셜 로그인을 위한 회원정보 테이블 구성 (0) | 2024.11.19 |
---|---|
[postgresql@16] [macOS] 각종 자동화 스크립트 (0) | 2024.11.16 |