mysql 백업으로 percona xtrabackup 을 많이 사용한다.
설치와 사용법 알아보자.
1. 특징
- 물리적백업방식
파일을 물리적으로 백업하는 cp 하는 방식과 유사하다.
논리적 백업이 아니기에 테이블단위, 조건절 백업 등이 불가하다.
mysqldump 는 논리적 백업이지만 lock 을 필요로 한다.
- 증분백업가능
- 온라인백업가능
2. 절차
- backup
- prepare
- copy back / move back
backup 명령으로 파일을 카피하고, 데이터 파일 복사 중 발생하는 변경 사항은
prepare 명령으로 트랜잭션 로그로 추적·보정해 서비스 중단 없이 일관된 스냅샷을 만든다.
사실 prepare 가 이상없이 진행되었으면 복구는 거의 완료된것이다. copy/move back 은 단순히 파일을
경로(datadir) 로 이동할 뿐이기 때문이다.
원본을 지우지 않는것이 copy-back , 원본을 지정된 경로로 mv 하는 것이 move-back 이다.
데이터파일이 매우 큰 사이즈라면 동일 파티션에 백업본을 받아놓고 move-back 하는 것이 다운타임을 줄일수있다.
3. 옵션들
user
password
parallel
compress
compress threads
target dir
datadir
no lock
* io 병목으로 compress 쓰면 cpu가 더 일해서 빠르다
4. 설치 및 활용
xtrabackup 으로 풀백업하고 새로운 경로에 복원하는 테스트를 해보자.
# 설치
sudo dnf install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release setup pxb80 # MySQL 8.0용 XtraBackup 8.0 활성화
sudo dnf update
sudo dnf install percona-xtrabackup-80
sudo rpm --import https://repo.percona.com/yum/RPM-GPG-KEY-Percona
# 설치 확인
rpm -qa | grep xtrabackup
xtrabackup --version
CREATE USER 'backup'@'%' IDENTIFIED BY 'Backup123!';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS, SELECT ON *.* TO 'backup'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'backup'@'%';
FLUSH PRIVILEGES;
use mytest;
create table xtra(a int);
insert into xtra values(1);
insert into xtra values(2);
insert into xtra values(3);
commit;
select *
from mytest.xtra
;
select @@datadir
-- /var/lib/mysql/
# 기본 백업 테스트 (MySQL 실행 중)
xtrabackup \
--backup \
--user=backup \
--password=Backup123! \
--datadir=/var/lib/mysql/ \
--target-dir=/home/mysql/xtra \
--no-lock
xtrabackup \
--prepare \
--target-dir=/home/mysql/xtra \
--use-memory=2G
sudo systemctl stop mysqld
xtrabackup \
--copy-back \
--target-dir=/home/mysql/xtra \
--datadir=/restore/mysql
sudo mkdir -p /restore/mysql
sudo chown -R mysql:mysql /restore/mysql
sudo chmod -R 750 /restore/mysql
sudo systemctl start mysqld
datadir = /home/mysql/restore
socket = /home/mysql/restore/mysql.sock
sudo journalctl -xeu mysqld.service
sudo systemctl daemon-reload
sudo systemctl restart mysqld
tail -100 /var/log/mysqld.log
sudo touch /restore/mysql/binlog.index
sudo chown mysql:mysql /restore/mysql/binlog.index
sudo chmod 644 /restore/mysql/binlog.index
sudo systemctl restart mysqld
# 잘못된 예
log_bin = /var/lib/mysql/mysql-bin
# 올바른 예 (datadir 기준 상대경로)
log_bin = mysql-bin
# 또는
log_bin = /new/mysql/data/mysql-bin
sudo chown -R mysql:mysql /restore/mysql/
sudo find /restore/mysql/ -type d -exec chmod 750 {} \;
sudo find /restore/mysql/ -type f -exec chmod 640 {} \;
sudo find /restore/mysql/ -type d -exec chmod 777 {} \;
sudo find /restore/mysql/ -type f -exec chmod 666 {} \;
move back은 (copy-back 에 비해) (동일파티션의 경우) 메타정보만 바뀌어서 빠를수 있지만 실패시 백업본을 다시 재복사 해야함.
bin log도 미리 지워줘야 (datadir 과 다르게 지정할경우 놓칠수있다.)
'생계 > MySQL' 카테고리의 다른 글
| mysql import tablespace 로 테이블 복구 (0) | 2026.02.04 |
|---|---|
| mysql cli 자동완성 취소 (0) | 2025.11.28 |
| percona toolkit pt-online-schema-change 설치 및 사용하기 (0) | 2025.11.23 |
| mysql collate 종류와 변경 방법 (0) | 2025.11.13 |
| mysql 데이터 이관 방법들 (0) | 2025.11.06 |