카테고리 없음

Postgresql 백업스크립트

ksk04 2025. 12. 27. 18:22

  • 백업 쉘 스크립트
  • postgres 게정에서 수행
  • crontab
0 2 * * * su - postgres-c "/backup/scripts/Pg_Base_Backup.sh"
  • 쉘 스크립트
#!/bin/bash

# 백업 루트 디렉토리
BACKUP_ROOT="/data/hotbackup"

# 날짜 (YYYYMMDD)
BACKUP_DATE=$(date +%Y%m%d)

# 오늘 백업 임시 경로 및 압축 파일
TEMP_DIR="${BACKUP_ROOT}/tmp_${BACKUP_DATE}"
BACKUP_FILE="${BACKUP_ROOT}/${BACKUP_DATE}.tar.gz"

# 오래된 백업 삭제 (7일 초과된 .tar.gz만 삭제)
find "$BACKUP_ROOT" -maxdepth 1 -type f -name "[0-9]*.tar.gz" -mtime +7 -exec rm -f {} \\;

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting pg_basebackup to $TEMP_DIR"

# 디렉토리 생성
mkdir -p "$TEMP_DIR"

# pg_basebackup 실행 (tar 포맷, WAL 포함)
pg_basebackup -D "$TEMP_DIR" -F tar -X fetch -P -v

if [ $? -eq 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup succeeded, compressing..."
    tar -czf "$BACKUP_FILE" -C "$TEMP_DIR" .
    rm -rf "$TEMP_DIR"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup completed successfully: $BACKUP_FILE"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup failed!"
    rm -rf "$TEMP_DIR"
    exit 1
fi

  • 백업 파일 생성 예
drwx------. 2 ontune ontune 69 Jun 16 01:42 20250616
  • 윈도우 서버의 경우 아래의 명령을 .bat 파일로 저장후 스케줄러에 등록
@echo off
setlocal enabledelayedexpansion

REM PostgreSQL 실행 파일 경로
set PG_BIN="C:\\Program Files\\PostgreSQL\\13\\bin\\pg_basebackup.exe"

REM 백업 저장할 상위 경로
set BACKUP_ROOT=E:\\backup\\pg_backup

REM PostgreSQL 접속 정보
set PG_HOST=127.0.0.1
set PG_PORT=5432
set PG_USER=postgres
set PGPASSWORD=1234

:LOOP

REM wmic 이용해 현재 날짜를 YYYYMMDD 형태로 가져오기
for /f "skip=1 tokens=1 delims=." %%x in ('wmic os get LocalDateTime') do (
  set dt=%%x
  goto gotDate
)
:gotDate
set yyyy=%dt:~0,4%
set mm=%dt:~4,2%
set dd=%dt:~6,2%

set BACKUP_DIR=%BACKUP_ROOT%\\pg_backup_%yyyy%_%mm%_%dd%

echo [%date% %time%] Starting backup - folder: %BACKUP_DIR%

REM 7일 지난 백업 폴더 자동 삭제
echo Deleting backup folders older than 7 days...
forfiles /p "%BACKUP_ROOT%" /m "pg_backup_*" /d -7 /c "cmd /c if @isdir==TRUE rmdir /s /q @path"

REM 오늘 백업 폴더가 있으면 삭제
if exist "%BACKUP_DIR%" (
    echo Deleting existing backup folder for today...
    rmdir /s /q "%BACKUP_DIR%"
)

REM 백업 실행
echo Running backup...
%PG_BIN% -D "%BACKUP_DIR%" -Fp -Xs -P -v -h %PG_HOST% -p %PG_PORT% -U %PG_USER%
if errorlevel 1 (
    echo Backup failed! Retrying in 1 minute...
    timeout /t 60 /nobreak >nul
    goto LOOP
)

echo Backup succeeded [%date% %time%]

REM 24시간 대기 (86400초)
timeout /t 86400 /nobreak >nul

goto LOOP