PythonのMySQLサーバはエラーと解決策を再現するために離れて行ってしまいました

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/LJFPHP/article/details/102751743

I.はじめに

       この章では透けpythonにつながる、接続されたデータベースプログラムのエラーパラメータとそのルーツで問題を解決するために、プログラムのエラーを再現その後、コンセプト、および。mysqlwait_timeoutinteractive_timeout

要件:
       python聞きするスクリプトファイル、ファイルの行数増加する10ラインは、データベースの永続性操作後に実行されます。時には、単にファイルを高めるために数分かかることがあり10ラインを、データベースを操作するには、この時間が表示されます:MySQL server has gone awayエラー、スクリプトが停止しています。

       上記のエラーに基づいて、最初に再生するMySQL server has gone away状況を、エラーがどの方法がどうあるべきかに引っ掛かって引き起こされたパラメータを参照します。それは何気なくBaiduはインパクトパラメータデータベースの接続時間を知ることができるようになります一般的であるwait_timeoutinteractive_timeout、2つのパラメータ以下は、いくつかのミスを再現注力し、発生した問題を要約します

Pythonのmysqlの上のさまざまなエラーをキャプチャする方法、あなたは私の以前の記事を参照することができます:mysqlのエラーをキャプチャする方法のPython

第二に、WAIT_TIMEOUTを理解し、二つのパラメータは、interactive_timeout

       エラーを再現するために、我々は二つのパラメータである設定10s、つまり、10sデータベースが自動的に切断され、コマンドラインの最初のテストを見てみましょう。

図1に示すように、コマンドライン操作

またはWAIT_TIMEOUTは、interactive_timeout設定するかどうかを設定= 10、コマンドラインでは、SQLエラーを実行します:

エラー1:

ERROR 2013 (HY000): Lost connection to MySQL server during query

再実行SQL、それはこの時点でエラーを再接続します私たちが何をしたいです gone away

エラー2:

mysql> show variables like '%timeout%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    27
Current database: *** NONE ***

       当初考えていた直接報告します:MySQL server has gone awayミスを、私が最初に失うことを期待していなかった、そのデータベース接続エラーを報告し、ブロガーは、これら2つのパラメータが生成された2つのエラーに影響を与えるのだろうか。

2、WAIT_TIMEセットの失敗

       始まるちょっと不思議な、明らかセットwait_time =10interactive_timeout =1000しかし実際のビュー、および常に見つけwait_time =1000奇妙な本当に奇妙な、なぜこのパラメータは、自分自身を変えるのだろうか?

有効でないWAIT_TIMEOUT改正の質問:

https://www.cnblogs.com/azhqiang/p/5454000.html

       実際には、このリンクを介して見つけることができるwait_timeout、それがの影響を受けているinteractive_timeout影響が、なぜこのような状況はありますか?

3、リファレンスマニュアルのコンセプトは、2つのパラメータを説明します

interactive_timeout:

The number of seconds the server waits for activity on an interactive connection before closing it. An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect()

WAIT_TIMEOUT:

The number of seconds the server waits for activity on a noninteractive connection before closing it. On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value,
 depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect())

       彼らはsession/global単に前者は非対話型クライアントアイドルタイムアウトのために使用されている対話型のクライアントのアイドルタイムアウトを、記述するために使用されていることを意味するが、ここでは、対話型クライアント接続の場合にも、明らかに、レベルsessionというwait_timeout意志それはされてinteractive_timeout非対話型クライアント接続があれば、他の言葉で、上書きsession使用することはありませんinteractive_timeout上書きwait_timeoutすなわち、interactive_timeoutの影響がありません。あなたがセッションレベルのタイムアウトパラメータを変更する場合は、セッション成功着陸すると、関係なく、対話型または非対話型の変更することでwait_timeout有効にするにはパラメータを。

参考:

http://blog.itpub.net/7728585/viewspace-2637237/

この記事は非常に明確、非常に鮮明な例を解決し、結論では、それは次のようになります。

       それは対話型のクライアント接続であればsession、それはwait_timeoutされるinteractive_timeout非対話型クライアント接続があれば、他の言葉で、上書きされsession使用されることはありませんinteractive_timeoutアウトカバーするためにwait_timeout、それは、あるinteractive_timeoutのいずれかの役割なし。

図4は、それが非対話とみなすもの、インタラクティブみなすもの

インタラクティブな操作:
       素人の面では、あなたがあなたのローカルマシン上で開くことでmysql、クライアント黒いウィンドウ、様々で黒いウィンドウということですsql操作は、当然のことながら、確かに取っているtcp契約を。(小さな黒いボックスモード)

非対話型操作:
       あなたの呼び出しプログラムは、あなたのプロジェクトです。例えば、一方の側であるtomcat webサーバは、データベースサーバながら、両方どの通信、?ではjava web、私たちは選択する傾向がhibernateいずれかjdbcの接続に。したがって、この時間は、非対話型操作です。(接続コード)

       上記によると、我々がなければならないことを、インタラクティブな操作属してテストする前に、コマンドラインを使用すると、プログラムがこの問題を再現したい場合、あなたは非対話型に設定する必要があり、非対話型の接続を接続することでwait_time値を

