Mysql2::Error: MySQL server has gone away
エラーのために、delayed_jobプロセスが特定の状況で停止するシナリオをデバッグしようとしています。MySQLサーバーがdelayed_jobタスクでエラーを発生しました
私の設定はちょっと複雑ですが、私は基本的なことを考えてみました。 ClustalwFlowTask
クラスのrun
メソッドは、バックグラウンドジョブとして処理されます。これは基本的にclustalw2
コマンド(DNAとタンパク質の複数の配列アライメントを行うプログラム)を実行します。
コマンドの詳細と実行中に発生するエラーは、flow_tasksテーブルに記録され、delayed_jobで捕捉されませんupdate_attribute
ステートメント)。
require 'open3'
class ClustalwFlowTask < FlowTask
def run
# setup code ------
# fasta is a file object
cmd = "clustalw2 -INFILE=#{fasta.path}"
Rails.logger.info "[INFO #{Time.now}] #{self} running #{cmd}"
#update_attribute(:command, cmd)
raw_stdin, raw_stdout, raw_stderr = Open3.popen3(cmd)
Rails.logger.info "*********** RAW STDERR: #{raw_stderr} ************"
stdin, stdout, stderr = [raw_stdin, raw_stdout, raw_stderr].map do |io|
s = io.read.strip rescue nil
io.close
s
end
Rails.logger.info "*************** #{stderr} *******************"
unless stderr.blank?
Rails.logger.info "============ THERE IS AN ERROR ============"
#update_attribute(:error, stderr)
return false
end
# more code here -----
end
ユーザーがclustalw2
バイナリがインストールされていないときに奇妙な行動が開始方法で標準エラー出力変数が空白でない場合、それはです。デバッグ中に#run
メソッドのすべてのupdate_attribute
ステートメントのコメントを外したので、明らかなMySQL関与はありません。 (私の最初の勘の一つは、標準エラーメッセージが大きすぎるか、MySQLサーバをシャットダウンする原因となる何かが含まれていますが、それはケースのように思われないということでした)
delayed_jobログには以下が含まれています。
2012-03-26T09:19:25-0700: [Worker(delayed_job host:JadeDragon.local pid:8998)] ClustalwFlowTask failed with ActiveRecord::StatementInvalid: Mysql2::Error: closed MySQL connection: DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 107 - 0 failed attempts
ここでは、delayed_jobがdbから成功したタスクを削除しようとしましたが、mysql接続が切断されているため、これを実行できませんでした。これは、ClustalwFlowTask#run
コード内のreturn false
ステートメントの後に発生します。遅延されたジョブに従って、タスクが正常に終了するからです。
開発・ログには、これを持っている:
================ THERE IS AN ERROR ================
(0.5ms) BEGIN
Mysql2::Error: MySQL server has gone away: BEGIN
SQL (0.2ms) DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 110
Mysql2::Error: closed MySQL connection: DELETE FROM `delayed_jobs` WHERE `delayed_jobs`.`id` = 110
(0.1ms) ROLLBACK
Mysql2::Error: closed MySQL connection: ROLLBACK
(0.1ms) BEGIN
Mysql2::Error: closed MySQL connection: BEGIN
(0.1ms) ROLLBACK
Mysql2::Error: closed MySQL connection: ROLLBACK
closed MySQL connection
私はこれをデバッグする方法についてのアイデアを実行していますので、任意の助けをいただければ幸いです。
は、mysqlはまだ、これらのイベントの後に実行しているdatabase.ymlのに
reconnect: true
を追加してみてください?問題は再現性があり、散発的ですか?あなたはサーバー上のmysqlログをチェックしましたか?サーバーに十分なメモリがありますか?また、回答とこの関連する質問にリンクを確認してください:http://stackoverflow.com/questions/6807012/mysql2-error-mysql-server-has-gone-away –はい、mysqlサーバーはまだ実行されています。イベントは、私が記述したのと同じ状況下で常に再現可能です。 mysqlログにはエラーは表示されません。私は "サーバーがなくなってしまった"というエラーの原因のリストを見てきましたが、ここには何も適用されないようです。 –
@AndreaSingh、この問題の解決策を見つけましたか?私は正確な問題に直面しています。私は再接続を試みました:本当ですが、どちらもうまくいきませんでした。 –