Mysql2::Error: MySQL server has gone away
hatası nedeniyle delayed_job işleminin belirli koşullar altında öldüğü bir senaryoda hata ayıklamaya çalışıyorum.MySQL sunucusu, delayed_job görevinde hatadan kalktı
Kurmam biraz karmaşıktır, ancak bunları temel konulara ayırmaya çalıştım. ClustalwFlowTask
sınıfındaki run
yönteminin arka plan işi olarak ele alınır. Temel olarak bir clustalw2
komutunu çalıştırır (DNA ve proteinler için çoklu dizi hizalaması yapan bir program)
Komutun ayrıntıları ve yürütülmesi sırasında ortaya çıkan herhangi bir hata, flow_tasks tablosuna kaydedilmeli ve delayed_job tarafından yakalanmamalıdır (bkz. update_attribute
ifadeleri). Bir kullanıcı clustalw2
ikili yüklü olmadığında
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
garip davranış yönteminde Stderr değişken boş değilse, yani başlatır. Hata ayıklama sırasında #run
yönteminin tüm update_attribute
ifadeleri uncommented unutmayın, bu nedenle görünür MySQL katılımı yoktur. (Benim ilk önsezilere biri Stderr mesajı çok büyük veya kapatmaya MySQL sunucu neden bir şey içerdiğini, ama bu durum görünmüyor)
delayed_job günlüğü aşağıdakileri içerir:
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
Burada olup bitmiş gibi görünen bir durumdur, gecikmiş_job db'den başarılı bir görevi silmeyi denedi, ancak bunu yapamadı çünkü mysql bağlantısı kesildi. Bu, ClustalwFlowTask#run
kodundaki return false
ifadesinden sonra gerçekleşir, çünkü o zaman, delayed_job öğesine göre, görev başarıyla tamamlanır.
geliştirme günlüğü bu sahiptir:
================ 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
ben bu hata ayıklamak için nasıl fikirleri tükeniyor, bu yüzden herhangi bir yardım büyük mutluluk duyacağız.
MySQL yine de bu olaylardan sonra mı çalışıyor senin database.yml için
reconnect: true
ekleyerek deneyin? Sorun tekrarlanabilir mi, yoksa dağınık mı? Sunucudaki mysql günlüklerini kontrol ettiniz mi? Sunucuda yeterli bellek var mı? Ayrıca, bu SO soruyla ilgili cevapları ve bağlantıyı kontrol edin: http://stackoverflow.com/questions/6807012/mysql2-error-mysql-server-has-gone-away –Evet, mysql sunucusu hala çalışıyor. Olay, her zaman anlattığım aynı koşullar altında tekrarlanabilir. Mysql günlükleri herhangi bir hata göstermiyor. "Sunucu gitti" hatası için olası nedenlerin listesini gördüm, ancak hiçbir şey burada uygulanabilir gibi görünüyor. –
@AndreaSingh, Bu soruna bir çözüm buldunuz mu? Tam problemle karşı karşıyayım. Yeniden bağlanmayı denedim: doğru ama bu da işe yaramadı. –