【问题标题】:Postgres error on Heroku with Resque带有 Resque 的 Heroku 上的 Postgres 错误
【发布时间】:2012-04-15 04:55:32
【问题描述】:

我没有足够的 Postgres 来理解该消息。

PG::Error: SSL error: decryption failed or bad record mac : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"users"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum

这是从 resque 后端获得的调用堆栈

/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `async_exec'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `exec_no_cache'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:663:in `block in exec_query'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.2/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `exec_query'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1264:in `column_definitions'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:858:in `columns'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/schema_cache.rb:12:in `block in initialize'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `yield'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `default'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `columns'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:237:in `columns_hash'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/delegation.rb:7:in `columns_hash'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:330:in `find_one'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:311:in `find_with_ids'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:107:in `find'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/querying.rb:5:in `find'
/app/app/workers/compute_worker.rb:5:in `perform'

说明: 我的工人只是对数据库进行一些写入操作。没什么复杂的。 当我第一次执行工作人员的任务时,它可以工作,而第二次它失败并显示上述消息。 如果我重新启动工人,它只会在第一次工作。 我已经跑了

heroku pg:restart
heroku db:restart
heroku db:migrate

...没有成功。

在我的本地计算机上(使用 mysql)它运行良好。有什么想法吗?

【问题讨论】:

  • 看看你在 MySQL 中的列类型。也许您没有指定一列。我有一个类似的错误(很久以前)
  • 该查询是 ActiveRecord 用来计算 PostgreSQL 表结构的。错误有appeared elsewhere on SO
  • 感谢您的 cmets。事实上,我不明白为什么它第一次工作,第二次失败。我不使用水龙头。为什么要使用它?

标签: ruby-on-rails postgresql resque


【解决方案1】:

article from heroku 解释了如何正确连接和断开 resque 的连接:

Resque.before_fork do
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

Resque.after_fork do
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

【讨论】:

    【解决方案2】:
    Resque.before_fork = Proc.new { 
         ActiveRecord::ActiveRecord::Base.verify_active_connections!
    } 
    

    会更好

    【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但要解决它,我的应用实际上需要 before_fork 而不是 after_fork。希望这对某人有所帮助。

    Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
    

    【讨论】:

    • heroku 上我就是这种情况
    【解决方案4】:

    感谢“Rails初学者”和“mu太短”的cmets我找到了解决方案。

    我已将它添加到初始化程序中,它成功了!

    Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }
    

    【讨论】:

    • 它实际上需要 before_fork 来解决我的问题,所以我的解决方案最终是这样的。
    • Arkan - 这个解决方案救了我的命。好吧,至少我的周末。
    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 2015-10-31
    • 2011-02-25
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2023-03-03
    • 2013-03-18
    相关资源
    最近更新 更多