회사 mysql DB를 백업하기 위한 작업을 진행했다.
지시 받은 내용은 크론탭을 활용하라는 것이었는데, 대체 크론탭이 뭐야?
크론탭(Cron tab)은 Unix 및 Unix 계열 운영 체제(예:Linux)에서 일정한 간격으로 작업을 자동으로 실행하기 위해 사용되는 시스템 도구이다. 정기적으로 실행되어야 하는 작업이나 스크립트를 지정된 시간에 실행하도록 스케줄링하는 데 사용된다.
= 즉, 나는 크론탭으로 정기적으로 mysql DB를 백업하도록 만들 것이다.
크론탭은 다음과 같은 형식으로 작성 및 실행하면 된다.
분 시 일 월 요일 스크립트
- 분 (Minute): 0부터 59까지
- 시 (Hour): 0부터 23까지
- 일 (Day): 1부터 31까지
- 월 (Month): 1부터 12까지
- 요일 (Day of week): 0부터 6까지의 값으로 일요일부터 토요일까지(0과 7은 일요일을 의미)
예를 들어, 매일 오전 2시에 스크립트를 실행하려면 다음과 같이 크론탭을 작성할 수 있다
0 2 * * * 백업_스크립트.sh
DB데이터를 백업하는 내용이 담긴 스크립트(백업스크립트.sh_)파일을 생성한 뒤
스크립트를 실행할 수 있는 해당 크론탭 명령을 실행하면 매일 오전 2시마다 백업이 되는 것이다.
나는 테스트 서버에서 먼저 작업한 뒤 운영 서버에도 동일하게 적용시켜 보았다.
회사에서는 SSH 클라이언트인 모바엑스텀(MobaXterm)을 사용하여서
해당 툴로 서버에 접속했다.
백업_스크립트 파일을 생성하고자 하는 위치로 이동하여
(저는 TEST라는 폴더로 이동하겠습니다.)
cd TEST
디렉토리(폴더명:mysql_backup)를 생성한다.
mkdir 디렉터리이름 //make directory 줄임말
=> mkdir mysql_backup
이제 해당 디렉토리에 스크립트 파일을 생성해보자.
(nano, vim, 또는 vi를 사용할 수 있지만 vi를 사용했다.)
vi로 새로운 스크립트 파일을 연다.
vi mysql_backup.sh
i
를 눌러서 입력 모드로 전환한다. 이제 텍스트를 입력할 수 있다.
MySQL 백업 스크립트를 작성한다.
#!/bin/sh -> 스크립트의 시작 부분으로, 이 스크립트는 셸(Shell) 스크립트로 작성되었다는 것
#MySQL 연결 정보
DB_USER="사용자명"
DB_PASSWORD="비밀번호"
DB_NAME="DB명"
#백업 파일 경로
BACKUP_DIR="/TEST/mysql_backup"
#날짜
DATE=$(date +"%Y%m%d")
#백업 파일명 설정 (날짜를 이용한 고유한 파일명)
BACKUP_FILE="$BACKUP_DIR/backup_$DATE.sql.gz"
#MySQL 백업 실행
/usr/bin/mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE
▶추가 설명
/usr/bin/ 경로에 위치한 mysqldump 명령어를 실행한다.
mysqldump는 MySQL 데이터베이스의 데이터와 구조를 백업하는 데 사용되는 명령어이다.
-u : MySQL 데이터베이스에 접속할 사용자를 지정한다. $DB_USER 환경 변수로 설정된 MySQL 사용자 이름이다.
-p : -p다음에는 비밀번호를 붙여주어야 한다. $DB_PASSWORD 환경 변수로 설정된 MySQL 사용자의 비밀번호이다.
> : >는 리다이렉션을 나타내며, 명령어의 출력을 파일로 저장한다.
DB_NAME 이라는 데이터베이스를 BACKUP_FILE 파일명으로 저장한다.
입력이 끝나면 Esc
키를 눌러서 명령 모드로 전환한다.
그리고 :wq
를 입력하여 저장하고 나가기를 실행한다.
:는 명령어 입력 모드로 진입하라는 명령이고,
w는 저장(write)를 의미하고, q는 종료(quit)를 의미한다.
이제 mysql_backup.sh 파일이 생성된 것이다.
스크립트를 실행하려면 실행 권한을 부여해야 한다.
chmod +x mysql_backup.sh
이제 크론이라는 예약 작업 스캐줄러로 매일 새벽 3시에 백업 작업을 하도록 만들자.
크론 편집기를 연다.
crontab -e
크론 편집기가 열리면 i
를 눌러서 입력 모드로 전환한다.
그리고 아래와 같이 크론 작업을 추가한다.
0 3 * * * /TEST/mysql_backup/mysql_backup.sh
크론 편집기에서 나가려면 Esc
키를 누르고 :wq
를 입력하여 저장하고 종료한다.
스크립트가 제대로 동작하는지 확인하기 위한 테스트 방법
*/2 * * * * /DATA/mysql_backup/mysql_backup.sh
매 2분마다 스크립트를 실행하도록 크론 작업을 먼저 해본다.
이후 해당 작업을 중지하고 싶다면?
크론 편집기를 연다.
crontab -e
삭제하려는 크론 작업을 찾은 후, 해당 라인을 삭제하거나 주석 처리한다.
주석 처리할 때는 라인 앞에 #
을 추가한다.
Esc
키를 누르고 :wq
를 입력하여 저장하고 종료한다
#!/bin/sh
# 백업 파일 삭제
find /TEST/mysql_backup/*.sql.gz -mtime +7 -exec rm -f {} \;
▶추가 설명
/DATA/mysql_backup/ 디렉터리 안에 있는 확장자가 .sql.gz로 끝나는 파일들을 찾는다.
파일의 수정 시간이 7일 이상 된 파일을 선택한다.
선택된 파일들에 대해 rm(디렉터리를 삭제) f(강제로[force] 삭제하는 옵션) 명령어를 실행한다.
{}는 찾은 파일을 나타낸다.
지정된 디렉터리에서 7일 이상 된 백업 파일을 삭제하는 작업 스크립트이다.
해당 스크립트도 동일하게 적용 및 실행, 테스트 해주면 된다.
테스트 서버와 운영 서버의 설정 차이로
테스트 서버에서 작업을 할 때 결과물의 파일 크기가 0이 나오는 문제가 발생했다.
etc/my.cnf 파일에서 #local-infile=1를 주석 처리했을 때 오류가 해결되었다.
🔓local-infile은 MySQL 데이터베이스 서버의 설정 중 하나로,
외부에서 로컬 파일을 로드하거나 읽을 수 있는 기능을 활성화 또는 비활성화시키는 역할을 한다.
local-infile이 활성화되면, MySQL 클라이언트가 로컬 파일 시스템에서 데이터를 로드하거나 읽을 수 있다. 이것은 보안상의 이유로 기본적으로 비활성화되어 있다.
만약 local-infile이 활성화되어 있다면, 서버 측에서 로컬 파일을 읽는 것이 허용되지 않기 때문에 백업이나 복원 작업이 올바르게 이루어지지 않을 수 있다.