web-dev-qa-db-ja.com

MySQL Linuxクライアントのタイムアウト/キープアライブ

LinuxのコマンドラインMySQLクライアントでキープアライブを設定する方法はありますか?

私たちのネットワークは最近VLAN=セットアップに移行し、システム部門はファイアウォールの制御を失いました。30年後にすべての接続を強制終了するルールをファイアウォールに設定することを決定しましたデータが通過しなかった場合の分(接続と限られたリソースを追跡する必要があることについての何か)これを制御することはできません。

サーバー管理者およびプログラマーとしての私の問題は、プログラミングをしている間、mysqlコマンドラインクライアントをバックグラウンドで実行できないことです。クエリを送信しない(またはデータを送信しない)場合、35分後に試行すると、クライアントは接続がなくなったことを検出します。毎回再接続する必要があります。

SSHでは、キープアライブを設定して、一日中接続を開いたままにしておくことができます。 mysqlコマンドラインクライアントに同様の構成可能なオプションはありますか? 「Mysqlキープアライブ」および類似の検索はすべて、プログラミング言語内のバックエンド接続の結果を返すため、何も見つけることができません。

7

一般的なTCPキープアライブを設定できます。そのためのカーネル設定があると思います。しかし、通常はそれほど頻繁ではありません(数時間)。詳細があるように見える TCP Keepalive HOWTO があります。

または、SSHを介してMySQL接続をトンネルするだけでなく、SSHキープアライブを使用できるのはなぜですか?

$ ssh -L1234:127.0.0.1:3306 -o ServerAliveInterval=300 user@mysql-server
... (in another terminal)
$ mysql -u user -p -h 127.0.0.1 -P 1234

3番目のオプションは、サーバーへのトンネル(OpenVPNなど)を設定し、キープアライブ(および透過的に再接続など)を処理することです。

PS:30分でestablishedTCP接続を期限切れにするための「私たちの貴重なリソース」の引数はBSです。残念ながら、私は以前に彼らの立場にありました-一部の機器もBSです。たとえば、 BCP 142/RFC 5382 は、2時間4分(-//)の最小時間を与えます(これは、ファイアウォールがホストはまだ稼働しています)。

4
derobert

セッション中に接続が失われた場合、MySQL CLIクライアントのデフォルトは自動接続です。ドキュメント: MySQLのヒント自動再接続動作の制御

本当の解決策は、権力者と協力して、開発チームのメンバーに役立つ解決策を見つけることです。

当然、それには時間がかかるので、一時的な解決策を作成する必要があるかもしれません。 MySQLの自動接続を無効にすることをお勧めします(--skip-reconnect)、そして再接続を処理する単純なbashスクリプトを作成します。良い考えではありませんが、役立つかもしれません。

#!/bin/bash

PROGRAM="/path/to/mysql"
ARGS="--skip-reconnect"

while [ 1 ]; do
 $PROGRAM $ARGS
 sleep 1
 echo -n "Lost Connection... Reconnect[Y]"
 read USER_INPUT
 case x$USER_INPUT in
  x)
   echo "Reconnecting..."
   ;;
  x[yY])
   echo "Reconnecting..."
   ;;
  *)
   echo "Stopping..."
   break
   ;;
 esac
done
3
emcconville

libkeepalive を使用して_libkeepalive.so_をプリロードし、socket()呼び出しをインターセプトして、戻る前にソケットの優先キープアライブ設定でsetsockopt()を自動的に呼び出すことができますそれ。

これはではなくアプリケーション(この場合はMySQL)を再コンパイルする必要がなく、完全に透過的です。

TCP Keepalive HOWTO も参照してください。

3
Vegard