- 백업 쉘 스크립트
- 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