約束の地

キャロの想い出

Ubuntu 16.04 LTS の MySQL で STRICT_TRANS_TABLES を無効にする方法

STRICT_TRANS_TABLES

MySQL には設定項目にSTRICT_TRANS_TABLESという項目があります。これを無効にする方法です。

結論

/etc/mysql/mysql.conf.d/mysqld.cnfに以下のように書きます*1。必要に応じて内容は調整しましょう。

# STRICT_TRANS_TABLES を除外
sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

確認

mysqlのプロンプトから以下のようにして確認します。

mysql> SELECT @@GLOBAL.sql_mode\G

*1:要は STRICT_TRANS_TABLES を除外します

Embulk に MySQL のプラグインを入れる方法

Embulk に MySQL の Plugin を入れる

情けないハマり方をしたので反省文。

失敗したコマンド

$ embulk gem install mysql

成功したコマンド

$ embulk gem install embulk-input-mysql
$ embulk gem install embulk-output-mysql

結論

自分が情けない。

MySQL で Lost connection to MySQL server during query エラーが出た場合

Lost connection to MySQL server during query

MySQL でクエリを発行した際に、Lost connection to MySQL server during queryというエラーメッセージが出ることがあります。これは事実を表しただけのメッセージであり、どうすればエラーが出なくなるのかがわかりづらいために困ります。

おそらくアンチパターンに近い解決法

いろいろ調べたところ、MySQL のタイムアウトの値に問題がありそうということが分かりました。そこでまずは現在の設定を見てみます。

mysql > SHOW VARIABLES LIKE '%timeout%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| delayed_insert_timeout      | 300      |
| have_statement_timeout      | YES      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 50       |
| innodb_rollback_on_timeout  | OFF      |
| interactive_timeout         | 28800    |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| rpl_stop_slave_timeout      | 31536000 |
| slave_net_timeout           | 60       |
| wait_timeout                | 28800    |
+-----------------------------+----------+

ここで、connect_timeoutnet_read_timeoutnet_write_timeoutを変更してみます。Ubuntu 16.04 LTS では、/etc/mysql/mysql.conf.d/mysqld.cnfに以下のように追記します。

connect_timeout=3600
net_read_timeout=3600
net_write_timeout=3600

追記したら MySQL を再起動します。そして再びSHOW VARIABLES LIKE '%timeout%';を実行して値が変更されていることを確認します。

エラーが出なくなった……が

上記設定にすることで確かにエラーは出なくなりました。しかし本質を十分に理解していないために、以下のような問題点があり、この方法はアンチパターンに近いと考えています。

  • タイムアウト値を増やしたことによるデメリットはないのか?
    • ヤバいクエリを投げた場合でもこの時間を経過しないと消えないとか
  • そもそもなぜタイムアウト(と思われるもの)が起こっているのか?
    • ネット越しの環境だけで起こっているようならばルータの設定などが原因ではないか?
    • 事実ローカル内ではこのエラーは見たことがない

今後も注視していきたいと思います。

Powered by はてなブログ