2013-05-07 90 views
2

我与执行批量复制到Postgres的有关数据的80GB超时。PSQL似乎有长的查询

\copy my_table FROM '/path/csv_file.csv' csv DELIMITER ',' 

事务提交之前,我得到以下错误。

服务器关闭了连接意外 这可能意味着服务器之前或在处理请求异常 终止。

在PostgreSQL的日志:

LOG:server process (PID 21122) was terminated by signal 9: Killed 
LOG:terminating any other active server processes 
WARNING:terminating connection because of crash of another server process 
DETAIL:The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 
HINT: In a moment you should be able to reconnect to the database and repeat your command. 
+0

副本是在本地主机上还是通过远程连接运行?我会说你亲自看到后端崩溃。查看PostgreSQL错误日志以获取详细信息。如果你有很高的work_mem或者maintenance_work_mem,可能你的内存不足了?或者你的磁盘空间不足 - 尽管这通常会产生更好的错误。无论如何,还有什么是精确的PostgreSQL版本? – 2013-05-07 11:55:05

+0

该版本是8.4.11。我在远程机器上运行它。我被打进盒子里,但我正在使用'屏幕'。我在日志中看到了这一点“考虑增加配置参数”checkpoint_segments“” – 2013-05-07 12:16:42

+0

只是为了阐明,'psql'与数据库运行在同一台机器上?不管它是否远离你,只要它远离'psql'客户端;如果你使用'psql'与'localhost'上的数据库进行通信,它不会成为网络问题。 – 2013-05-07 12:25:23

回答

12

你的后端过程接收信号9(SIGKILL)。这可能发生如下情况:

  • 有人发送kill -9手动;
  • 一个cron作业设置为发送在某些情况下(非常不安全的,不这样做)kill -9;或者
  • Linux内存不足(OOM)杀手会触发并终止进程。

在后一种情况下,您将在内核的dmesg输出中看到OOM杀手活动的报告。我希望这是你会看到你的情况。

的PostgreSQL服务器应该没有虚拟内存过量配置,使得OOM杀手不运行和PostgreSQL可以处理内存不足的条件自身。见the PostgreSQL documentation on Linux memory overcommit

单独的问题:“这是为什么使用这么多内存”仍然存在。在回答这个需要你设置的更多的知识:服务器多少RAM有,量有多大是免费的,你work_memmaintenance_work_mem设置是什么等,这是不是一个很有趣的调查,直到你升级的问题目前的PostgreSQL 8.4补丁版本以确保问题不是已经解决的问题。

+0

升级到postgres 9.1的窍门,似乎是一个8.4的问题。再次感谢Craig的帮助。 – 2013-05-09 11:41:48

+1

@MattE或旧的8.4修补程序版本问题。你通常应该尝试跟上补丁,例如应该确实运行8.4.17而不是8.4.11。这对于安全性,性能和可靠性等非常重要。 – 2013-05-09 12:37:05