본문 바로가기
Programming/Database

[Influx DB] .bat 파일로 정기적으로 DB 백업(+ 복원)

by 째스터 2024. 11. 23.
728x90

Influx DB를 docker로 사용 중인데 가끔 에러 때문에 계속 restart 되는 문제가 있었다.
이럴 때마다 DB를 초기화해야 해서 백업 기능이 있는지 확인해 봤다.

Enterprise 버전에는 UI에서 정기 백업하기 위한 기능을 설정할 수 있나 보다.
https://community.influxdata.com/t/how-to-scheduled-a-backup-of-a-database-in-influxdb-windows/28913

 

How to scheduled a backup of a database in InfluxDB Windows?

Hello I use InfluxDB on Windows. I was wondering if it is possible to scheduled a database backup with the graphical interface like a task or something like that ? Thanks !

community.influxdata.com

 

위 글에서 Influx DB 스탭이 추천한 대로 배치 파일로 만들어 봤다(with GPT).
대충 InfluxDB 컨테이너에서 influx backup 명령어로 백업파일을 만들고 내가 원하는 호스트 경로에 복사한다.

@echo off
@chcp 65001 > nul
REM 설정
set CONTAINER_NAME=influxdb
set BACKUP_DIR=C:\Users\jj272\Downloads\influxDB-backup
set TIMESTAMP=%date%_%time:~0,2%%time:~3,2%%time:~6,2%
set CONTAINER_BACKUP_PATH=/var/lib/influxdb2/backup

if not exist "%BACKUP_DIR%" (
    echo [INFO] 백업 디렉토리가 존재하지 않습니다. 생성 중...
    mkdir "%BACKUP_DIR%"
) else (
    echo [INFO] 백업 디렉토리가 이미 존재합니다.
)

echo [INFO] InfluxDB 컨테이너에서 백업 생성 중...
docker exec %CONTAINER_NAME% influx backup %CONTAINER_BACKUP_PATH%
if %errorlevel% neq 0 (
    echo [ERROR] 컨테이너 내부 백업 생성 실패! 종료합니다.
    exit /b %errorlevel%
)

echo [INFO] 백업 파일을 호스트로 복사 중...
docker cp %CONTAINER_NAME%:%CONTAINER_BACKUP_PATH% %BACKUP_DIR%\%TIMESTAMP%
if %errorlevel% neq 0 (
    echo [ERROR] 백업 파일 복사 실패! 종료합니다.
    exit /b %errorlevel%
)

docker exec %CONTAINER_NAME% rm -rf %CONTAINER_BACKUP_PATH%
if %errorlevel% neq 0 (
    echo [ERROR] 백업 폴더 제거 실패! 종료합니다.
    exit /b %errorlevel%
)

echo [INFO] 오래된 백업 파일(7일 이상된 파일)을 삭제 중...
forfiles /p "%BACKUP_DIR%" /d -7 /c "cmd /c if @isdir==TRUE rmdir /s /q @path"
if %errorlevel% neq 0 (
    echo [WARNING] 오래된 백업 파일 삭제 중 문제가 발생했습니다. 계속 진행합니다.
)

echo [%date% %time%] InfluxDB 백업 완료: %BACKUP_DIR%\%TIMESTAMP% >> %BACKUP_DIR%\backup.log
echo 백업 작업이 완료되었습니다.

 

복원의 경우 백업과 반대다.
호스트에서 컨테이너 내부로 백업 파일을 복사한 후 Influx DB로 restore 한다.

@echo off
@chcp 65001 > nul
REM 설정
set CONTAINER_NAME=influxdb
set BACKUP_DIR=C:\Users\jj272\Downloads\influxDB-backup
set RESTORE_TIMESTAMP=2024-11-20_154515
set CONTAINER_BACKUP_PATH=/var/lib/influxdb2/restore

echo [INFO] 컨테이너 내부에 복원 디렉토리를 생성 중...
docker exec %CONTAINER_NAME% mkdir -p %CONTAINER_BACKUP_PATH%
if %errorlevel% neq 0 (
    echo [ERROR] 컨테이너 내부 디렉토리 생성 실패! 종료합니다.
    exit /b %errorlevel%
)

echo [INFO] 백업 데이터를 컨테이너로 복사 중...
docker cp %BACKUP_DIR%\%RESTORE_TIMESTAMP% %CONTAINER_NAME%:%CONTAINER_BACKUP_PATH%
if %errorlevel% neq 0 (
    echo [ERROR] 백업 데이터 복사 실패! 종료합니다.
    exit /b %errorlevel%
)

echo [INFO] InfluxDB 복원 명령 실행 중...
docker exec %CONTAINER_NAME% influx restore %CONTAINER_BACKUP_PATH%/%RESTORE_TIMESTAMP% --full
if %errorlevel% neq 0 (
    echo [ERROR] 데이터 복원 실패! 종료합니다.
    exit /b %errorlevel%
)

echo [INFO] 복원이 완료되었습니다. 컨테이너 내부 복원 파일 삭제 중...
docker exec %CONTAINER_NAME% rm -rf %CONTAINER_BACKUP_PATH%
if %errorlevel% neq 0 (
    echo [WARNING] 컨테이너 내부 복원 파일 삭제 실패. 수동으로 삭제하세요.
)

echo [INFO] [%date% %time%] InfluxDB 복원이 성공적으로 완료되었습니다.
echo [INFO] 복원 작업이 성공적으로 완료되었습니다.

 


실제로 되는지 확인해 보자.

 

내가 설정한 경로에 .gz 압축파일로 백업된 것을 확인할 수 있었다.

 

 

데이터를 확인하니 잘 동작하는 것 같다.

728x90

댓글