728x90
데이터베이스를 관리하다 보면 백업은 중요한 업무 중 하나입니다. 백업 파일을 효율적으로 관리하기 위해 특정 테이블을 제외하고 백업을 생성, 압축, 특정 기간 동안 보관한 후 자동으로 삭제하는 스크립트를 작성하면 업무에 도움이 됩니다.
1. mysqldump 개요
mysqldump는 데이터를 덤프 파일로 내보내는 도구로, 일반적으로 콜드 백업 도구로 간주됩니다. 테이블에 락을 걸거나 일관된 스냅샷을 얻기 위해 데이터를 일시적으로 정지시키기 때문에, 백업 중에는 데이터베이스의 쓰기 작업이 일시적으로 중단될 수 있습니다.
mysqldump는 기본적으로 읽기 락을 사용하지만, InnoDB 테이블에서는 --single-transaction 옵션을 사용하여 테이블 락을 피할 수 있습니다. 이 옵션을 사용하면 트랜잭션 시작 시점의 상태를 백업할 수 있습니다.
아래 링크를 참고하시면 DB 백업 및 복구에 대해서 알 수 있습니다.
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
반응형
'DB > Mysql(MariaDB)' 카테고리의 다른 글
MariaDB - 무중단 Replication 설정 : DB인스턴스 추가 및 변경 (2) | 2024.09.27 |
---|---|
MariaDB - Replication 설정 (Master-Master / Master-Slave) (0) | 2024.07.19 |
MariaDB - 초기 보안 설정 mysql_secure_installation 사용법 (0) | 2024.06.18 |
MariaDB - AUTO_INCREMENT 확인 및 초기화 방법 (0) | 2024.05.31 |
MariaDB - Connection Memory Management와 주요 메모리 파라미터 튜닝 (0) | 2024.05.31 |