본문 바로가기

DB/Mysql(MariaDB)

MariaDB - backup.sh / backup.bat

728x90

데이터베이스를 관리하다 보면 백업은 중요한 업무 중 하나입니다. 백업 파일을 효율적으로 관리하기 위해 특정 테이블을 제외하고 백업을 생성, 압축, 특정 기간 동안 보관한 후 자동으로 삭제하는 스크립트를 작성하면 업무에 도움이 됩니다.

 

1. mysqldump 개요

mysqldump는 데이터를 덤프 파일로 내보내는 도구로, 일반적으로 콜드 백업 도구로 간주됩니다. 테이블에 락을 걸거나 일관된 스냅샷을 얻기 위해 데이터를 일시적으로 정지시키기 때문에, 백업 중에는 데이터베이스의 쓰기 작업이 일시적으로 중단될 수 있습니다.

mysqldump는 기본적으로 읽기 락을 사용하지만, InnoDB 테이블에서는 --single-transaction 옵션을 사용하여 테이블 락을 피할 수 있습니다. 이 옵션을 사용하면 트랜잭션 시작 시점의 상태를 백업할 수 있습니다.

 

아래 링크를 참고하시면 DB 백업 및 복구에 대해서 알 수 있습니다.

 

MariaDB - DB 백업 및 복구하기

MariaDB 백업 방법 MariaDB 데이터베이스를 백업하는 방법 중 두 가지 자주 사용하는 백업 방법을 알아봅니다. 1. mysqldump 명령어를 이용한 백업 방법 mysqldump 명령어를 사용하면 MariaDB 데이터베이스의

samso.tistory.com

 

2. 백업 스크립트 작성 - Linux에서 사용 (backup.sh)

#!/bin/bash

# 백업 디렉터리 설정
BACKUP_DIR="/samso/DB_BACKUP"
LOG_FILE="$BACKUP_DIR/dbbackup.log"

# MySQL 정보 설정
DB_USER="root"
DB_PASSWORD="samso"
DB_NAME="samsodb"

# 제외할 테이블 설정
IGNORE_TABLES=("tb_user" "tb_userlog") # 제외할 테이블명

# 날짜 설정
TODAY=$(date +"%Y-%m-%d")
TIME=$(date +"%Y-%m-%d %H:%M:%S")

# 제외할 테이블 옵션 설정
IGNORE_TABLES_STRING=""
for TABLE in "${IGNORE_TABLES[@]}"; do
    IGNORE_TABLES_STRING+=" --ignore-table=${DB_NAME}.${TABLE}"
done

# 백업 생성
mysqldump -u $DB_USER -p$DB_PASSWORD --single-transaction --skip-lock-tables $IGNORE_TABLES_STRING $DB_NAME > $BACKUP_DIR/$DB_NAME-$TODAY.sql

# 하루 지난 백업 파일 압축
find $BACKUP_DIR -type f -name "*.sql" -mtime +0 | while read file; do
    gzip "$file"
    mv "$file.gz" "$BACKUP_DIR/${file##*/}-$TODAY.gz"
done

# 2주 지난 백업 파일 삭제 (삭제 주기 변경 : -mtime +14 수정하면 됨)
find $BACKUP_DIR -type f -name "*.gz" -mtime +14 -exec rm {} \;

# 백업 완료 시간 로그에 기록
echo "백업 완료: $TIME" >> $LOG_FILE

3. 백업 스크립트 작성 후 - Linux

 

# 스크립트 권한 설정 (한번만 실행)
# chmod +x /samso/backup.sh

# 크론탭 설정 예시 (매일 자정에 실행)
# crontab -e
# 0 0 * * * /samso/backup.sh

 

4. 백업 배치파일 작성 - Windows에서 사용 (backup.bat)

@echo off

REM 백업 디렉터리 설정
set BACKUP_DIR=C:\backup
set LOG_FILE=%BACKUP_DIR%\backup.log

REM MySQL 정보 설정
set DB_USER=root
set DB_PASSWORD=samso
set DB_NAME=samsodb

REM 제외할 테이블 설정
set IGNORE_TABLES=tb_user tb_userlog

REM 날짜 설정
for /f "tokens=2 delims==" %%i in ('wmic os get localdatetime /value') do set dt=%%i
set TODAY=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%
set TIME=%dt:~0,4%-%dt:~4,2%-%dt:~6,2% %dt:~8,2%:%dt:~10,2%:%dt:~12,2%

REM 제외할 테이블 옵션 설정
set IGNORE_TABLES_STRING=
for %%t in (%IGNORE_TABLES%) do set IGNORE_TABLES_STRING=!IGNORE_TABLES_STRING! --ignore-table=%DB_NAME%.%%t

REM 백업 생성
mysqldump -u %DB_USER% -p%DB_PASSWORD% --single-transaction --skip-lock-tables %IGNORE_TABLES_STRING% %DB_NAME% > %BACKUP_DIR%\%DB_NAME%-%TODAY%.sql

REM 2주 지난 백업 파일 삭제
forfiles /p %BACKUP_DIR% /s /m *.sql /d -14 /c "cmd /c del @path"

REM 백업 완료 시간 로그에 기록
echo 백업 완료: %TIME% >> %LOG_FILE%

 

728x90
반응형