Heroku + Apartment PG::Error: ERROR: function pg_stat_statements_reset() does not exist

Heroku + Apartment PG::Error: ERROR: function pg_stat_statements_reset() does not exist

我在 Rails 4 中使用 Apartment gem 来支持 Heroku 上 Postgres 9.3.3 中的多租户。

公寓gem创建新租户时出错。

深入调查显示已创建模式,但内部没有表。

Heroku 日志显示错误:

PG::Error: ERROR:  function pg_stat_statements_reset() does not exist

创建新模式时,Postgres 正在尝试通过执行函数 pg_stat_statements_reset()

来重置统计信息

默认情况下,此功能只能由超级用户执行(from original doc)

Heroku 不给你超级用户权限。 所以你需要禁用扩展 pg_stat_statements.

解决方案 1 - 直接在数据库中快速热修复

  1. 访问 Heroku 应用的 Rails 控制台:

    heroku 运行 rails c

  2. 在模式 public:

    中执行 SQL 语句

    ActiveRecord::Base.connection.execute("删除扩展 pg_stat_statements;")

解决方案 2 - 通过迁移

  1. 检查文件db/schema.rb。很可能它包含一行

    enable_extension“pg_stat_statements”

  2. 创建迁移文件

    rails g 迁移 DropExtensionPgStatStatements

  3. 定义self.up方法

    def self.up disable_extension “pg_stat_statements” 结束

  4. 应用迁移

    耙子db:migrate

  5. 现在文件 db/schema.rb 不应包含该行

  6. 提交更改(架构和迁移文件)并部署到 Heroku

    耙子deploy:production:migrations

关于 rake 任务,请参阅 deploy.rake