생계/MySQL2025. 12. 8. 16:08
반응형

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 과 다르게 지정할경우 놓칠수있다.)

반응형
Posted by 돌고래트레이너