製品

Percona

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