pg_query() - "无法设置连接到阻塞模式(错误号8)

pb1*_*149 6 php database postgresql amazon-web-services amazon-redshift

我们的应用程序是使用COPY查询将CSV文件中的数据插入Redshift .它上传c.c总共700 GB.11000个文件.每个文件都映射到一个数据库表.我们SELECT COUNT(*) FROM <table>在每个之前和之后运行COPY日志记录和健全性检查.

经过一段时间(似乎有所不同)调用pg_query()返回此E_NOTICEPHP错误:

pg_query() - "Cannot set connection to blocking mode (Error No. 8)
Run Code Online (Sandbox Code Playgroud)

这是为SELECT COUNT(*) FROM <table>查询返回的; 我们的应用程序将所有PHP错误传播到异常.除去该传播给了我们这个错误信息除了E_NOTICE上述的两个SELECTCOPY:

Failed to run query: server closed the connection unexpectedly
    This probably means the server terminated abnormally
Run Code Online (Sandbox Code Playgroud)

COPY查询肯定不实际插入的文件.

一旦出现,每次尝试插入文件时都会发生此错误.它似乎没有解决自己.

我们最初pg_connect()在脚本开头打开了一个数据库连接(打开),并将其重新用于所有后续的SELECTs和COPYs.当我们得到E_NOTICE上述内容时,我们尝试了 - 就像实验一样 - 为每个查询打开一个新连接.这没有改变.

我们在PHP ini文件中的当前pgsql设置是:

pgsql.allow_persistent = Off
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
Run Code Online (Sandbox Code Playgroud)

什么可能导致此错误,如何解决?

更新 - 请参阅随附的屏幕.看来我们只有默认查询队列,'concurrency'设置为5,超时设置为0 MS?

在此输入图像描述

另外:我们只在应用程序运行时连接这些数据库用户(带有'username_removed'的应用程序是我们的应用程序创建的唯一用户):

main=# select * from stv_sessions;
       starttime        | process |                     user_name                      |                      db_name
------------------------+---------+----------------------------------------------------+----------------------------------------------------
 2017-03-24 10:07:49.50 |   18263 | rdsdb                                              | dev
 2017-03-24 10:08:41.50 |   18692 | rdsdb                                              | dev
 2017-03-30 10:34:49.50 |   21197 | <username_removed>                              | main
 2017-03-24 10:09:39.50 |   18985 | rdsdb                                              | dev
 2017-03-30 10:36:40.50 |   21605 | root                                               | main
 2017-03-30 10:52:13.50 |   23516 | rdsdb                                              | dev
 2017-03-30 10:56:10.50 |   23886 | root                                               | main
Run Code Online (Sandbox Code Playgroud)

小智 0

您是否尝试将pg_connect更改为pg_pconnect?这将重用现有的连接,并减少与数据库的连接,服务器将平稳运行。

我想说永远不要使用 * 进行计数。您正在强制数据库为每个寄存器创建一个哈希值并对其进行计数。使用一些唯一的值。如果没有,请考虑创建一个序列并在“auto_increment”字段中使用它。我发现您正在处理巨大的文件,任何性能改进都将有助于您的工作

您还可以检查您的阻止模式配置。

我在网上搜索到的这个,可能对你有用。 “通过将 pgsql.auto_reset_persistent = Off 更改为 On 并重新启动 Apache,可以解决该错误。”

我的最后一个建议是关于事务的,如果您正在使用事务,您可以将计数选择设置为忽略锁定的行,这将使您的计数运行得更快。

https://www.postgresql.org/docs/9.5/static/explicit-locking.html#LOCKING-ROWS