• [MySQL]배치파일을 이용한 MySQL 백업 자동화 feat. 트러블 슈팅(?)

    2022. 4. 8.

    by. 내이름은 킹햄찌

    배치스크립트를 윈도우 스케줄러에 등록해서 주기적으로 MySQL 백업을 자동화하는 방법과 사소한 트러블 슈팅을 소개합니다.

    스크립트 작성

    @ECHO OFF
    
    ECHO MySQL 데이터베이스 백업 시작
    
    FOR /F "tokens=1-3 delims=- " %%a IN ('DATE /T') DO (SET dt=%%a-%%b-%%c)
    
    FOR /F "tokens=1-4 delims=:." %%a IN ('ECHO %TIME%') DO (SET tm=%%a%%b%%c%%d)
    
    mysqldump --login-path=root --single-transaction -R rma_db > \\\\[Server]\\[ShareFolder]\\개인폴더\\backup\\rma_db_%dt%_%tm%.sql
    
    ECHO 오래된 백업을 삭제
    
    PUSHD \\\\[Server]\\[ShareFolder]
    FORFILES /P 개인폴더\\backup /S /M *.sql /D -3 /C "cmd /c del @file"
    POPD
    ECHO 백업 완료
    

    공유폴더에 MySQL 매일 백업을 해두고 3일이 지난 백업파일들은 삭제하는 스크립트

    대부분의 내용은 아래를 참고했습니다.

    Windows용 MySQL 백업 배치 파일 만들기

    mysqldump를 사용하기 위해서는 MySQL 환경변수 설정이 되어 있어야 합니다

    --login-path=root는 Login Path 설정이 되어 있으면 접속 아이디 비밀번호를 입력하지 않고 접속할 수 있는 설정입니다.

    mysql_config_editor set --login-path=설정이름 --host=주소 --user=아이디 --port=포트 --password

    명령어를 이용해서 설정할 수 있습니다.

     

    --single-transaction

    트랜잭션 분리 모드를 REPEATABLE READ로 설정하고 데이터를 덤프하기 전에 STRAT TRANSACTION SQL 문을 서버로 보내어 트랜잭션이 시작될때 덤프하기 때문에 일관성 있는 상태를 유지 할 수 있습니다.

    해당 옵션은 InnoDB 스토리지 엔진을 사용할때만 허용 됨, 프로젝트에는 8.0이상의 MySQL 사용되었습니다.

     

    PUSHD \\[Server]\[ShareFolder]

    PUSHD와 POPD는 스택방식으로 특정 경로의 드라이브를 저장하는 명령어입니다.

    백업 파일이 저장되어 있는 경로는 UNC 경로인데

    (UNC 경로란 LAN의 공유되어 있는 네트워크 리소스를 접근하는 경로임)

    FORFILES 명령어에 그냥 UNC 경로를 입력하면 “UNC 경로가 지원되지 않습니다” 라는 에러가 발생하기 때문에 PUSHD를 이용해서 경로를 저장해두고 접근하는 방식으로 풀어내야 합니다.

     

    때문에 PUSHD 명령어로 해당경로의 드라이브를 저장하고 드라이브 내부에서 작업 가능합니다.

     

    POPD

    작업이 끝난 후에는 PUSHD로 저장한 드라이브를 나오면서 지우게 됩니다.

    스케줄러 등록

    스케줄러는 윈도우창에 스케줄러를 검색하면 됩니다.

     

    스케줄러에서 오른쪽 상단에 작업 만들기 선택합니다.

    작업의 이름과 설명을 채워주시고

     

     

    트리거 메뉴로 이동하여 배치가 실행될 주기 설정

    동작 메뉴로 이동해서 작성해 놓은 배치 파일을 선택 후 확인해주시면 됩니다.

     

     

     

    다음과 같이 스케줄러가 생성된 것을 확인 할 수 있습니다.

     

     

    Feat. 트러블 슈팅(?)

    위와같이 정상적으로 스케줄러를 만들어서 테스트 하는데 cmd가 멈춰있었습니다. 

    아니 정확하게는 cmd가 스크립트를 일부 수행하지 않는 것처럼 보였습니다. 그래서 스크립트에 원인이 있지 않을까 하며 명령어를 이리저리 고치며 FORFILES 명령어와 PUSHD, POPD명령어를 같이 사용하면 안되나? 스케줄러를 잘못만들었을까? 하는 온갖가지 추측을 해가며 몇시간을 허비하고 나서야 발견을 했네요. FORFILES폴더의 /S 옵션은 하위폴더를 모두 탐색을 하게 되는데 옵션 설명만 봤을때는 이렇게 사용하면 되겠다 하며 지나갔었습니다. 그런데 머리를 식히고 생각해보니 본인이 잡아 놓은 경로의 용량은 어마어마했습니다. 아래 폴더의 크기를 모두 탐색 중인 줄도 몰랐던거죠.

     

    불쌍한 OS는 열심히 일하고 있었는데 티가 안나니 다른곳에서 문제를 찾고 있었습니다.

    문제를 식별하고 내부에 폴더를 하나 생성해서 다시 테스트 해보니 배치파일이 정상적으로 동작했네요...

    댓글