大量のデータのバックアップと復元は常に難しい点です。MYSQL が 10G を超えると、mysqldump を使用してエクスポートすると遅くなります。これは強力なオープンソース ツール Xtrabackup です。 |
Xtrabackup の概要
Xtrabackup は percona が提供する mysql データベース バックアップ ツールです。公式の紹介によると、これは innodb および xtradb データベースのホット バックアップを実行できる世界で唯一のオープン ソース ツールであり、商用バックアップ ツール InnoDB Hotbackup の良い代替品です。特徴:
(1) バックアップ処理が高速で信頼性が高い、 (2) バックアップ処理が進行中のトランザクションを中断しない、 (3) 圧縮などの機能によりディスク容量とトラフィックを節約できる、( 4) バックアップ検証を自動的に実現、 (5) 復元速度が速い、(5) 高速なバックアップ
Xtrabackup のインストール
ソフトウェアの最新バージョンは、http://www.percona.com/software/percona-xtrabackup/ で入手できます。この記事はCentOS 6.6 システムに基づいているため、対応するバージョンの rpm パッケージをダウンロードしてインストールするだけです。
[root@localhost xtrabackup]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //依存関係パッケージをインストールします
[root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: ヘッダー V4 DSA/SHA1 署名、キー ID cd2efd2a: NOKEY Preparing ... ################################## ###### [100%] 1:percona-xtrabackup ######################################## [100%]
Xtrabackupバックアップの実装
1. 完全バックアップ
# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
バックアップに最小限の権限を持つユーザーを使用する場合は、次のコマンドに基づいてそのようなユーザーを作成できます。
mysql> ユーザー 'feiyu'@'localhost' を作成します。's3cret' によって識別されます。 mysql> すべての権限を取り消し、「feiyu」からオプションを付与します。 mysql> *.* のリロード、テーブルのロック、レプリケーション クライアントを 'feiyu'@'localhost' に許可します。 mysql> フラッシュ権限;
innobakupex バックアップを使用する場合、xtrabackup を呼び出してすべての InnoDB テーブルをバックアップし、テーブル構造定義に関連するすべての関連ファイル (.frm)、MyISAM、MERGE、CSV、ARCHIVE テーブルの関連ファイルをコピーし、さらにデータベース構成情報に関連するトリガーとファイルもバックアップします。これらのファイルは、 timeという名前のディレクトリに保存されます。
バックアップ中に、innobackupex はバックアップ ディレクトリに次のファイルも作成します。
(1) xtrabackup_checkpoints — バックアップの種類 (フルまたは増分など)、バックアップのステータス (準備済みかどうかなど)、および LSN (ログ シーケンス番号) 範囲情報。
各 InnoDB ページ (通常はサイズ 16k) には、ログ シーケンス番号 (LSN) が含まれています。LSN はデータベース システム全体のシステム バージョン番号であり、各ページに関連付けられた LSN は、ページが最近どのように変更されたかを示すことができます。
(2) xtrabackup_binlog_info — mysql サーバーによって現在使用されているバイナリ ログ ファイルと、バックアップの瞬間までのバイナリ ログ イベントの場所。
(3) xtrabackup_binlog_pos_innodb - InnoDB または XtraDB テーブルのバイナリ ログ ファイルとバイナリ ログ ファイルの現在の位置。
(4) xtrabackup_binary - バックアップに使用される xtrabackup の実行可能ファイル。
(5)backup-my.cnf —— バックアップ コマンドで使用される構成オプション情報。
バックアップに innobackupex を使用する場合、 --no-timestamp オプションを使用して、コマンドが時刻名の付いたディレクトリを自動的に作成しないようにすることもできます。この方法では、innobackupex コマンドはバックアップ データを保存するための BACKUP-DIR ディレクトリを作成します。
2. 完全バックアップを準備する
一般に、バックアップの完了後、そのデータをリカバリ操作に使用することはできません。バックアップされたデータには、コミットされていないトランザクション、またはコミットされていてもデータ ファイルに同期されていないトランザクションが含まれている可能性があるためです。したがって、この時点では、データファイルはまだ不整合な状態を処理しています。「準備」の主な機能は、コミットされていないトランザクションをロールバックし、コミットされたトランザクションをデータ ファイルに同期することによって、データ ファイルを一貫した状態にすることです。
innobakupex コマンドの --apply-log オプションを使用すると、上記の機能を実現できます。次のようなコマンドです。
# innobackupex --apply-log /path/to/BACKUP-DIR
正しく実行された場合、通常、最後の数行の情報が出力されます。
xtrabackup: innodb_fast_shutdown = 1 でシャットダウンを開始しています 120407 9:01:36 InnoDB: シャットダウンを開始しています... 120407 9:01:40 InnoDB: シャットダウンが完了しました。ログ シーケンス番号 92036620 120407 09:01:40 innobackupex: 完了しました OK!
「準備」の実装プロセスでは、通常、innobackupex は --use-memory オプションを使用して、使用できるメモリのサイズを指定することもできます。デフォルトは通常 100M です。十分なメモリが利用可能な場合は、準備プロセスにさらに多くのメモリを割り当てて、完了を高速化できます。
3. 完全バックアップからデータを復元する
innobackupex コマンドの --copy-back オプションは、リカバリ操作を実行するために使用されます。この操作では、すべてのデータ関連ファイルを mysql サーバーの DATADIR ディレクトリにコピーすることによってリカバリ プロセスが実行されます。innobackupex は、backup-my.cnf を通じて DATADIR ディレクトリに関する情報を取得します。
# innobackupex --copy-back /path/to/BACKUP-DIR
正しく実行すると、出力の最後の数行は通常次のようになります。
innobackupex: InnoDB ログ ファイルのコピーを開始しています innobackupex: '/backup/2012-04-07_08-17-03' 内 innobackupex: 元の InnoDB ログ ディレクトリ '/mydata/data' に戻ります innobackupex: ファイルのコピー バックが完了しました。 120407 09:36:10 innobackupex: 完了しました。OK!
上記情報の最終行に「innobackupex: completed OK!」と表示されていることを確認してください。
データを DATADIR ディレクトリに復元するときは、すべてのデータ ファイルの所有者とグループが mysql などの正しいユーザーであることを確認する必要もあります。そうでない場合は、mysqld を起動する前にデータ ファイルの所有者とグループを変更する必要があります。好き:
# chown -R mysql:mysql /mydata/data/
4. 増分バックアップに innobackupex を使用する
各 InnoDB ページには LSN 情報が含まれており、関連データが変更されるたびに、関連ページの LSN が自動的に増加します。これは、InnoDB テーブルを増分バックアップできる基礎です。つまり、innobackupex は、最後の完全バックアップ以降に変更されたページをバックアップすることによって実装されます。
最初の増分バックアップを実行するには、次のコマンドを使用できます。
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
(増分バックアップと完全バックアップを実行する場合は、basedir は完全バックアップのディレクトリを参照し、最後の増分バックアップで増分バックアップを実行する場合は、最後の増分バックアップのディレクトリを指定します)
このうち、BASEDIR は完全バックアップが置かれているディレクトリを指し、このコマンドの実行後、innobackupex コマンドは、すべての増分バックアップ データを保存するために、/backup ディレクトリに time にちなんで名付けられた新しいディレクトリを作成します。さらに、増分バックアップを実行した後に増分バックアップを実行する場合、その --incremental-basedir は、最後の増分バックアップが配置されているディレクトリを指す必要があります。
増分バックアップは InnoDB または XtraDB テーブルにのみ適用できることに注意してください。MyISAM テーブルの場合、増分バックアップは実際には完全バックアップです。
増分バックアップと完全バックアップの「準備」には、特に次のような違いがあります。
(1) 各バックアップ (完全バックアップおよび増分バックアップを含む) でコミットされたトランザクションを「再生」する必要があります。「再生」後、すべてのバックアップ データが完全バックアップにマージされます。
(2) すべてのバックアップに基づいて、コミットされていないトランザクションを「ロールバック」します。
(以下は増分バックアップを完全バックアップにマージし、復元時に完全バックアップのみを指定する方法です)
したがって、操作は次のようになります。
# innobackupex --apply-log --redo-only BASE-DIR
次に、以下を実行します。
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
そして 2 番目の増分は次のようになります。
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
このうち、BASE-DIR は完全バックアップが配置されているディレクトリを指し、INCREMENTAL-DIR-1 は最初の増分バックアップのディレクトリを指し、INCREMENTAL-DIR-2 は 2 番目の増分バックアップのディレクトリを指し、以下同様になります。つまり、複数の増分バックアップがある場合、上記の操作を毎回実行する必要があります。
5. Xtrabackupの「ストリーム」「バックアップ圧縮」機能
Xtrabackup は、バックアップ データ ファイルの「ストリーム」機能をサポートしています。つまり、バックアップ データは、デフォルトでバックアップ ディレクトリに直接保存されるのではなく、アーカイブのために STDOUT 経由で tar プログラムに送信できます。この機能を使用するには、--stream オプションを使用するだけです。好き:
# innobackupex --stream=tar /backup | gzip > /backup/`日付 +%F_%H-%M-%S`.tar.gz
次のようなコマンドを使用して、データを別のサーバーにバックアップすることも可能です。
# innobackupex --stream=tar /backup | ssh [email protected] "cat - > /backups/`date +%F_%H-%M-%S`.tar"
さらに、ローカル バックアップを実行するときに、--Parallel オプションを使用して複数のファイルの並列コピーを実行することもできます。このオプションは、コピー時に開始するスレッドの数を指定するために使用されます。もちろん、実際のバックアップ中にこの機能の利便性を利用するには、innodb_file_per_table オプションを有効にする必要もあります。そうしないと、共有テーブルスペースが innodb_data_file_path オプションを通じて複数の ibdata ファイルに保存されます。データベースの複数のファイルのレプリケーションでは、この機能を利用できません。その簡単な使用法は次のとおりです。
# innobackupex --Parallel /path/to/backup
同時に、innobackupex によってバックアップされたデータ ファイルをリモート ホストに保存することもできます。これは、 --remote-host オプションを使用することで実現できます。
# innobackupex [email protected] /path/IN/REMOTE/HOST/to/backup
6. 単一のテーブルをインポートまたはエクスポートする
デフォルトでは、innodb_file_per_table オプションを使用しても、テーブル ファイルを直接コピーして InnoDB テーブルを MySQL サーバー間で移行することはできません。この機能は Xtrabackup ツールを使用することで実現できますが、現時点では、テーブルを「エクスポート」する必要がある mysql サーバーは innodb_file_per_table オプションを有効にしており (厳密に言えば、mysql サーバーは「エクスポート」するテーブルが作成される前に innodb_file_per_table オプションを有効にしています)、テーブルを「インポート」するサーバーは innodb_file_per_table および innodb_expand_import オプションを有効にしています。同じ時間です。
(1) 「エクスポート」テーブル テーブルの
エクスポートはバックアップの準備フェーズで実行されるため、完全バックアップが完了すると、準備プロセス中に –export オプションを使用してテーブルをエクスポートできます。
# innobackupex --apply-log --export /path/to/backup
このコマンドは、各 innodb テーブルのテーブルスペースに対して .exp で終わるファイルを作成します。これらの .exp で終わるファイルは、他のサーバーにインポートするために使用できます。
(2) 「インポート」テーブル
mysql サーバー上の別のサーバーから innodb テーブルをインポートするには、元のテーブルと同じ構造を持つテーブルを現在のサーバー上に作成する必要があります。その後、そのテーブルをインポートできます。
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;
次に、このテーブルのテーブルスペースを削除します。
mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
次に、mytable テーブルの mytable.ibd ファイルと mytable.exp ファイルを、テーブルを「エクスポート」したサーバーから現在のサーバーのデータ ディレクトリにコピーし、次のコマンドを使用してそれを「インポート」します。
mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
7. Xtrabackup を使用してデータベースの部分バックアップを実行します。
Xtrabackup は、部分バックアップ、つまり、1 つまたはいくつかの指定されたデータベース、または特定のデータベース内の 1 つまたはいくつかのテーブルのみをバックアップすることもできます。ただし、この関数を使用するには、innodb_file_per_table オプションを有効にする必要があります。つまり、各テーブルは別のファイルとして保存されます。同時に、-stream オプションはサポートされません。つまり、パイプラインを介した処理のために他のプログラムにデータを送信することはサポートされません。
さらに、部分バックアップの復元は完全データ バックアップの復元とは異なります。つまり、準備された部分バックアップを --copy-back オプションを使用してデータ ディレクトリに単純にコピーして戻すことはできず、インポート テーブルの指示に従って復元する必要があります。もちろん、場合によっては --copy-back を使用して部分バックアップを直接復元することもできますが、この方法で復元されたデータのほとんどはデータの不整合を引き起こすため、この方法はお勧めできません。
(1) 部分バックアップを作成する
部分バックアップを作成するには、正規表現 (--include)、テーブル ファイルの列挙 (--tables-file)、およびバックアップするデータベースのリスト (--databases) の 3 つの方法があります。
(a) –include を使用する –include を使用する
場合は、バックアップするテーブルの完全名を指定する必要があります。これは、次のように、databasename.tablename の形式になります。
# innobackupex --include='^feiyu[.]tb1' /path/to/backup
(b) --tables-file を使用する
このオプションのパラメータはファイル名である必要があり、このファイルの各行には、バックアップするテーブルの完全な名前が含まれます。たとえば、次のとおりです。
# echo -e 'feiyu.tb1\nmageedu.tb2' > /tmp/tables.txt # innobackupex --tables-file=/tmp/tables.txt /path/to/backup
(c) –databases を使用する
このオプションで受け入れられるパラメータはデータ名であり、複数のデータベースを指定する場合はスペースで区切る必要があり、同時に、特定のデータベースを指定する場合は、そのうちの 1 つのテーブルのみを指定することもできます。さらに、このオプションはパラメータとしてファイルを受け入れることもでき、ファイル内の各行がバックアップの対象になります。好き:
# innobackupex --databases="feiyu testdb" /path/to/backup
(2)
部分バックアップを準備するプロセスは、-export オプションを使用してテーブルをエクスポートするプロセスと似ています。
# innobackupex --apply-log --export /pat/to/partial/backup
このコマンドの実行中、innobackupex は xtrabackup コマンドを呼び出してデータ ディクショナリから欠落しているテーブルを削除するため、「テーブルが存在しない」カテゴリに関する警告メッセージが多数表示されます。同時に、バックアップ ファイルに存在するテーブルの .exp ファイルの作成に関する情報も表示されます。
(3) 部分バックアップのリストア
部分バックアップのリストア手順は、テーブルのインポート手順と同じです。もちろん、準備された状態のバックアップを復元のためにデータ ディレクトリに直接コピーすることもできます。この時点ではデータ ディレクトリが一貫した状態である必要はありません。
以下は実際に完全なバックアップ プロセスを示しています。
←#14#root@localhost /tmp/full-backup →innobackupex --user=root /tmp/full-backup/ #完全备份 InnoDB バックアップ ユーティリティ v1.5.1-xtrabackup; 著作権 2003、2009 Innobase Oy および Percona LLC および/またはその関連会社 (2009 ~ 2013 年)。全著作権所有。 xtrabackup : 最新のチェック ポイント (増分用): '2987626' xtrabackup: ログ コピー スレッドを停止しています。 .>> ログは (2987626) までスキャンされました xtrabackup: 中断ファイル '/tmp/full-backup/2015-06-25_05-58-26/xtrabackup_log_copied' を pid '7858' で作成しています xtrabackup: lsn (2987626) から (2987626) までのトランザクション ログがコピーされました。 150625 05:58:30 innobackupex: すべてのテーブルのロックが解除されました innobackupex: ディレクトリ '/tmp/full-backup/2015-06-25_05-58-26' にバックアップが作成されました innobackupex: MySQL binlog の位置: ファイル名 'mysql-bin.000001'、位置 2383 150625 05:58:30 innobackupex: データベース サーバーへの接続が閉じられました 150625 05:58:30 innobackupex: 完了しました OK!
mysql> insert into tutors(tname)values('stu00011');#データベースにデータを挿入 クエリ OK、1 行が影響 (0.03 秒) mysql> insert into tutors(tname) value('stu00012'); クエリ OK、1 行が影響 (0.00 秒)
←#246#root@localhost /tmp →innobackupex --incremental /tmp/full-backup/ --incremental-basedir=/tmp/full-backup/2015-06-25_05-58-26/ #做增量备份InnoDB バックアップ ユーティリティ v1.5.1-xtrabackup ; 著作権 2003、2009 Innobase Oy および Percona LLC および/またはその関連会社 (2009 ~ 2013 年)。全著作権所有。 xtrabackup : 中断ファイル '/tmp/full-backup/2015-06-25_06-00-48/xtrabackup_log_copied' を pid '8663' で作成しています xtrabackup: lsn (2988209) から (2988209) のトランザクション ログがコピーされました。 150625 06:00:53 innobackupex: すべてのテーブルのロックが解除されました innobackupex: ディレクトリ '/tmp/full-backup/2015-06-25_06-00-48' にバックアップが作成されました innobackupex: MySQL binlog の位置: ファイル名 'mysql-bin.000001'、位置 2924 150625 06:00:53 innobackupex: データベース サーバーへの接続が閉じられました。 150625 06:00:53 innobackupex: 完了しました。 OK!
mysql> insert into tutors(tname)values('stu00014'); #再度データを挿入 クエリ OK、1 行が影響 (0.02 秒) mysql> insert into tutors(tname) 値('stu00015'); クエリ OK、1 行が影響 (0.00 秒)
←#247#root@localhost /tmp →innobackupex --incremental /tmp/full-backup/ --incremental-basedir=/tmp/full-backup/2015-06-25_06-00-48 #再次增量备份InnoDB Backup Utility v1.5.1-xtrabackup ; 著作権 2003、2009 Innobase Oy および Percona LLC および/またはその関連会社 (2009 ~ 2013 年)。 xtrabackup :中断 ファイル '/tmp/full-backup/2015-06-25_06-02-41/xtrabackup_log_copied' を pid '9259' で作成しています xtrabackup: lsn (2988781) から (2988781) までのトランザクション ログがコピーされました。 150625 06:02:45 innobackupex: すべてのテーブルのロックが解除されました innobackupex: ディレクトリ '/tmp/full-backup/2015-06-25_06-02-41' にバックアップが作成されました innobackupex: MySQL binlog の位置: ファイル名 'mysql-bin.000001'、位置 3465 150625 06:02:46 innobackupex: データベース サーバーへの接続が閉じられました。 150625 06:02:46 innobackupex: 完了しました。 OK!
←#266#root@localhost /tmp/full-backup/2015-06-25_05-58-26 →cat xtrabackup_checkpoints #查看日志序列号是否一致 backup_type = log-applied from_lsn = 0 to_lsn = 2987626 last_lsn = 2987626 compact = 0 ←#267#root@localhost /tmp/full-backup/2015-06-25_05-58-26 →cd ../2015-06-25_06-00-48/ ←#268#root@localhost /tmp/full-backup/2015-06-25_06-00-48 →cat xtrabackup_checkpoints backup_type = incremental from_lsn = 2987626 to_lsn = 2988209 last_lsn = 2988209 compact = 0 ←#269#root@localhost /tmp/full-backup/2015-06-25_06-00-48 →cd ../2015-06-25_06-02-41/ ←#270#root@localhost /tmp/full-backup/2015-06-25_06-02-41 →cat xtrabackup_checkpoints バックアップタイプ = 増分 from_lsn = 2988209 to_lsn = 2988781 last_lsn = 2988781 コンパクト = 0
←#248#root@localhost /tmp →innobackupex --apply-log --redo-only /tmp/full-backu2015-06-25_05-58-26/ #做準備备 InnoDB バックアップ ユーティリティ v1.5.1-xtrabackup; 著作権 2003、2009 Innobase Oy および Percona LLC および/またはその関連会社 (2009 ~ 2013 年)。全著作権所有。 [注意 (再)] バイナリ ログを使用し、グループ コミットのハックを使用しない場合、 バイナリ ログの位置は次のようになります: InnoDB: 最後の MySQL binlog ファイル位置 0 2241、ファイル名 ./mysql-bin.000001 xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: starting shutdown... InnoDB: Shutdown completed; ログ シーケンス番号 2987626 150625 06:04:03 innobackupex: 完了しました OK! ←#249#root@localhost /tmp →innobackupex --apply-log --redo-only /tmp/full-backu2015-06-25_05-58-26/ --incremental-dir=/tmp/full-backup/2015-06-25_06-00-48/ #最初の増分バックアップ ファイルをマージします 。。。。。。。。。。 innobackupex: '/tmp/full-backup/2015-06-25_06-00-48/management/admin.frm' を '/tmp/full-backup/2015-06-25_05-58-26/management/admin.frm' にコピーしています 150625 06:05:28 innobackupex: 完了しました OK ! ←#25 1#root@localhost /tmp →innobackupex --apply-log --redo-only /tmp/full-backu2015-06-25_05-58-26/ --incremental-dir=/tmp/full-backup/2015-06-25_06-02-41/ #2 番目の増分バックアップ ファイルをマージします 。。。。。。。。。。。。。。。。 innobackupex: '/tmp/full-backup/2015-06-25_06-02-41/management/classinfo.frm' を '/tmp/full-backup/2015-06-25_05-58-26/management/classinfo.frm' にコピーしています innobackupex: '/tmp/full-backup/2015-06-25_06-02-41/management/admin.frm' を '/tmp/full-backup/2015-06-25_05-58-26/management/admin.frm' にコピーしています 150625 06:07:10 innobackupex: 完了しました OK! ←#258#root@localhost ~ →rm -rf /mydata/data1/* #删削除データ文件目录 ←#259#root@localhost ~ →innobackupex --copy-back /tmp/full-backup/2015-06-25_05-58-26/ #恢复。。。。。。。。。。。。。。。。 innobackupex: Inno のコピーを開始しています。 DB ログ ファイル innobackupex: '/tmp/full-backup/2015-06-25_05-58-26' 内 innobackupex: 元の InnoDB ログ ディレクトリ '/mydata/data1' に戻ります innobackupex: ファイルのコピー バックが完了しました。 150625 06:12:29 innobackupex: 完了しました。OK! ←#276#root@localhost /mydata/data1 →chown -R mysql.mysql ./* #修正属主和属组