製品&サポートサービス

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

MySQLや関連ソリューションに関するお問い合わせ、お見積などがございましたら、ご連絡ください。

お問い合わせ各MySQL保守サービス見積依頼スマートスタイルOSSストア
各データベース保守サービス比較
各データベース保守サービス見積依頼
契約条項
データベースサポートサービス
MySQL Editions
Oracle Cloud
Percona
MariaDBサブスクリプション
エンタープライズOSSサポート
高可用性ソリューション
OSSシステムソリューション
Navicat
SQL Diagnostic Manager for MySQL
SYNCNEL
OSS保守サポートサービス
Microsoft Azure
お問い合わせ
各MySQL保守サービス見積依頼
スマートスタイルOSSストア
Oracle Gold Partner

ページトップへ