
CentOS 7에서 Percona XtraBackup을 사용하여 MySQL 데이터베이스의 핫 백업을 만드는 방법
소개
활성 데이터베이스 시스템을 사용할 때 흔히 볼 수 있는 도전 중 하나는 핫 백업을 실행하는 것이다. 즉, 데이터베이스 서비스를 멈추지 않거나 읽기만 하게 하는 상황에서 백업을 만드는 것이다.활성 데이터베이스의 데이터 파일을 간단하게 복사하면 데이터베이스의 복사본 내부가 일치하지 않습니다. 즉, 복사 과정에서 발생하는 업무를 사용할 수 없거나 잃어버릴 수 있습니다.다른 한편, 데이터베이스를 정지하고 정시 백업을 하면 응용 프로그램에서 데이터베이스에 의존하는 부분을 사용할 수 없게 된다.Percona XtraBackup은 이 문제를 회피하고 실행 중인 MySQL, MariaDB, Percona 서버 데이터베이스에 일치하는 전체 또는 증량 백업을 만드는 데 사용할 수 있는 오픈 소스 유틸리티입니다. 핫 백업이라고도 합니다.
mysqldump 등 실용 프로그램에서 생성된 논리적 백업과 달리 XtraBackup은 데이터베이스 파일의 물리적 백업을 만들고 데이터 파일을 복사합니다.그 다음에 사무 로그 (또는 로그라고 부른다) 를 물리적 백업에 적용하여 백업을 만드는 동안 완료되지 않은 모든 활동 사무를 메워 실행 중인 데이터베이스에 대한 일치된 백업을 실현한다.그런 다음 rsync, 유사Bacula 또는 DigitalOcean backups 백업 시스템을 사용하여 생성된 데이터베이스를 원격 위치로 백업할 수 있습니다.
이 강좌는 CentOS 7에서 Percona XtraBackup을 사용하여 MySQL 또는 MariaDB 데이터베이스에 대한 완전 핫 백업을 수행하는 방법을 보여 줍니다.백업에서 데이터베이스를 복구하는 과정도 소개했다.이 안내서의 Ubuntu 버전here을 찾을 수 있습니다.
선결 조건
이 강좌를 배우려면 다음과 같은 조건을 갖추어야 합니다.
또한 데이터베이스에 핫 백업을 수행하려면 데이터베이스 시스템에서 InnoDB 스토리지 엔진을 사용해야 합니다.XtraBackup이 InnoDB 유지 관리에 의존하는 트랜잭션 로그 때문입니다.데이터베이스가 MyISAM 메모리 엔진을 사용한다면, XtraBackup을 사용할 수 있지만, 백업이 끝날 때 데이터베이스는 잠시 잠겨 있습니다.
스토리지 엔진 확인
데이터베이스에 사용되는 저장 엔진이 확실하지 않으면 여러 가지 방법으로 찾을 수 있습니다.하나의 방법은 MySQL 컨트롤러를 사용하여 문제가 있는 데이터베이스를 선택한 다음 각 테이블의 상태를 출력하는 것입니다.
먼저 MySQL 콘솔에 들어가십시오.
- mysql -u root -p
그런 다음 MySQL 루트 암호를 입력합니다.ySQL 프롬프트에서 확인할 데이터베이스를 선택합니다.여기서 자신의 데이터베이스 이름을 바꾸십시오.
- USE database_name;
그런 다음 테이블 상태를 인쇄합니다.- SHOW TABLE STATUS\G;
데이터베이스의 각 행에 엔진을 표시해야 합니다.Example Output:...
*************************** 11. row ***************************
Name: wp_users
Engine: InnoDB
...
완료되면 콘솔을 떠나십시오.- exit
Percona XtraBackup을 설치합니다.Percona XtraBackup 설치
Percona XtraBackup을 설치하는 가장 간단한 방법은 yum을 사용하는 것이다. 왜냐하면 Percona의 저장소는 RPM을 제공하기 때문이다.
- sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
다음 명령을 실행하여 XtraBackup을 설치할 수 있습니다.- sudo yum install percona-xtrabackup
설치를 완료하려면 확인 프롬프트를 수락합니다.XtraBackup은 주로 XtraBackup 프로그램과
innobackupex
Perl 스크립트로 구성되어 있으며 데이터베이스 백업을 만들 것입니다.첫 번째 준비
XtraBackup을 처음 사용하기 전에 XtraBackup에서 사용할 시스템과 MySQL 사용자를 준비해야 합니다.이 절에서는 초보적인 준비 작업을 소개하였다.
시스템 사용자
시스템 루트 사용자를 사용할 계획이 없으면, XtraBackup을 정확하게 실행할 수 있도록 기본적인 준비 작업을 수행해야 합니다.XtraBackup을 실행하는 사용자로 로그인하고 수퍼유저 권한이 있다고 가정합니다.
시스템 사용자를 "mysql"그룹에 추가 (실제 사용자 이름으로 대체):
- sudo gpasswd -a username mysql
이제 XtraBackup에서 만든 백업을 저장할 디렉터리를 만듭니다.- sudo mkdir -p /data/backups
- sudo chown -R username: /data
chown
명령은 사용자가 백업 디렉토리에 쓸 수 있도록 합니다.MySQL 사용자
XtraBackup은 백업을 만들 때 사용할 MySQL 사용자가 필요합니다.이제 하나 만듭니다.
다음 명령을 사용하여 MySQL 콘솔에 들어갑니다.
- mysql -u root -p
ySQL 루트 암호를 제공합니다.MySQL 프롬프트에서 새 MySQL 사용자를 만들고 암호를 할당합니다.이 예에서 사용자는'bkpuser'라고 하고 비밀번호는'bkppassword'라고 합니다.이 두 가지를 모두 안전한 내용으로 변경합니다.
- CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppassword';
다음은 모든 데이터베이스에 새 MySQL 사용자에게 다시 로드, 잠금 및 복사 권한을 부여합니다.- GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
- FLUSH PRIVILEGES;
이것은 XtraBackup에서 데이터베이스 전체 백업을 만드는 데 필요한 최소 권한입니다.완료되면 MySQL 콘솔을 종료합니다.
- exit
현재, 우리는 데이터베이스의 완전한 백업을 만들 준비가 되어 있다.완전 핫 백업 수행
이 섹션에서는 XtraBackup을 사용하여 MySQL 데이터베이스의 전체 핫 백업을 만드는 데 필요한 단계를 설명합니다.데이터베이스 파일 권한이 올바른지 확인하면 XtraBackup을 사용하여 백업을 만들고 준비합니다.
Datadir 권한 업데이트
CentOS 7에서 MySQL의 데이터 파일은
/var/lib/mysql
에 저장되며 때로는 datadir라고도 부른다.기본적으로 데이터에 대한 접근은 mysql
사용자에게만 제한됩니다.XtraBackup은 백업을 만들려면 이 디렉터리에 접근해야 합니다. 따라서 mysql 그룹 구성원으로 설정된 시스템 사용자가 적절한 권한을 가지고 있는지 확인하기 위해 몇 가지 명령을 실행합니다.- sudo chown -R mysql: /var/lib/mysql
- sudo find /var/lib/mysql -type d -exec chmod 775 "{}" \;
이 명령들은 mysql 그룹이 데이터디렉터리의 모든 디렉터리에 접근할 수 있도록 하고, 백업하기 전에 이 디렉터리를 실행해야 합니다.If you added your user to the mysql group in the same session, you will need to login again for the group membership changes to take effect.
백업 생성
이제 백업을 만들 수 있습니다.이 작업은 MySQL 데이터베이스가 실행 중인 경우
innobackupex
유틸리티를 사용하여 수행됩니다.MySQL 사용자의 로그인 이름과 일치하도록 사용자 및 암호를 업데이트한 후 이 명령을 실행합니다.- innobackupex --user=bkpuser --password=bkppassword --no-timestamp /data/backups/new_backup
그러면 지정된 위치/data/backups/new_backup
에 데이터베이스 백업이 생성됩니다.innobackupex outputinnobackupex: Backup created in directory '/data/backups/new_backup'
150420 13:50:10 innobackupex: Connection to database server closed
150420 13:50:10 innobackupex: completed OK!
또는 다음과 같이 XtraBackup에서 현재 타임 스탬프를 기반으로 백업 디렉토리를 만들려면 --no-timestamp
를 생략할 수 있습니다.- innobackupex --user=bkpuser --password=bkppassword /data/backups
그러면 다음과 같이 자동으로 생성된 하위 디렉토리에 데이터베이스 백업이 생성됩니다.innobackupex output — no timestampinnobackupex: Backup created in directory '/data/backups/2015-04-20_13-50-07'
150420 13:50:10 innobackupex: Connection to database server closed
150420 13:50:10 innobackupex: completed OK!
당신이 결정한 모든 방법은 "innobackupex: 완료 확정!"을 출력해야 합니다.출력의 마지막 줄에 있습니다.성공적인 백업은 데이터베이스 데이터의 복사본을 생성합니다. 사용하기 전에 이 복사본을 준비해야 합니다.백업 준비
XtraBackup을 사용하여 핫 백업을 만드는 마지막 단계는 백업 준비입니다.이것은 제출되지 않은 모든 업무를 백업에 적용하기 위해'재방'사무 로그와 관련이 있습니다.백업을 준비하면 데이터가 일치하고 복구에 사용할 수 있습니다.
우리의 예에 따르면, 우리는
/data/backups/new_backup
에서 만든 백업을 준비할 것이다.실제 백업 경로로 대체하려면 다음과 같이 하십시오.- innobackupex --apply-log /data/backups/new_backup
마찬가지로 "innobackupex:completed OK!"를 보셔야 합니다.출력의 마지막 줄로 삼다.데이터베이스 백업이 생성되어 데이터베이스 복원에 사용할 수 있습니다.또한 Bacula 와 같은 파일 백업 시스템이 있다면 이 데이터베이스 백업을 백업 선택의 일부로 삼아야 합니다.
다음 절에서는 방금 만든 백업에서 데이터베이스를 복구하는 방법을 소개할 것입니다.
백업 복원 수행
XtraBackup을 사용하여 데이터베이스를 복원하려면 데이터베이스를 중지하고 데이터가 비어 있어야 합니다.
다음 명령을 사용하여 MySQL 서비스를 중지합니다.
- sudo systemctl stop mariadb
그리고 데이터의 내용을 이동하거나 삭제합니다(/var/lib/mysql
.예제에서는 임시 위치로 이동하기만 하면 됩니다.- mkdir /tmp/mysql
- mv /var/lib/mysql/* /tmp/mysql/
이제 백업 "new\u backup"에서 데이터베이스를 복구할 수 있습니다.- innobackupex --copy-back /data/backups/new_backup
만약 성공한다면, 출력의 마지막 줄은 "innobackupex: 이미 완성되었습니다!"데이터dir에서 복원된 파일은 복원 과정을 실행하는 사용자에 속할 수 있습니다.mysql에서 파일을 읽고 쓸 수 있도록 소유권을 mysql로 변경합니다.
- sudo chown -R mysql: /var/lib/mysql
이제 MySQL을 시작하려고 합니다.- sudo systemctl start mariadb
그렇습니다!복구된 MySQL 데이터베이스가 시작되고 실행되어야 합니다.결론
이제 Percona XtraBackup을 사용하여 MySQL 데이터베이스의 핫 백업을 만들 수 있습니다. 다음 설정을 고려해야 합니다.
우선, 이 과정을 자동화하여 시간표에 따라 백업을 만드는 것을 권장합니다.그 다음으로 데이터베이스 서버에 문제가 발생하면 rsync 같은 네트워크 파일 백업 시스템Bacula 또는 DigitalOcean backups을 사용하여 백업의 원격 복사본을 만들어야 합니다.그 다음에 디스크 공간을 절약하기 위해 교대 백업 (예정대로 낡은 백업 삭제) 과 증량 백업 (XtraBackup 사용) 을 고려해야 합니다.
행운을 빕니다.