====== 05 Percona Xtrabackup ======
XtraBackupとは [[http://www.percona.com/|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を付ける。
[[01_linux:11_データベース:01_mysql:11_galera_sync]]
# 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|
^Mem|2GB|
^CPU|4|
== 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 ' 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
[mysqld]
datadir=/var/lib/mysql
{{tag>mysql xtrabackup galera}}