【问题标题】:Deploying to Heroku "ERROR: must be superuser to COPY to or from a file"部署到 Heroku “错误:必须是超级用户才能复制到文件或从文件复制”
【发布时间】:2014-04-22 04:09:02
【问题描述】:

我在将应用程序的数据库推送到 Heroku 后迁移它时遇到问题。触发错误的部分代码如下:

execute "COPY countries FROM '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER;"
execute "COPY regions FROM '#{Rails.root}/db/migrate/Regions.txt' DELIMITER ',' CSV HEADER;"
execute "COPY cities FROM '#{Rails.root}/db/migrate/Cities.txt' DELIMITER ',' CSV HEADER;"

这是我得到的错误:

PG::InsufficientPrivilege: 错误: 必须是超级用户才能复制到文件或从文件复制 提示:任何人都可以复制到标准输出或从标准输入。 psql 的 \copy 命令也适用于任何人。 : COPY countries FROM '/app/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER; 耙中止! 发生错误,此迁移和所有后续迁移均已取消:

到目前为止,我已经尝试使用“\copy”和“COPY FROM STDIN”作为一些旧问题的建议,但不断收到语法错误。如果有人能指出我正确的方向,那就太好了。

编辑:这是我要参考的问题。 One:

我试过这个:

execute "COPY countries FROM STDIN '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER;"

还有这个:

execute "COPY countries FROM '#{Rails.root}/db/migrate/Countries.txt' STDIN DELIMITER ',' CSV HEADER;"

Two

我试过这个:

execute \copy countries FROM STDIN '#{Rails.root}/db/migrate/Countries.txt' DELIMITER ',' CSV HEADER

编辑两个

这是另一个尝试:

execute "COPY countries '#{Rails.root}/db/migrate/Countries.txt' FROM STDIN DELIMITER ',' CSV HEADER;"
execute "COPY regions '#{Rails.root}/db/migrate/Regions.txt' FROM STDIN DELIMITER ',' CSV HEADER;"
execute "COPY cities '#{Rails.root}/db/migrate/Cities.txt' FROM STDIN DELIMITER ',' CSV HEADER;"

我从中得到的错误是:

PG::SyntaxError:错误:“'/app/db/migrate/Countries.txt'”处或附近的语法错误 第 1 行:从 STDIN DE 复制国家/地区 '/app/db/migrate/Countries.txt'... ^ : 复制国家/地区 '/app/db/migrate/Countries.txt' FROM STDIN DELIMITER ',' CSV HEADER; 耙中止! 发生错误,此迁移和所有后续迁移均已取消:

PG::SyntaxError:错误:“'/app/db/migrate/Countries.txt'”处或附近的语法错误 第 1 行:从 STDIN DE...复制国家/地区 '/app/db/migrate/Countries.txt'...

编辑 3:

我无法解决我遇到的问题,但找到了一个更简单的解决方案 - 创建一个本地转储并使用他们的导入工具将其上传到 heroku。可以找到here

【问题讨论】:

  • 请向我们展示您参考的这些其他问题/答案以及您使用的确切代码。
  • 好的,用我尝试过的替代方法更新了我的问题。

标签: ruby-on-rails heroku database-migration


【解决方案1】:

正如错误所说:你不是超级用户,你不能从文件中复制。

您的语法错误是您使用无效语法的结果,正如错误所说的那样。您无法从 Heroku 上的文件进行复制,因此您将不得不使用其他解决方案。

The answer here 是我推荐的做法。

【讨论】:

  • 我尝试了这个答案,但仍然出现语法错误(请参阅我更新的帖子)。
  • execute "COPY countries '#{Rails.root}/db/migrate/Countries.txt' FROM STDIN 这完全是错误的。删除'#{Rails.root}/db/migrate/Countries.txt' 部分。那永远行不通。这个COPY 命令永远不会从文件中读取。请按照那个答案。
  • 好吧,我对 FROM STDIN 的工作原理有点困惑。我已将代码更新为如下,但仍然出现错误(UnableToSend: another command is already in progress):执行"COPY countries FROM STDIN DELIMITER ',' CSV HEADER;" execute "COPY regions FROM STDIN DELIMITER ',' CSV HEADER;" execute "COPY cities FROM STDIN DELIMITER ',' CSV HEADER;"
【解决方案2】:

意识到这个问题已经相当老了,我会为后代的利益提供另一个答案,因为它是出现在 Google 上的第一个查询。我找到的一个简单的解决方案是:

  • 暂时授予用户 SUPERUSER 权力。

(请注意,SUPERUSER 是 PostgreSQL 标志,并不意味着您需要成为系统 root 用户)。您需要在psqlpostgres 用户下运行以下命令:

alter user <username> superuser

如果这样做,您将不再需要与 \copySTDIN 导入进行斗争。这是一个非常快速有效的捷径(虽然有点危险)。

您可以在完成导入后撤销超级用户权限:

alter user <username> nosuperuser

此解决方案的灵感来自this 答案。

【讨论】:

  • must be superuser to alter superusers。我现在该怎么办?
  • 您必须以超级用户身份输入 psql:sudo -u postgres psql
  • @DavidKuhta 你如何sudo -u postgres psql 进入heroku?据我了解和检查,heroku postgres 中没有 postgres 用户
【解决方案3】:

刚刚为 django 应用解决了这个问题,我想我会分享我的解决方案。

  1. 在您的数据库中创建暂存架构
  2. 为暂存中的源数据创建表
  3. 导入数据
  4. 运行 INSERT 脚本以从暂存表写入目标表

注意:我有暂存模式来运行加载和转换。

【讨论】:

    【解决方案4】:

    通过标准输入对我有用... (诚​​然,从命令行。奇怪的内容转义是 Windows-ish)

    cat import.csv | psql -c "COPY cms.\"Contents\" FROM stdin DELIMITER ',' ...
    

    【讨论】:

      【解决方案5】:

      根据Heroku,他们为 postgres 数据库创建的用户是在没有超级用户权限的情况下创建的。这意味着您没有复制权限。

      看起来将数据导入 heroku 数据库的推荐方法是创建一个 db 转储并导入它,而不是使用 COPY 和 csv 文件。看一看:https://devcenter.heroku.com/articles/heroku-postgres-import-export

      【讨论】:

        【解决方案6】:

        通过文档:

        COPY 命名文件只允许数据库超级用户使用,因为它允许读取或写入服务器有权访问的任何文件。

        https://www.postgresql.org/docs/9.2/static/sql-copy.html

        您可以通过以下步骤克服:

        1. 启动 psql

        sudo -u postgres psql

        1. 将用户设为超级用户

        alter user [user] superuser;

        1. 检查用户是否为超级用户

        select usesuper from pg_user where usename = '[user]';

        附:不要忘记;

        【讨论】:

          猜你喜欢
          • 2017-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-13
          • 2017-07-25
          相关资源
          最近更新 更多