コマンド
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”のようになります