【问题标题】:psql -f only runs the first query in filepsql -f 只运行文件中的第一个查询
【发布时间】:2019-02-07 17:13:14
【问题描述】:

我有一个文件make_partition.sql,比如:

CREATE INDEX my_nice_index ON mytable (ts);

CREATE TABLE mytable_2017_10 AS SELECT * FROM mytable WHERE date_trunc('month', ts) = '2017-10-01';
CREATE TABLE mytable_2017_11 AS SELECT * FROM mytable WHERE date_trunc('month', ts) = '2017-11-01';

我使用screen 在后台运行它,然后使用命令:

psql postgresql://usr:pw@host.com:5432/db_name -f make_partition.sql

然后脱离屏幕。它完成了,但似乎只运行了第一个查询。我已经对此进行了几次测试,结果相同。

我怎样才能让它运行它们?我是否必须将它们放入这样的程序中? How to run multiple SQL queries?

【问题讨论】:

    标签: postgresql psql


    【解决方案1】:

    当您从屏幕“分离”时,可能会发生 HUP 信号被发送到进程并且脚本停止执行,当前正在执行的查询将完成,因为它是不同进程的一部分。

    您可以通过多种方式将其正确发送到后台并使其安全分离,其中一种方式是使用忽略 HUP 信号的命令nohup(请参阅man nohup 了解更多信息)。

    另一种方法是像上面一样启动脚本,然后按CTRL+Z 暂停它,然后可以使用bg 将其发送到后台,最后您可以使用@987654325 确保它忽略HUP 信号@(更多信息请参见man disown)。

    【讨论】:

      【解决方案2】:

      这个问题比较老了,Adam Dadvar 的回答提供了基础知识,但我将提供另一个可能会绊倒某人的难题。如果您文件中的 SQL 将在每个语句之后创建输出,您需要 redirect at least the stdout into files,而不是让它转到终端。执行后者将意味着它正在显示结果并等待您在运行下一个命令之前通过空格键。如果您的代码可能会产生您想忽略的错误,您还应该重定向该输出。具体来说,使用disown 选项,它看起来像:

      psql postgresql://usr:pw@host.com:5432/db_name -f make_partition.sql 1> messages.log 2> errors.log
      

      然后使用CTRL+Z 挂起当前进程,disown -h %1 取消该进程,bg 为“后台”进程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 2013-04-06
        • 1970-01-01
        • 2022-08-06
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        相关资源
        最近更新 更多