Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
約11年前投稿 修正あり

MySQLのテーブルをアーカイブしたいなら、Percona Toolkitのpt-archiverを使おう

MySQL Performance Blogの翻訳。Percona Toolkitのpt-archiverコマンドを使ってデータをアーカイブするための手順とは。

原文
Want to archive tables? Use Percona Toolkit's pt-archiver (English)
原文ライセンス
CC BY-NC-SA
翻訳依頼者
D98ee74ffe0fafbdc83b23907dda3665
翻訳者
D98ee74ffe0fafbdc83b23907dda3665 doublemarket
原著者への翻訳報告
未報告


August 12, 2013 By Nilnandan Joshi

Percona Toolkitの pt-archiver は、大きなテーブルから他のテーブルあるいはファイルにレコードをアーカイブするのに便利なツールのひとつだ。pt-archiverで興味深いのは、読み書き可能なツールであることだ。読み出し元からのデータはデフォルトで削除するので、アーカイブ後に別にデータを削除する必要はない。

デフォルトがそういう動作になっているので、本番環境のサーバで実際に実行する場合には注意すべきだ。--dry-run オプションを使ってテストするか、心配なら --no-delete オプションで確認することもできる。このスクリプトの目的は、OLTPクエリに影響を与えることなく古いデータをアーカイブし、そのデータを同じサーバあるいは違うサーバの他のテーブルに保存する、あるいはLOAD DATA INFILE文に適したフォーマットでファイルに保存することだ。

pt-archiverはどうやってアーカイブするレコードを選ぶのか

pt-archiverは、テーブルからレコードを読み出す際にインデックスを使う。インデックスは、テーブルへの連続的なアクセスを最適化するために使われる。pt-archiverは、各SELECT文で読みだした最後の行を覚えておいて、WHERE句を生成するのに使っている。各SELECT文を実行するのにテーブルの最初からスキャンする代わりに、指定されたインデックスに含まれるカラムを使って、前のSELECT文が終わったところから次のSELECTを始められるようにしている。

使うインデックスを指定してpt-archiverを実行する時は、 --source オプション内で "-i" を指定できる。 "-i" オプションは、アーカイブの際にスキャンすべきインデックスを指示するものだ。アーカイブ行をフェッチする際に使うSELECT文に、FORCE INDEX あるいは USE INDEX 文として現れる。このオプションを指定しなかった場合は、pt-archiver は適切なインデックスを自動で見つける。そういうインデックスが存在しない場合は、PRIMARY KEY が使われる。大抵の場合は、"-i" オプションをつけなくても、pt-archiver はうまく動作するだろう。

pt-archiverの実行方法

ファイルにレコードをアーカイブする場合は以下のように実行する。

pt-archiver --source h=localhost,D=nil,t=test --file '/home/nilnandan/%Y-%m-%d-tabname' --where "name='nil'" --limit-1000

あるテーブルから、同じサーバあるいは違うサーバのテーブルへレコードをアーカイブする場合は以下のように実行する。

pt-archiver --source h=localhost,D=nil,t=test --dest h=fedora.vm --where "name='nil'" --limit-1000

--sourceの中でデフォルトファイルオプション(-F)を使う場合にはドキュメント をチェックしてほしい。

レプリケーション環境でのアーカイブ

レプリケーション環境では、スレーブの遅延が大きくないというのはとても重要なことだ。そのため、アーカイブ中のスレーブ上のレプリケーション遅延を制御することができる。

--check-slave-lag : DSNで指定されたスレーブの遅延が --max-lag より小さくなるまでアーカイブを一時停止する。このオプションでは、遅延を確認するスレーブの詳細を与える必要がある(例、 --check-slave-lag h=localhost,S=/tmp/mysql_sandbox29784.sock)。

--max-lag : --check-slave-lag が指定されている場合この秒数までアーカイブを一時停止する。

これらのオプションでは、pt-archiver は行をフェッチするたびにスレーブをチェックする。遅延がオプションで与えられた値より大きい場合、あるいはレプリケーションが切れている(遅延がNULL)の場合は、 --check-interval の秒数を待って、それからまた遅延をチェックする。遅延が追いつくまでこれを繰り返し、行のフェッチを再開してアーカイブする。

その他の便利なオプション

--for-update / --share-lock : SELECT文にFOR UPDATE や LOCK IN SHARE MODE を付与する。

--no-delete : アーカイブする行を削除しない。

--plugin : プラグインとして使用するPerlモジュール名。

--progress : 指定行数ごとに進捗を表示する。

--statistics : 統計情報を表示する。

--where : どの行をアーカイブするかを指定するWHERE句を指定する(必須)。

nilnandan@nil:~$ pt-archiver --source h=localhost,D=nil,t=test,S=/tmp/mysql_sandbox29783.sock --file '/home/nilnandan/%Y-%m-%d-tabname' --where "name='nilnandan'" --limit=50000 --progress=50000 --txn-size=50000 --statistics --bulk-delete --max-lag=1 --check-interval=15 --check-slave-lag h=localhost,S=/tmp/mysql_sandbox29784.sock
TIME ELAPSED COUNT
2013-08-08T10:08:39 0 0
2013-08-08T10:09:25 46 50000
2013-08-08T10:10:32 113 100000
2013-08-08T10:11:41 182 148576
Started at 2013-08-08T10:08:39, ended at 2013-08-08T10:11:59
Source: D=nil,S=/tmp/mysql_sandbox29783.sock,h=localhost,t=test
SELECT 148576
INSERT 0
DELETE 148576
Action Count Time Pct
print_file 148576 18.2674 9.12
bulk_deleting 3 8.9535 4.47
select 4 2.9204 1.46
commit 3 0.0005 0.00
other 0 170.0719 84.95
nilnandan@nil:~$

pt-archiver は Percona XtraDB Cluster の 5.5.28-23.7 より新しいバージョンでも使えるが、クラスタのアーカイブをする際に注意すべき3つの制限事項がある。詳細はドキュメントを参照してほしい。

pt-archiver は、プラグイン機構で拡張ができるようになっている。依存関係のあるデータのアーカイブ、複雑なビジネスルールの適用、アーカイブプロセス中のデータウェアハウス構築など、高度なアーカイブロジックを追加するために、自分のコードを取り込むことができる。このURL が詳しい。

pt-archiver関連のバグはこちらへ : http://www.percona.com/doc/percona-toolkit/2.1/pt-archiver.html#extending

その他pt-archiverの詳細はこちらへ : http://www.percona.com/doc/percona-toolkit/2.2/pt-archiver.html

次の記事
私が他人のシェルスクリプトから学んだこと
前の記事
MongoDBとMySQLでのスキーマデザインの違い

Feed small 記事フィード

新着記事Twitterアカウント