백업(Backup)과 복구(Recovery)
- Mysql 8.4를 기준으로 작성했습니다.
백업의 유형
백업은 여러가지 기준에 따라 유형으로 나뉩니다.
- 백업 방식: 물리적 / 논리적
- 백업 대상: 전체 백업 / 증분 백업
- 서버 상태: 로컬 백업 / 서버 백업
- 백업 장소: 온라인 백업 / 오프라인 백업
물리적 백업과 논리적 백업
- 물리적 백업(Physical Backup)
- 개념
- 데이터베이스 파일과 디렉토리를 원본 그대로 복사하여 백업하는 방식입니다.
- 특징
- 하드웨어에 종속적
- 복구는 동일하거나 유사한 하드웨어 특성을 갖춘 곳에만 가능합니다.
- 동일한 서버 환경을 구성시 사용하기 좋습니다.
- 빠른 속도
- 파일과 디렉토리를 그대로 복사하기 때문에, 백업과 복구시 따로 변환 과정이 없어 빠릅니다.
- 대용량의 데이터에 대해 백업 및 복구할 때 사용하기 좋습니다.
- 주의점
- 서버가 운영 중 이라면, 백업 중 내용을 변경하지 못하도록 잠금한 후 진행해야합니다.
- 실행중이지 않다면 바로 진행할 수 있습니다.
- DB 외에도 관련 파일(로그나 구성 파일등)이 포함될 수 있습니다.
mysqlbackup
이나 파일 복사 명령어(cp
,scp
,tar
,rsync
등)를 통해 백업할 수 있습니다.- 같은 설정과 로그 상태를 재현: DB 외에도 관련 파일(로그나 구성 파일등)이 포함될 수 있습니다.
- 로그: MySQL 에러 로그 등, 구성 파일: MySQL 설정 파일(my.cnf 등)
- 하드웨어에 종속적
- 개념
- 논리적 백업
- 개념
- 논리적 DB구조(
CREATE DATABASE
,CREATE TABLE
)와 내용(INSERT
, 구분된 텍스트 파일)으로 표현된 정보를 저장 하는 방식입니다.
- 논리적 DB구조(
- 특징
- 높은 휴대성
- 명령어를 다시 실행하는 방식으로 진행되기 때문에, 하드웨어에 종속되지 않습니다.
- 다른 하드웨어, 운영체제로 이관시 사용하기 좋습니다.
- 느린 속도
- 서버가 DB 정보를 논리적인 형식으로 변환해야 하기 때문에 물리적 백업보다 느립니다.
- 서버 중지 불필요
- 서버는 실행 중인 상태여야 가능하지만, 잠금할 필요는 없습니다.
- 운영 중인 서비스에 큰 영향 없이 백업을 진행할 수 있습니다.
mysqldump
이나INTO OUTFILE
을 통해 백업할 수 있습니다.
- 높은 휴대성
- 개념
온라인 백업과 오프라인 백업
- 온라인 백업(Online Backup, Hot Backup)
- 개념
- 서버가 실행 중인 상태에서 백업을 진행하는 방식입니다.
- 특징
- 운영 중인 서비스나 다른 클라이언트는 데이터를 읽을 수 있습니다.
- 적절한 잠금 필요: 데이터 백업과 복구시에 데이터의 무결성을 위해, 적절한 잠금 처리가 필요합니다.
- 개념
- 오프라인 백업(Offline Backup, Cold Backup)
- 개념
- 서버가 중지된 상태에서 백업을 진행하는 방식입니다.
- 운영서버가 아닌 복제(Replica)서버를 오프라인으로 전환하여 백업하는 방식도 있습니다.
- 특징
- 오프라인이기 때문에, 모든 서비스가 중지됩니다.
- 간단한 백업 절차: 서버가 중지되어 데이터 무결성이 지켜집니다.
- 개념
- Warm Backup
- 개념
- 온라인과 오프라인 중간의 개념을 의미합니다.
- 서버는 실행 중이지만, 데이터 수정이 불가능한 상태에서 백업하는 방식
- 특징
- 데이터는 읽을 수 있지만, 수정할 수 없는 상태로 백업하는 것을 의미 합니다.
- 개념
로컬 백업과 원격 백업
- 로컬 백업(Local Backup)
- 개념
- 백업하는 서버와 백업의 대상 서버가 동일한 호스트에서 백업하는 방식입니다.
- 백업 수행 서버 = 백업 대상 서버
- 특징
- 속도와 안정성: 동일한 서버에서 수행되어 빠르고 안정적입니다.
- 물리적 백업: 물리적 백업시, 주로 로컬 백업 방식을 이용합니다.
- 개념
- 원격 백업(Remote Backup)
- 개념
- 백업하는 서버와 백업의 대상 서버가 다른 호스트에서 백업하는 방식입니다.
- 백업 수행 서버 != 백업 대상 서버, 백업 수행 서버와 백업 대상 서버는 네트워크를 통해 통신하며 백업하는 방식힙니다.
- 특징
- 물리적 백업: 물리적 백업시, 백업 파일의 목적지는 원격지로 설정(
scp
,rsync
등을 이용)할 수 있습니다.
- 물리적 백업: 물리적 백업시, 백업 파일의 목적지는 원격지로 설정(
- 개념
도구에 따른 비교
mysqldump
- 로컬과 원격 관계없이 사용할 수 있습니다.
- 저장 위치
- SQL 형식: 클라이언트(명령어를 실행한 곳)에 저장됩니다.
--tab
옵션 사용시(CSV 파일형식 등): 서버(명령어를 수행하는 곳)에 저장됩니다.
SELECT … INTO OUTFILE
- 로컬과 원격 관계없이 사용할 수 있습니다.
- 저장 위치: 항상 서버측(명령어를 수행하는 곳)에 저장됩니다.
- 물리적 백업
- 주로 로컬 백업 방식을 이용합니다.
- 백업 파일의 목적지를 원격지로 설정(
scp
,rsync
등을 이용)할 수 있습니다.
mysqldump
- 기본 사용
- SQL 형식으로 출력되며, 표준출력에 보여집니다.
>
또는>>
연산자를 이용해, 파일로 저장합니다.--tab
옵션 사용
- 각 테이블에 대해 2개의 파일이 하나의 디렉토리에 생성됩니다.
- 데이터 파일:데이터의 내용이 csv 와 같은 형식(tab을 구분자로 한 형식)의 텍스트 파일
- 테이블 구조: 테이블 구조를 정의하는 SQL파일
스냅샷(Snapshot) 백업
- 개념
- 파일 시스템 상태를 그대로 캡처하여 보관하는 방식입니다.
- 파일 시스템의 상태를 논리적으로 복사하는 방식(실제 파일 데이터를 전체 복사하는 것이 아님)입니다.
- 특징
- 일부 파일 시스템(LVM, ZFS, veritas Volume Manager)에서 지원하는 방식으로, DB에서 지원하는 방식이 아닙니다.
- 따라서 DB에서 직접 복구에 사용되지 않습니다.
- 복구시 활용
- 스냅샷을 통해 파일 시스템 자체를 특정 시점으로 롤백합니다.
- 스냅샷 파일을 별도의 디렉토리에 마운트해, 스냅샷 내의 데이터를 복사합니다.
- 일부 파일 시스템(LVM, ZFS, veritas Volume Manager)에서 지원하는 방식으로, DB에서 지원하는 방식이 아닙니다.
전체 백업과 증분 백업
- 전체 백업(Full Backup)
- 개념
- 전체 데이터를 특정 시점에 1번 백업하는 방식입니다.
- 특징
- 완전한 복구 가능
- 특정 시점의 상태를 완전히 복원할 수 있습니다.
- 백업 시점 이후 내용이 변경되었다면, 최신 상태가 아닐 수 있습니다.
- 백업 파일 크기: 서버에 존재하는 모든 데이터를 백업하기 때문에 큽니다.
- 백업 속도: 백업 파일의 크기가 커서 느립니다.
mysqldump
,mysqlbackup
등을 이용해 전체 데이터를 백업합니다.
- 완전한 복구 가능
- 개념
- 증분 백업(Point-in-Time Backup)
- 개념
- 변경된 데이터만 추가로 백업하는 방식입니다.
- 전체 백업과 조합하여 사용합니다.
- 전체 백업 이후의 변경된 데이터를 백업합니다.
- 특징
- 복구
- 전체 백업을 먼저 복원 -> 변경사항을 순차적용
- 백업 파일 크기: 변경된 데이터만 백업하므로 백업 파일의 크기가 작습니다.
- 백업 속도: 백업 파일 크기가 작아 빠릅니다.
Binary Log
를 이용하여 변경 사항을 기록합니다.Binary Log
를 활성화하면 데이터 변경 사항이 로그 파일에 기록합니다.- 특정 시점까지만 복구할 수 있습니다.
- 복구
- 개념
백업 스케줄링, 압축, 암호화
백업 스케줄링, 압축, 암호화는 백업 절차를 자동화 하는데 유용합니다.
DB에서는 직접 제공하지 않아, 다른 솔루션을 이용해야합니다.
- 예시
- 스케줄링: linux의 crontab, windows scheduler 등을 이용해 백업 주기 설정
- 압축: gzip, tar, zip을 이용해 백업 파일 압축
- 암호화: openssl 등을 이용해 백업 파일 암호화
백업 전략
다양한 백업 방식을 아는 것보다 중요한건, 이를 이용해 실무에서 백업을 하고 문제상황이 생겼을 때 백업을 이용해 복구하는 것입니다.
그러기 위해서는 백업 정책을 정의하는 것이고, 백업 정책에서 중요한 것은 정기적인 백업이 이루어져야 하며, 백업 후 복구 가능성을 항상 점검해야 합니다.
mysql에서 제공하는 예시를 통해 어떻게 정기적인 백업을 설정해야하고,이를 복구시에 이용할지에 대해 알아봅시다.
전체 백업 이용하기
물리적 백업을 할 수도 있고, 논리적인 백업을 할 수도 있겠지만, 여기서는 mysqldump를 이용한 논리적 백업을 이용합니다.
가장 부하가 적은 시간대에 전체 백업을 수행합니다.
일요일 오후 1시에 전체 백업을 수행, 백업할 테이블은 InnoDB라고 가정
$> mysqldump --all-databases --source-data --single-transaction > backup_sunday_1_PM.sql
-> 현재 시점에 전체 데이터를 백업해 파일(backup_sunday_1_PM.sql
)을 만들라는 의미
--all-databases
: 모든 database를 백업합니다.--source-data
: 백업 시점의Binary Log
파일의 이름과 위치를 덤프 파일에 기록합니다.--single-transaction
: InnoDB 테이블에 대한 일관된 읽기 제공하여 데이터 무결성을 보장합니다.
일관된 읽기
- 다른 클라이언트가 데이터 테이블에 변경한 사항은 mysqldump 프로세스에서 볼 수 없도록 함
- 만약, 백업 작업에 비트랜잭션 테이블이 포함된 경우 일관성을 위해 백업 중에 변경되지 않아야 합니다.
- For example, 백업 중에 MySQL 계정에 대한 관리 변경
이후에 주기적으로 백업한다면, (이전 백업파일은 삭제하고, 생략가능) 다시 전체 백업을 진행합니다.
복원시에는 아래와 같은 명령어를 이용해 복원할 수 있습니다.
$> mysql < backup_sunday_1_PM.sql
증분 백업(변경에 대한 백업)을 같이 이용하기
만약 여기서, 일부 백업도 같이 이용한다면 어떤 방식일까요?
$> mysqldump --single-transaction --flush-logs --source-data=2 --all-databases > backup_sunday_1_PM.sql
-> 현재 시점에 전체 데이터를 백업해 파일(backup_sunday_1_PM.sql
)을 만들고, 이후의 변경 데이터는 Binary Log
에 저장하도록 설정하는 의미
--flush-logs
: 백업 시 로그를 플러시하여 새로운Binary Log
파일을 시작합니다.-
--source-data=2
: 현재Binary Log
파일과 포지션 정보를 백업 파일에 기록합니다.-- Position to start replication or point-in-time recovery from -- CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='gbichot2-bin.000007',SOURCE_LOG_POS=4;
- 1번째 줄: 덤프 파일(=
backup_sunday_1_PM.sql
)에는 “gbichot2-bin.000007”Binary Log
파일이나 그 이상에 기록된 변경 사항 이전에 작성된 모든 변경 사항이 포함되어 있습니다. - 백업 후 기록된 모든 데이터 변경 사항은 덤프 파일(=
backup_sunday_1_PM.sql
)에는 없지만, “gbichot2-bin.000007”Binary Log
파일 이상에는 존재합니다.
- 1번째 줄: 덤프 파일(=
이후에 주기적으로 백업을 수행한다면, mysqladmin flush-logs
명령어를 이용해 새 Binary Log
에 이후 변경 데이터를 저장하도록 합니다.
순서 정리
- 1일 오후 1시:
mysqldump
를 이용해 전체 데이터 백업 + 이후 변경 데이터는Binary Log
에 저장- 전체 데이터:
backup_sunday_1_PM.sql
에 저장 - 변경 데이터:
gbichot2-bin.000007
에 저장
- 전체 데이터:
- 8일 오후 1시:
mysqladmin flush-logs
로 새로운 변경 데이터 저장- 변경 데이터:
gbichot2-bin.000008
에 저장 - 이전 데이터가 삭제되지 않고,
gbichot2-bin.000007
에 저장된 변경데이터를gbichot2-bin.000008
에 저장
- 변경 데이터:
- 15일 오후 1시:
mysqladmin flush-logs
로 새로운 변경 데이터 저장- 변경 데이터:
gbichot2-bin.000009
에 저장 - 이전 데이터가 삭제되지 않고,
gbichot2-bin.000008
에 저장된 변경데이터를gbichot2-bin.000009
에 저장
- 변경 데이터:
복원시에는 전체 백업 데이터를 이용해 복원한 후, Binary Log
파일을 순서대로 적용해 복원합니다.
-
전체 데이터 복원
$> mysql < backup_sunday_1_PM.sql
-
변경 데이터 복원
$> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql
주의
백업 데이터가 누적되면 용량이 커질 수 있으니, 적절한 주기로 백업데이터를 삭제하거나 압축하여 관리해야합니다.
고려사항
- 클라이언트가 DB에 접근하는 주요 시간: 사용량이 적은 기간이 예측된다면, 백업을 예약하는 것이 좋습니다.
- 변경 사항이 발생하는 주기: 잦은 변경사항이 있다면, 전체 백업과 증분 백업을 고려하세요.
- DB의 변경 범위: DB 전체가 변경되는지, 일부분만 변경되는지에 따라 부분 백업이나 전체 백업을 부분 백업을 진행하세요.
- 백업을 위한 디스크 공간
- 백업을 유지할 기간: 비즈니스 로직에서 유지되어야하는 기간을 고려하며 백업 일정을 설정하고, 백업 데이터를 삭제시에 삭제해도 유지되어야하는 기간에 대해서는 관계가 없는지 확인해야합니다.
- 백업 테스트: 백업을 테스트 하기 전까지는 제대로 백업이 되는지 알 수 없고, 복원에 사용될 수 있을지 알 수 없습니다.