4

在向 postgresql 9.1 中插入大量数据时。使用 Python 脚本,我们在此查询中收到以下错误:

X:/home/hosting/apps/X 中的 psycopg2.ProgrammingError
X_psycopg.py:162 在:执行“执行”(
                        选择 * 从 xml_fifo.fifo
                        WHERE type_id IN (1,2)
                        按 type_id 排序,时间戳限制 10
                        ): 共享内存不足
提示:您可能需要增加 max_pred_locks_per_transaction

我们增加了这个数字,但我们仍然得到了共享内存不足(max_pred_locks_per_transaction = 192)。每次我们再次启动脚本时,它都会运行一段时间,然后给出此错误消息。在 Postgres 8.1 上我们没有这个问题。

这是一段 postgresql 日志文件:

2012-06-28 02:55:43 CEST 提示:对反斜杠使用转义字符串语法,例如 E'\\'。
2012-06-28 02:55:43 CEST 警告:在字符 271 的字符串文字中非标准使用 \\
2012-06-28 02:55:43 CEST 提示:对反斜杠使用转义字符串语法,例如 E'\\'。
2012-06-28 02:55:43 CEST 警告:在字符 271 的字符串文字中非标准使用 \\
2012-06-28 02:55:43 CEST 提示:对反斜杠使用转义字符串语法,例如 E'\\'。
2012-06-28 02:56:11 CEST 警告:已经有交易正在进行中
2012-06-28 02:57:01 CEST 警告:已经有交易正在进行中
2012-06-28 02:57:01 CEST 错误:共享内存不足
2012-06-28 02:57:01 CEST 提示:您可能需要增加 max_pred_locks_per_transaction。
2012-06-28 02:57:01 CEST 声明:
                                选择 * 从 xml_fifo.fifo
                                WHERE type_id IN (1,2)
                                ORDER BY type_id ASC,时间戳限制 10

2012-06-28 02:57:01 CEST 错误:共享内存不足
2012-06-28 02:57:01 CEST 提示:您可能需要增加 max_pred_locks_per_transaction。
2012-06-28 02:57:01 CEST 声明:
                                选择 * 从 xml_fifo.fifo
                                WHERE type_id IN (1,2)
                                ORDER BY type_id ASC,时间戳限制 10

会有什么问题?

4

1 回答 1

8

PostgreSQLSERIALIZABLE在 9.1 版本中为事务添加了新功能,以避免以前在该隔离级别可能出现的一些序列化异常。您看到的错误只有在使用这些新的可序列化事务时才有可能。在 9.1 中使用可序列化事务时,某些工作负载遇到了您描述的问题。

一种解决方案是使用REPEATABLE READ事务隔离级别而不是 SERIALIZABLE。这将为您提供与 9.1 之前的 PostgreSQL 版本中 SERIALIZABLE 事务完全相同的行为。在决定这样做之前,您可能需要阅读差异,以便您知道是否值得重新配置您的环境以避免在 SERIALIZABLE 隔离级别出现问题:

http://www.postgresql.org/docs/9.1/interactive/transaction-iso.html

http://wiki.postgresql.org/wiki/SSI

如果增加 max_pred_locks_per_transaction 不能解决它(并且您可以尝试显着提高而不消耗太多 RAM),您可以尝试增加 max_connections(不增加实际使用的连接数)。

我与麻省理工学院的 Dan RK Ports 一起研究了 9.1 的 Serializable Snapshot Isolation 功能。这个问题的原因是在这个初始版本中,将多个细粒度谓词锁组合成一个粗粒度锁的启发式方法非常简单。我确信它可以改进,但是你可以给我的任何关于它遇到这个问题的情况的信息对于设计一个更好的启发式都是有价值的。如果您能告诉我一些有关您正在使用的 CPU 数量、活动数据库连接的数量以及您遇到此问题的工作负载的信息,我将不胜感激。

感谢您提供任何信息,我对这个问题表示歉意。

于 2012-04-21T23:58:42.930 回答