目次

05 Percona Xtrabackup

XtraBackupとは Percona が開発しているオープンソースのMySQLのバックアップツール
リストアが非常に早い

①xtrabackupのインストール

1. perconaのyumレポジトリをインストール

# rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
MySQL 5.1の場合
curl -L -O https://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.8/RPM/rhel6/x86_64/percona-xtrabackup-20-2.0.8-587.rhel6.x86_64.rpm

2. perconaをdisableへ

# vi /etc/yum.repos.d/Percona.repo
enabled = 1
   ↓
enabled = 0

3. xtrabackupインストール

# yum --enablerepo=percona install xtrabackup

4. 設定ファイルを修正

Galera

xtrabackupでバックアップ取得できるように変更する必要があります。

# vi /etc/mysql/conf.d/wsrep.cnf
wsrep_sst_method=xtrabackup
my.cnf
# vi /etc/my.cnf
[xtrabackup]
user= root
password= k3fFuGQUm

5.MySQL再起動

4.の設定を反映させる為に、一度再起動しておく必要があります。

# /etc/init.d/mysql stop
# /etc/init.d/mysql start

②バックアップ

1.フルバックアップ

galera情報までバックアップする場合は、–galera–infoを付ける。
11 Galera同期(複数台構成)

# innobackupex --no-timestamp /backup/xtrabackup/base/

user/passwordを指定する場合

[node1]# innobackupex --user [root] --password [password] --no-timestamp /backup/xtrabackup/base/

2.差分バックアップ

フォルダへバックアップする場合

innobackupex --no-timestamp --incremental --incremental-basedir=/backup/xtrabackup/base/ /backup/xtrabackup/incremental_1/
innobackupex --no-timestamp --incremental --incremental-basedir=/backup/xtrabackup/base/ /backup/xtrabackup/incremental_2/

xbstreamでストリームして、gzip

innobackupex --stream=xbstream --incremental --incremental-basedir=/backup/xtrabackup/base/ /backup/xtrabackup/ | gzip - > incremental_1.xbstream.gz
innobackupex --stream=xbstream --incremental --incremental-basedir=/backup/xtrabackup/base/ /backup/xtrabackup/ | gzip - > incremental_2.xbstream.gz

オブジェクトストレージへアップロードする場合

※5G超えの大きいファイルの場合「–multipart-chunk-size-mb=xx(MB)」を入れないとエラーになります。

# s3cmd put --multipart-chunk-size-mb=5120  /backup/xtrabackup/base_20140129.tar.gz s3://matsui-backup

②リストア

増分をコピー
–redo-only

ログファイルを適応
–apply-log

1.フルバックアップのログファイルを適応

innobackupex --apply-log --redo-only /backup/xtrabackup/base/

2.差分のデータと、差分のログファイルを適応

innobackupex --apply-log --redo-only /backup/xtrabackup/base/ --incremental-dir=/backup/xtrabackup/incremental_1/

innobackupex --apply-log --redo-only /backup/xtrabackup/base/ --incremental-dir=/backup/xtrabackup/incremental_2/

xbstreamを戻す場合

gzip -dc incremental_1.xbstream.gz |xbstream -x -C /backup/xtrabackup/incremental_1/

3.データを戻す

mysqlのディレクトリにデータが残っていると、エラーになるので移動するか、削除する。

# rm -rvf /var/lib/mysql/*

元に戻す

# innobackupex --copy-back /backup/xtrabackup/base/
# chown -R mysql:mysql /var/lib/mysql/

4.起動

※一度片方で起動・停止後、rsyncしないとGaleraがコケます

mysql起動・停止

# /etc/init.d/mysql start
# /etc/init.d/mysql stop

rsyncでコピー

# rsync -av -e ssh 192.168.20.248:/var/lib/mysql/ /var/lib/mysql/

両方のDBを起動後、同期

mysql> SET GLOBAL wsrep_cluster_address='gcomm://192.168.20.247:4567';

