mariadb で大量の warning をファイルへ出力する






mariadb の操作で発生したワーニングを確認するコマンドは以下の通りだが、

デフォルト ( ver15.1 ) では 64行分のワーニングしか出力することができない。

> show warnings;

例えば、「 LOAD DATA LOCAL INFILE 」などで大量のデータをインポートしようとした際に

大量のワーニングが発生すると出力しきれない。

さらに、show warnings コマンドは、直前のコマンド実行時に発生したワーニングを

表示するだけなので、別のコマンド操作を実行してしまうと、

改めて show warnings コマンドを実行しても同じ内容を見ることはできない。

そこで、show warnings コマンドの実行結果をファイル出力する方法はないか、

調べてみてもすぐには見つからなかったので、思い付いたのが以下の方法。

まずは、デフォルトで 64行しか表示できない設定を変更する。

/etc/my.cnf.d/mariadb-server.cnf

の中の

[mysqld]

の所に

max_error_count=100000

を追記

mariadb を再起動して反映。

# systemctl restart mariadb.service

これで show warning コマンドで 10万行のワーニングを出力することができるようになった。

これだけでは、大量のワーニングがコンソールに出力されるだけなので、

コンソール出力をファイル出力する tee コマンドと組み合わせて使用する。

tee コマンドは、カレントディレクトリにファイルが作成される。

> use testdb;

[testdb]> tee warning.txt
Logging to file 'warning.txt'

[testdb]> LOAD DATA LOCAL INFILE '/tmp/test.txt' INTO TABLE test_tbl fields terminated by '\t' optionally enclosed by '"' escaped by '\\' lines terminated by '\r\n';
Query OK, 3 rows affected, 3 warnings (0.001 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 3

[testdb]> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1261 | Row 1 doesn't contain data for all columns |
| Warning | 1261 | Row 2 doesn't contain data for all columns |
| Warning | 1261 | Row 3 doesn't contain data for all columns |
+---------+------+--------------------------------------------+
3 rows in set (0.000 sec)

[testdb]> notee

これで、show warnings コマンドの出力結果を含んで warning.txt に記録されている。

ちなみに、show warnings コマンドの最大は 65535行のようです。

試しに、max_error_count に 1000000 を指定しても 65535行分しか出力できませんでした。