将大量数据插入postgresql 9.1。使用Python脚本,我们在此查询中收到以下错误:
X: psycopg2.ProgrammingError in /home/hosting/apps/X X_psycopg.py:162 in : Execute 'execute' ( SELECT * FROM xml_fifo.fifo WHERE type_id IN (1,2) ORDER BY type_id, timestamp LIMIT 10 ): out of shared memory HINT: You might need to increase max_pred_locks_per_transaction
我们增加了这个数字,但我们仍然没有共享内存(max_pred_locks_per_transaction = 192)。每次我们再次启动脚本时它会运行一段时间,然后给出此错误消息。在Postgres 8.1上我们没有遇到这个问题。
这是postgresql日志文件的一部分:
2012-06-28 02:55:43 CEST HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2012-06-28 02:55:43 CEST WARNING: nonstandard use of \\ in a string literal at character 271 2012-06-28 02:55:43 CEST HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2012-06-28 02:55:43 CEST WARNING: nonstandard use of \\ in a string literal at character 271 2012-06-28 02:55:43 CEST HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2012-06-28 02:56:11 CEST WARNING: there is already a transaction in progress 2012-06-28 02:57:01 CEST WARNING: there is already a transaction in progress 2012-06-28 02:57:01 CEST ERROR: out of shared memory 2012-06-28 02:57:01 CEST HINT: You might need to increase max_pred_locks_per_transaction. 2012-06-28 02:57:01 CEST STATEMENT: SELECT * FROM xml_fifo.fifo WHERE type_id IN (1,2) ORDER BY type_id ASC, timestamp LIMIT 10 2012-06-28 02:57:01 CEST ERROR: out of shared memory 2012-06-28 02:57:01 CEST HINT: You might need to increase max_pred_locks_per_transaction. 2012-06-28 02:57:01 CEST STATEMENT: SELECT * FROM xml_fifo.fifo WHERE type_id IN (1,2) ORDER BY type_id ASC, timestamp LIMIT 10
会出现什么问题?
答案 0 :(得分:8)
PostgreSQL在版本9.1中为SERIALIZABLE
事务添加了新功能,以避免以前在该隔离级别可能发生的某些序列化异常。只有在使用这些新的可序列化事务时,才能看到错误。在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 R.K一起研究了9.1的Serializable Snapshot Isolation功能。麻省理工学院的港口。这个问题的原因是,在这个初始版本中,将多个细粒度谓词锁组合成单个粗粒度锁的启发式算法非常简单。我确信它可以得到改进,但是在设计更好的启发式方面,你能给我的关于它遇到这个问题的环境的任何信息都是有价值的。如果您能告诉我一些您正在使用的CPU数量,活动数据库连接数量,以及您点击此处的工作量,我将非常感激。
感谢您提供任何信息,并对此问题表示歉意。