[MySQL][Backup n Recovery] 백업 종류와 전략
- Databases/MySQL
- 2020. 2. 22.
■ 백업의 중요성
데이터베이스 운영에 있어서 백업은 매우 중요한 작업중 하나입니다. 의도치 않은 장애나 작업중 삭제로 인해 문제가 생겼을 때 유일하게 복구할 수 있는 방법이 백업이기 때문입니다. 평소에 문제없이 잘 운영되고 장애도 한번 터지지 않은 시스템이라고 백업을 사소히 여기다가 단 한번의 문제때문에 백업이 아쉬운 경우가 굉장히 많이 있습니다. 두가지 정도로 축약해보면 다음과 같은 것들이 있을 것입니다.
# 물리적인 이유-시스템의 갑작스런 이상증상, 스토리지 문제, 운영체제 문제, 파일 시스템 문제, 그외 기타 이유
# 논리적인 이유-중요한 데이터의 삭제 혹은 변경, 이전 데이터 확인, 기타 여러 이유.
백업은 시스템을 지켜줄 수 있는 최후의 보루이자 단 한번의 장애를 해결하기 위해 늘 준비하는 작업이라고 생각해야 합니다. 백업은 100번을 강조해도 지나치지 않을만큼 중요합니다.
■ 논리적 백업과 물리적 백업
▶ 논리적 백업
1. 데이터 베이스 서버에서 데이터 베이스 정보, 테이블 구조, 테이블 데이터, 그리고 각종 오브젝트(프로시저, 펑션등)정보들을 텍스트 형태로 저장해 놓는 방법.
2. 속도가 물리적 백업보다 느리다. 이유는 데이터에비스에서 데이터 정보들을 뽑아내와서 로컬이나 원격 위치에서 데이터를 추출하여 저장하기 때문이다.
3. 레벨별로 데이터 백업 및 복구가 가능하다. 서버 레벨, 데이터베이스레벨, 테이블 레벨별로 백업 및 복구가 가능
4. 환경파일, 로그 파일등 데이터베이스에서 필요한 물리적 파일들은 백업하지 않음.
5. 서버가 온라인일때만 작업이 가능.
6. mysqldump나 mysql 내의 명령인 select... into outfile은 같은 명령어이다.
7. mysql 명령에서 load data를 통하여 데이터를 로드하는 방법과 mysqlimport는 같은 방법이다.
8. 논리적 백업은 OS나 환경을 가리지 않고 백업 복구가 가능하다.
▶ 물리적 백업
1. 데이터 베이스와 디렉토리, 로그파일, 환경파일등을 OS내에서 물리적으로 통째로 백업하는 방법.
2. 물리적 백업은 논리적 백업보다 빠르다. 변경작업 없이 파일 자체를 그대로 복사하는 방법이기 때문임.
3. 백업 복구는 데이터베이스 전체 백업 및 복구와 테이블 레벨의 백업 및 복구가 가능하다. InnoDB의 경우 테이블마다 별도의 파일을 가지게 하는 옵션을 켰을 경우 테이블 레벨별로 백업, 복구가 가능하지만 이 옵션이 켜져 있지 않다면 데이터베이스 레벨로만 가능하다.
4. 백업할땐 반드시 환경파일과 로그파일, 기타 관련된 모든 파일을 백업해야 한다.
5. 다른 머신으로 복원하려면 원본 머신과 같은 OS환경 및 시스템 아키텍쳐를 가져야 한다.(x86머신)
6. 물리백업은 OS상에서 수행되는 백업이기 때문에 cp, rcp, tar, rsync등의 os명령어를 통해서 백업이 가능하다.
■ 온라인 백업과 오프라인 백업
온라인 백업은 데이터베이스 서버가 수행중일 때 백업을 하는 것입니다. 반대로 오프라인 백업은 당연히 데이터베이스 서버가 중지중일때 백업을 받는 것입니다. 이때 나오는게 핫(hot)백업, 콜드(cold)백업, 그리고 웜(warm)백업이 있습니다. 핫 백업을 온라인 백업, 콜드백업을 오프라인 백업, 그리고 웜 백업은 핫 백업과 비슷하지만 외부에서 데이터베이스 파일을 사용하는동안 데이터를 변경하지 못하도록 잠그는것을 웜 백업이라고 합니다. 핫백업과는 약간의 차이가 있습니다.
▶ 온라인 백업의 특징
백업을 받는 동안 MySQL에 클라이언트가 접속할수 있고 그 영향도 거의 받지 않습니다. 그리고 필요한 데이터에 접근해서 데이터를 불러올 수 있습니다.
온라인으로 백업을 하는 만큼 데이터 수정이나 삭제에 의해 백업 데이터의 무결성이 손상되지 않도록 필요한 락을 걸어 데이터 변경이 되지 않도록 해야 합니다.
▶ Offline 백업
백업을 수행하는 동안 모든 접속을 불허하는 방법으로 백업을 진행합니다. 데이터 무결성과 안전성을 최우선으로 하는 작업이기 때문에 클라이언트에 대한 작업을 원천적으로 차단합니다. 주로 Master-Slavve구조를 만들때, 혹은 월간 백업이나 전략적으로 완전한 백업이 필요할 때 사용됩니다. 평소에는 잘 사용되지 않는 백업 방법입니다. 또한 클라이언트 활동에 전혀 방해를 받지 않기 때문에 가장 심플한 백업 방법이기도 합니다.
■ 로컬백업, 원격 백업
로컬백업은 데이터베이스 서버가 실행중인 호스트에서 백업을 수행합니다. 원격 백업은 원격지 클라이언트에서 백업을 수행합니다. 원격에서 하는만큼 로컬보다는 느리며 네트워크 환경에 민감합니다.
▶ 백업수행방법
- MySQL 제공 프로그램 : mysqldump, mysqlpump
기본적으로 제공되는 백업 프로그램입니다. 로컬, 원격 모두 가능합니다. 덤프파일안에 create와 insert문이 들어가 있으며 데이터 또한 모두 포함되어 있습니다.
- select into outfile 문법
mysql client 프로그램에서 수행하는 백업입니다. 데이터베이스 서버에서 실행한다면 데이터베이스 서버에 백업파일(정확히 말하면 데이터 덤프 파일)이 생기며 원격에서 수행하면 원격 클라이언트에 백업파일(데이터파일)이 생성됩니다.
- physical 백업.
물리적 백업으로 데이터 파일과 환경파일등을 통째로 백업합니다. 오프라인 전용 백업 방식입니다. 백업 방법으로는 가장 간단합니다.
■ 스냅샷 백업.
파일시스템 레벨에서 제공하는 것으로 볼륨의 상태를 순간 복사하여 다른곳으로 복사해 놓는것을 스냅샷이라고 합니다. 풀백업과 같습니다. 첫 스냅샷은 용량이 크지만 변경분(increment)만 복사해서 보관할 수도 있습니다. MySQL에서 제공하는게 아니라 veritas, zfs, lvm같은 파일시스템 기술에서 사용됩니다.
■ 전체(Full)백업, 증가분(increment)백업.
전체백업은 말 그대로 데이터 베이스의 전체 데이터를 백업하는 것입니다. 하지만 매번 전체 데이터를 백업하는건 스토리지의 낭비를 불러올 수 있으며 사이즈가 크다면 보관하기도 어렵습니다. 이때 사용하는게 증가분 백업입니다. 전체백업을 한번 받고 이 후 증가분만을 백업받는 것입니다.
다른 방법은 전체 백업을 받은 후 바이너리 로그를 백업받는 것입니다. 바이너리 로그는 데이터베이스의 변경분을 보관하는 파일이기 때문에 이 파일만 가지고 있다면 증가분만을 백업 할 수 있습니다.
■ 전체 복원과 시점 복원
▶ 전체 복원
전체 복원은 데이터베이스의 전체를 백업받은 파일로 복구하는 방법입니다. 데이터 베이스를 신규로 구축하거나 대단히 큰 장애로 복구가 필요할 때 사용하는 방법입니다.
▶ 시점 복원
특정 시간으로 되돌리는 복원 방법입니다. 전체 풀 백업 파일과 바이너리 로그 파일을 가지고 복원합니다. 예를 들어 전체 풀 백업을 매주 일요일 받고 바이너리 로그를 매일 받는다고 가정합니다. 오늘이 월요일인데 저번주 수요일로 시점을 돌리고 싶다면 저번주 일요일날 받은 풀 백업과 수요일까지 받은 바이너리 파일을 이용해서 그때까지만 복원을 하는 것입니다. 이렇게 하면 원하는 시점으로 복원을 할 수 있습니다.
■ 백업 스케쥴링, 압축, 백업 암호화
백업을 수행할 때 언제 수행할지 전략을 세워야 합니다. 특히 전체 백업은 성능의 저하를 불러옵니다. 테이블의 데이터를 가져와야 하는만큼 디스크의 용량도 필요하고 I/O 처리가 일어나는 만큼 입출력 속도가 느려질 수 있습니다. 그래서 보통 백업작업은 새벽에 합니다.
압축옵션을 사용할 수 있습니다. 전체 백업 용량은 생각보다 클수도 있습니다. 이때 압축을 하면 그마나큼 용량이 줄어듭니다. 대신 단점이 복원을 할때 그만큼 느리다는 것입니다. 용량의 장점이나 운용의 효율화냐의 중간지점에서 잘 전략을 세워서 압축 옵션을 정해야 합니다.
백업 암호화는 백업에 암호화를 걸어서 다른사람이 사용하지 못하도록 하는 것입니다. 백업이 유출되었을때는 심각한 보안사고에 해당합니다. 그래서 백업이 유출되더랄도 사용하지 못하도록 암호를 걸우두는것이 좋을 수도 있습니다.
'Databases > MySQL' 카테고리의 다른 글
[MySQL][Admin] Binary 로그 소개 및 특징 (0) | 2020.03.01 |
---|---|
[MySQL][Backup n Recovery] - SELECT...INTO Outfile과 Load Data (0) | 2020.02.23 |
[MySQL][Security] SSL을 이용한 접속방법 (2) | 2020.02.14 |
[MySQL][Security] 계정생성과 권한 (0) | 2020.02.09 |
[MySQL][Admin] 멀티 인스턴스 수행방법 (0) | 2020.01.27 |