web-dev-qa-db-ja.com

MySQL-wait_timeout変数

CentOSマシンのMySQL(5.1.67)でwait_timeout変数を変更することで解決できると思われる問題を解決しようとしています。

それで、/ etc/my.cnfを必要な値(180)で更新し、MySQLを再起動しましたが、表示方法に応じてwait_timeoutの値が異なることに驚いています(以下を参照)。 :

mysql> show global variables like "%wait%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
| table_lock_wait_timeout  | 50    |
| wait_timeout             | 180   |
+--------------------------+-------+
3 rows in set (0.00 sec)

mysql> show variables like "%wait%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
| table_lock_wait_timeout  | 50    |
| wait_timeout             | 28800 |
+--------------------------+-------+
3 rows in set (0.00 sec)

2番目のクエリがグローバル変数ではなくセッション変数を表示していると思いますが、MySQLセッションを終了し、MySQLを再起動して再度ログインした後、それらが異なる理由がわかりません。なぜ同じではないのですか?そして、どうすれば同じ値(180)がすべての点で一貫していることを確認するにはどうすればよいですか?

どんな提案/助けもありがたいです。ありがとう。

3
Cheddar

ドキュメント の状態

スレッドの起動時に、セッションのwait_timeout値は、クライアントのタイプに応じて(mysql_real_connect()へのCLIENT_INTERACTIVE接続オプションで定義されているように)グローバルwait_timeout値またはグローバルinteractive_timeout値から初期化されます。 Interactive_timeoutも参照してください。

スクリプトではなくコマンドラインを介して接続しているため、CLIENT_INTERACTIVEが接続オプションとして自動的に使用されているのは理にかなっています。そのため、 interactive_timeout 値が使用されており、デフォルトは28800です。

セッションのwait_timeout値を180にするには、interactive_timeout値を180に更新します。

なぜそうなのかについては、推測しかできません。ただし、プログラマーとして、特定のアクションを実行するためにチェックするときは常に複数の値をチェックする必要がなく、1つの値を検索するだけで済む方が便利であることを知っています。何かチェックしたい。

より明確には、この場合、wait_timeout値が必要になるたびに、wait_timeoutinteractive_timeoutの両方をチェックするのではなく、チェックするだけで済むのが最善です。これにより、セッションwait_timeoutを適切な値で自動的に初期化し、その1つの値のみをチェックするだけでコードを維持できるようになります。そうしないと、このタイムアウトを伴う何かを行う必要があるたびに両方の値のチェックに失敗する可能性があるため、間違いを招きます。

4
Willem Renzema