三、Pythonの再生用のMySQLサーバが立ち去りました

       どのパラメータが最後になります错误1になりますどのようなパラメータを、错误2まだ。、それは常に発見されたコマンドラインテストが最初に来ると错误1、再び错误2、2つのエラーは、2つの別々のパラメータの影響を受けているかどうか?:私たちが望むものを再現する方法をmysql server has gone awayエラーが発生しました。

コードをテストすることによって、コマンドラインをテストしていきません。非対話的な操作のためのコード。

コード効果により1、2つのテストパラメータ

(1)パラメータは、二つの時間10秒に設定されている場合:

 try:
           conn.ping()
        except MySQLdb.Error, e:
            print 'error'
            # sqlError = "Error %d:%s" % (e.args[0], e.args[1])
            print e.args[0]
            print e.args[1]
            try:
                conn.ping()
            except MySQLdb.OperationalError,e:
                print 'error1'
                print e
            pass

次のようにこのコードが印刷されています。

error
2013
Lost connection to MySQL server during query
error1
(2006, 'MySQL server has gone away')

       テストの後、または直接なかったMySQL server has gone away、間違った、最初はデータベース接続の損失を報告し、その後、再接続、今回はそれが報告されています。MySQL server has gone away

(2)当WAIT_TIMEOUT = 10、而は、interactive_timeout = 1000

error
2013
Lost connection to MySQL server during query
2013
error1
(2006, 'MySQL server has gone away')
2222_2

そして、上記の合意の結果、無別々のレポートMySQL server has gone awayエラー。

(3)当は、interactive_timeout = 10、而WAIT_TIMEOUT = 1000

       エラーなし、通常のプログラム実行。ときにコード接続mysqlこの時に時間が、非インタラクティブに対応interactive_timeoutして、無駄な対応wait_timeout値、プログラムが与えられていません。

(4)パラメータは、効果を確認するために、2つの10S、プログラム睡眠(15)が設けられています。

import time

time.sleep(15)

error
2013
Lost connection to MySQL server during query
2013
error1
(2006, 'MySQL server has gone away')

       頻繁にテストを通じてそれが現れた错误1错误2これら2つのエラーが常に異なるオリジナルの推測である、一緒に表示されるので、これら2つのパラメータを操作していないようです。しかし、あなたが操作したい、それについてだと思うMysqlより論理的、サブスレッドは確かにあるかどうかをチェックし、彼らは間違いがないことがわかったと報告して、間違いを報告するために失敗したことを再接続する最初の、

2、再接続が提供されていない、対応するルックSQLの直接実装

try:
            cursor.execute(insert_sql)  # 直接执行sql
        except MySQLdb.Error, e:
            print 'error'
            # sqlError = "Error %d:%s" % (e.args[0], e.args[1])
            print e.args[0]
            print e.args[1]
            print e[0]
            try:
                cursor.execute(insert_sql)
            except MySQLdb.OperationalError, e:
                print 'error1'
                print e
            pass

次のように印刷結果は以下のとおりです。

error
2006
MySQL server has gone away
2006
error1
(2006, 'MySQL server has gone away')

       ここで見つかり、直接実行にsql時間、それが直接報告しますMySQL server has gone awayエラーを。OK、エラーが再現されています。

3、要約

       これはエラーではありませんinteractive_timeoutし、wait_timeoutこれら2つのパラメータが影響します。と推定されているmysql直接実行にsql時間、スレッドプールは、子供を捜すためのイニシアチブをとるでしょう投げるために時間を見つけることができないLost connection to MySQL server during queryエラーが発生し、その後、投げたときに再接続しようとするMySQL server has gone awayエラーを。

       私たちは、コードを再接続しようとしている上にあるので、最初に投げ错误1、その後投げます错误2直接実行sql時間が、错误1されて错误2カバーし、そのプリントアウトするためにMySQL server has gone away、実際には、错误1まだ存在しています。

第四に、完全なコードキャプチャMySQLエラーと再接続

コードは以下の通りであります:

 try:
            cursor.execute(insert_sql)
        except MySQLdb.OperationalError:  # 先检测数据库连接的问题,检测无误则执行sql
            print 'connect error1'
            cursor = MakeDbConnection()	  # 重新连接sql,函数里面的是connect()方法
try:
          cursor.execute(insert_sql)
 except MySQLdb.ProgrammingError:    # 捕获sql语句执行的错误
        try:
              xxxxxxxxxxxxxxx 		 # 根据各自的需求,重新调整下
             cursor.execute(insert_sql)     	#重新执行sql
        except:
             pass
 except UnicodeDecodeError:     # 捕获编码错误,如捕获代码不是utf-8的错误
          pass

       だから、あなたがすることができ、接続に失敗したキャプチャするために、データベース接続エラーの損失を避けるために再接続して、コードを実行することができ、私の母は、もはや自分自身のスクリプトを停止して心配する必要はありません。

終わり

おすすめ

転載: blog.csdn.net/LJFPHP/article/details/102751743