はじめに
MySQLのslaveバックアップに、普段はmysqldumpを使用しているのですが、perconaのxtrabackupを使う機会があって、色々ハマったのでメモ。
インストール
フリーのオープンソースなので、以下からダウンロードできます。
perconaのyumリポジトリをインストールして、yumで入れるには以下が参考になります。
依存関係
rpmコマンドで入れようとすると、依存関係でperlのPKGが足りないと言われました。
以下が依存関係を解決する為に実行したコマンドです。
sudo yum install perl-Time-HiRes
これを実行すると、他にも色々一緒に入りました。
そしてxtrabackupをインストールすると、以下のファイルがインストールされます。
/usr/bin/innobackupex
これはxtrabackupのラッパーで、コマンドでこっちを叩きました。
実行時のハマりどころ
rootじゃないとダメ
バックアップ用のユーザを作って、バックアップファイル送信先のサーバに公開鍵を使ってノンパスログインを行っているのですが、一般ユーザの権限では、よく分からないエラーが出て失敗しました。
コマンドの引数ではMySQLにrootでログインしてるので、OSユーザはなんでもいいだろうと思っていたのですが、ダメみたいです。
コマンドオプションを色々変えてみてもダメで、rootでやってみたら、すんなり実行できたので、visudoでバックアップ用ユーザにsudoをNOPASSWDで実行できる設定をしておくと、コマンドラインでsudoつけるだけでうまくいきました。
Maximum Number Of Open Filesがデフォルト値だとダメ
DBのレコード量にもよるかもしれませんが、デフォの1024だと、これまたよく分からないエラーが出ました。
sysctlなどのconfに大きな値を記載してOS再起動しても良いですが、コマンドを叩く前に、ulimit -n xxxxのコマンドで大きな値を入れておくとうまくいきました。
他にも値を大きくする方法はありますが、バックアップコマンドのシェルスクリプトだけで実現するには、ulimitコマンドが手頃です。
バックアップファイルの形式
普通に圧縮した各バイナリを日時のフォルダの中に吐き出すバックアップの他に、ストリーミング方式があり、今回はそちらを使用しました。
公式ドキュメントにもありますが、以下のオプションで実行できます。
$ innobackupex --stream=xbstream --compress /root/backup/ > /root/backup/backup.xbstream
この方式だと、一個のファイルとして保存できるので、それを更にtarコマンドで圧縮して、バックアップ送信先サーバにrsyncで送るのに便利です。
バックアップの定期実行
Linuxではおなじみの、crontabを使います。
バックアップ用のユーザで以下のコマンドを実行して、夜中や早朝などに実行されるように設定しておくと、負荷の少ない時間帯にバックアップできて良いと思います。
crontab -e
おわりに
今までもMySQLに付属のdumpコマンドでも大きな問題は無いのですが、公式サイトを見る限りxtrabackupの方が高機能そうです。
まだ設定したばかりで運用していないので、そのメリットがよく分かっておりませんが、違いが分かってきたら、追記したいと思います。