③シェル

バックアップ

# innobackupex --galera-info --no-timestamp /backup/xtrabackup/base/
# cd /backup/xtrabackup/base/
# tar zcvf /backup/xtrabackup/base_`date +%Y%m%d`.tar.gz ./*
# s3cmd put /backup/xtrabackup/base_`date +%Y%m%d`.tar.gz s3://matsui-backup
# rm /backup/xtrabackup/base_`date +%Y%m%d`.tar.gz

# innobackupex --galera-info --stream=xbstream --incremental --incremental-basedir=/backup/xtrabackup/base/ /backup/xtrabackup/ | gzip - > /backup/xtrabackup/incremental_`date +%Y%m%d`.xbstream.gz
# s3cmd put /backup/xtrabackup/incremental_20140124.xbstream.gz s3://matsui-backup
# rm /backup/xtrabackup/incremental_20140124.xbstream.gz

リストア

# cd /backup/xtrabackup
# s3cmd ls s3://matsui-backup
2014-01-24 06:22   1994068   s3://matsui-backup/base_20140124.tar.gz
2014-01-24 06:26    318978   s3://matsui-backup/incremental_20140124.xbstream.gz

cd /backup/xtrabackup
s3cmd get s3://matsui-backup/base_20140124.tar.gz
s3cmd get s3://matsui-backup/incremental_20140124.xbstream.gz
mkdir base incremental
tar zxvfC base_20140124.tar.gz ./base/
gzip -dc incremental_20140124.xbstream.gz | xbstream -x -C incremental/

innobackupex --apply-log --redo-only /backup/xtrabackup/base/
innobackupex --apply-log --redo-only /backup/xtrabackup/base/ --incremental-dir=/backup/xtrabackup/incremental

xtrabackup --prepare --target-dir=/backup/xtrabackup/base/


