====== 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}}