製品&サポートサービス
pt-archiver
コマンド
pt-archiver [ オプション ] --source [ DSN ] --file "ファイル名" --where "条件文"
【必須項目】
- ・ [ オプション ] : -p(--password) パスワード
- ・ --source [ DSN ] : h=ホスト名, D=データベース名, t=テーブル名
- ・ --file "ファイル名" : アーカイブした内容を保存するファイルを指定します
- --where "条件文" : アーカイブするレコードの条件を指定します(全レコード取得の場合は "1=1" と指定)
【主なオプション】
- ・ --no-delete : デフォルトではアーカイブしたレコードが削除されるため、それを避ける時はこのオプションを使います
- ・ --no-check-charset : デフォルトではレコードとアーカイブファイルとの間の文字コードの違いをチェックします
このオプションを指定すれば、自動でデータベースの文字コードに合わせてくれます
目的
指定したテーブルのレコードを、他のテーブルに取り込める形式のファイルにアーカイブします
設定ファイル
上記の必須項目を、設定ファイルにまとめておきます
ただし、--source、--file、--where はコマンドライン上で直接指定する必要があるため、ここでは書きません
・設定ファイルの作成
# touch /etc/percona-toolkit/pt-archiver.conf
・設定ファイルの編集
# vi /etc/percona-toolkit/pt-archiver.conf
# config for pt-archiver user=root password=パスワード
・MySQL のユーザ名
user=root
・MySQL のパスワードを記載
password=パスワード
シナリオ
以下のようなテーブルおよびレコードを用意します
mysql> select * from employees where emp_no between 10100 and 10110; +--------+------------+------------+------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+------------+--------+------------+ | 10100 | 1953-04-21 | Hironobu | Haraldson | F | 1987-09-21 | | 10101 | 1952-04-15 | Perla | Heyers | F | 1992-12-28 | | 10102 | 1959-11-04 | Paraskevi | Luby | F | 1994-01-26 | | 10103 | 1953-11-26 | Akemi | Birch | M | 1986-12-02 | | 10104 | 1961-11-19 | Xinyu | Warwick | M | 1987-04-16 | | 10105 | 1962-02-05 | Hironoby | Piveteau | M | 1999-03-23 | | 10106 | 1952-08-29 | Eben | Aingworth | M | 1990-12-19 | | 10107 | 1956-06-13 | Dung | Baca | F | 1994-03-22 | | 10108 | 1952-04-07 | Lunjin | Giveon | M | 1986-10-02 | | 10109 | 1958-11-25 | Mariusz | Prampolini | F | 1993-06-16 | | 10110 | 1957-03-07 | Xuejia | Ullian | F | 1986-08-22 | +--------+------------+------------+------------+--------+------------+ 11 rows in set (0.00 sec)
以下のコマンドを実行し、上記のテーブルからidが106-110のレコードをアーカイブします。
# pt-archiver --no-check-charset --no-delete --source h=localhost,D=employees,t=employees \ --file "/tmp/pt-archiver_result.txt" --where "emp_no between 10100 and 10110" # cat /tmp/pt-archiver_result.txt
結果
pt-archiver_result.txt の中に以下のような内容が書き込まれます。
[root@localhost tmp]# pt-archiver --no-check-charset --no-delete --source h=localhost,D=employees,t=employees \ > --file ""/tmp/pt-archiver_result.txt"" --where ""emp_no between 10100 and 10110"" [root@localhost tmp]# cat /tmp/pt-archiver_result.txt 10100 1953-04-21 Hironobu Haraldson F 1987-09-21 10101 1952-04-15 Perla Heyers F 1992-12-28 10102 1959-11-04 Paraskevi Luby F 1994-01-26 10103 1953-11-26 Akemi Birch M 1986-12-02 10104 1961-11-19 Xinyu Warwick M 1987-04-16 10105 1962-02-05 Hironoby Piveteau M 1999-03-23 10106 1952-08-29 Eben Aingworth M 1990-12-19 10107 1956-06-13 Dung Baca F 1994-03-22 10108 1952-04-07 Lunjin Giveon M 1986-10-02 10109 1958-11-25 Mariusz Prampolini F 1993-06-16 10110 1957-03-07 Xuejia Ullian F 1986-08-22 [root@localhost tmp]#
このファイルを使えば、"LOAD DATA INFILE"文でレコードを取り込むことが出来ます。
mysql> TRUNCATE employees; mysql> LOAD DATA INFILE "pt-archiver_result.txt" INTO TABLE employees; mysql> truncate employees; Query OK, 0 rows affected (0.04 sec) mysql> load data infile ""pt-archiver_result.txt"" into table employees; Query OK, 11 rows affected (0.00 sec) Records: 11 Deleted: 0 Skipped: 0 Warnings: 0 mysql> select * from employees; +--------+------------+------------+------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+------------+--------+------------+ | 10100 | 1953-04-21 | Hironobu | Haraldson | F | 1987-09-21 | | 10101 | 1952-04-15 | Perla | Heyers | F | 1992-12-28 | | 10102 | 1959-11-04 | Paraskevi | Luby | F | 1994-01-26 | | 10103 | 1953-11-26 | Akemi | Birch | M | 1986-12-02 | | 10104 | 1961-11-19 | Xinyu | Warwick | M | 1987-04-16 | | 10105 | 1962-02-05 | Hironoby | Piveteau | M | 1999-03-23 | | 10106 | 1952-08-29 | Eben | Aingworth | M | 1990-12-19 | | 10107 | 1956-06-13 | Dung | Baca | F | 1994-03-22 | | 10108 | 1952-04-07 | Lunjin | Giveon | M | 1986-10-02 | | 10109 | 1958-11-25 | Mariusz | Prampolini | F | 1993-06-16 | | 10110 | 1957-03-07 | Xuejia | Ullian | F | 1986-08-22 | +--------+------------+------------+------------+--------+------------+ 11 rows in set (0.00 sec)
※ 今回の検証環境において、事前にデフォルトのsecure-file-privの指定先である"/var/lib/mysql-files/"を空に変更し、外部キーを一時無効にしています。
良い点
行レベルで条件を指定して、別データベースへリストアする場合等に有効です
注意点
デフォルト設定で動かそうとすると、アーカイブされたレコードがテーブルから削除されてしまいます
その他
pt-archiver で保存されるファイルの形式は、MySQLの"SELECT INTO OUTFILE" と同じです
各フィールドはタブ区切られ、1レコードが改行(LF)で終わります
NULL は"N"で表され、特殊文字は飛ばされます
--file オプションでは、以下のような変数を用いてファイル名を付けることが可能です
- %Y:西暦
- %m:月
- %d:日付
- %H:時
- %i:分
- %s:秒
- %D:データベース名
- %t:テーブル名
今回のシナリオ内で実行したコマンドの --file オプション内を、
--file '/tmp/%Y-%m-%d-%D-%t.txt'
と設定すると、出力されるファイル名は" 2017-04-03-employees-employees.txt"のようになります