rm -rvf /var/lib/mysql/* ; innobackupex --copy-back /backup/xtrabackup/base/ ; chown  -R mysql:mysql /var/lib/mysql

④mysqldump / xtrabackup の差

mysqldump xtrabackup
バックアップ 396分(6時間36分) 248分(4時間8分)
差分バックアップ無し 65分(1時間5分)
リストア 1053分(17時間33分) 196分(3時間16分)

テスト環境

下記のVMでテスト
仮想KVM
Mem2GB
CPU4
mysqlデータ

DB(92G)でテスト

# du -hs  /var/lib/mysql/
92G	/var/lib/mysql/

mysqldump

mysqldump

# time mysqldump -u root -p`cat /root/.mysql` hogehoge | gzip  >hogehoge.sql 

real	396m42.154s
user	78m37.069s
sys	14m19.542s

gzip解凍

# gzip -d hogehoge.gz
real	46m41.813s
user	8m6.167s
sys	3m49.137s

リストア

# time mysql hogehoge < hogehoge.sql 

real	1007m47.036s
user	29m17.664s
sys	2m41.508s

rsync

# time rsync -av -e ssh 192.168.20.117:/var/lib/mysql/ /var/lib/mysql/
real	387m21.156s
user	42m45.663s
sys	26m56.563s

xtrabackup

バックアップ

xtrabackup フルバックアップ
# time innobackupex --no-timestamp /backup/xtrabackup/base/
real	92m31.669s
user	4m29.978s
sys	9m52.849s
tar.gz化
# time tar zcvf /backup/xtrabackup/base_`date +%Y%m%d`.tar.gz ./*
real	162m9.854s
user	125m27.215s
sys	16m42.856s
# time tar zc ./base | ssh 192.168.31.145 "cat > /backup/xtrabackup/base.tar.gz"

real	156m7.395s
user	140m38.824s
sys	32m38.748s
xtrabackup差分バックアップ
# time innobackupex --galera-info --stream=xbstream --incremental --incremental-basedir=/backup/xtrabackup/base/ /backup/xtrabackup/ | gzip - > /backup/xtrabackup/incremental_`date +%Y%m%d`.xbstream.gz
real	67m0.590s
user	4m40.698s
sys	3m3.635s


# time innobackupex --galera-info --stream=xbstream --incremental --incremental-basedir=/backup/xtrabackup/base/ /backup/xtrabackup/ | gzip | ssh 192.168.31.145 "cat > /backup/xtrabackup/incremental_`date +%Y%m%d`.xbstream.gz"
real	65m55.382s
user	4m33.291s
sys	2m17.686s

リストア

解凍
# time tar zxvfC base_20140129.tar.gz  ./base/

real	61m30.825s
user	14m33.834s
sys	7m48.791s
リストア
# time gzip -dc incremental_20140129.xbstream.gz | xbstream -x -C incremental/
real	0m1.563s
user	0m0.052s
sys	0m0.060s

# time innobackupex --apply-log --redo-only /backup/xtrabackup/base/
real	0m3.919s
user	0m0.175s
sys	0m0.151s


# time xtrabackup --prepare --target-dir=/backup/xtrabackup/base/
real	0m42.569s
user	0m0.063s
sys	0m10.285s

# time rm -rvf /var/lib/mysql/*
real	1m50.781s
user	0m0.011s
sys	0m4.002s

# time  innobackupex --copy-back /backup/xtrabackup/base/
real	196m55.366s
user	0m2.264s
sys	5m11.335s

同期時のエラー

1.xtrabackupがインストールされてない

xtrabackupがインストールされてなかったり、wsrep_sst_method=が間違ってる。

エラー

180828 10:18:22 [Note] WSREP: Running: 'wsrep_sst_xtrabackup-v2 --role 'joiner' --address '192.168.100.64' --auth 'root:mcaxP3bq' --datadir '/var/lib/mysql/' --defaults-file '/etc/my.cnf' --parent '9730''
sh: wsrep_sst_xtrabackup-v2: command not found

対応

xtrabackupが入ってない場合

# yum -y install percona-xtrabackup-20

wsrep_sst_method=が間違っている

wsrep_sst_method=xtrabackup-v2
# find / -name wsrep_sst_xtrabackup*
/usr/bin/wsrep_sst_xtrabackup
# ln -s /usr/bin/wsrep_sst_xtrabackup /usr/bin/wsrep_sst_xtrabackup-v2

2.ncのエラー

ncが入ってない

エラー

180827 15:57:48 [ERROR] WSREP: Failed to read 'ready <addr>' from: wsrep_sst_xtrabackup --role 'joiner' --address '10.100.0.43' --aut
h 'root:gmocl-mysql' --datadir '/var/lib/mysql/' --defaults-file '/etc/my.cnf' --parent '32226'
        Read: 'Can't find nc in the path'
対応

# yum -y install nc

ncのバージョンを変えてみる

エラー

nc: Protocol not available
tar: これは tar アーカイブではないようです
tar: 前のエラーにより失敗ステータスで終了します

# nc -l 12345
nc: Protocol not available
対応
# yum erase nc
# wget http://vault.centos.org/6.6/os/x86_64/Packages/nc-1.84-22.el6.x86_64.rpm
# rpm -ivh nc-1.84-22.el6.x86_64.rpm

socatがない

which: no socat in
対応
# yum install socat

3.innobackupexのエラー

innobackupex: got a fatal error with the following stacktrace: at /usr/bin/innobackupex line 4545.
	main::get_option('datadir') called at /usr/bin/innobackupex line 2450
	main::copy_back(0) called at /usr/bin/innobackupex line 1578
innobackupex: Error: no 'datadir' option in group 'mysqld' in server configuration file '/etc/my.cnf' at /usr/bin/innobackupex line 4545.

対応

/etc/my.cnfにdatadirが無いとこのエラーなる。
下記を入れてやればOK

/etc/my.cnf

[mysqld]
datadir=/var/lib/mysql