2013-05-07 73 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