Postgresql

org.postgresql.util.PSQLException:錯誤:由於與恢復衝突而取消語句

  • December 14, 2016

我目前有一個 PostgreSQL 從節點出現問題,而這些問題不會出現在主節點中。似乎與節點同步過程有關。

完整的堆棧跟踪:

org.postgresql.util.PSQLException: ERROR: canceling statement due to conflict with recovery
 Detail: User query might have needed to see row versions that must be removed.
   at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
   at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
   at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
   at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
   at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
   at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
   at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:82)
   at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:82)
   at cl.waypoint.mailer.reportes.BasicReport.getSingleColumn(BasicReport.java:542)
   at cl.waypoint.mailer.reportes.BasicReport.getSingleColumn(BasicReport.java:518)
   at cl.waypoint.mailer.reportes.StatusSemanalClientes.updateIgnicion(StatusSemanalClientes.java:448)
   at cl.waypoint.mailer.reportes.StatusSemanalClientes.access$2(StatusSemanalClientes.java:447)
   at cl.waypoint.mailer.reportes.StatusSemanalClientes$TempAndDoorLocator.call(StatusSemanalClientes.java:414)
   at cl.waypoint.mailer.reportes.StatusSemanalClientes$TempAndDoorLocator.call(StatusSemanalClientes.java:1)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
   at java.util.concurrent.FutureTask.run(FutureTask.java:166)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
   at java.lang.Thread.run(Thread.java:722)

數據庫版本:

PostgreSQL 9.4.9 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit

作業系統版本:

Distributor ID: Debian
Description:    Debian GNU/Linux 8.6 (jessie)
Release:    8.6
Codename:   jessie

問題是:如何調試問題的實際原因和/或解決/避免問題?如果需要查明問題,請不要猶豫,詢問更多資訊,現在只是不知道還能提供什麼。

PS:如果有問題的查詢被重複,則不會出現錯誤,因此它與查詢本身並不嚴格相關,但可能與表更新/同步瞬態有關。

您所看到的對於在主伺服器上執行備用數據庫和更大查詢的任何人來說都是一種常見的體驗。有幾個可能的原因

Hot Standby 還可能發生其他類型的衝突。從某種意義上說,這些衝突是硬衝突,可能需要取消查詢,並且在某些情況下,需要斷開會話來解決它們。為使用者提供了幾種處理這些衝突的方法。衝突案例包括:

主伺服器上的訪問排他鎖,包括顯式 LOCK 命令和各種 DDL 操作,與備用查詢中的表訪問衝突。

  • 刪除主數據庫上的表空間與使用該表空間儲存臨時工作文件的備用查詢衝突。
  • 刪除主數據庫上的數據庫與連接到備用數據庫上的該數據庫的會話衝突。
  • 來自 WAL 的真空清理記錄的應用與備用事務衝突,後者的快照仍然可以“看到”任何要刪除的行。
  • 來自 WAL 的真空清理記錄的應用與訪問備用伺服器上的目標頁面的查詢衝突,無論要刪除的數據是否可見。

什麼時候查詢會因為上述原因之一被終止很難預測,但通常有一些會更頻繁地出現。它也是可配置的,有關選項請進一步閱讀文件頁面。

最重要的選項是hot_standby_feedback,它有助於解決最常見的原因(VACUUM刪除最近死掉的行)。它有自己的成本(可能導致表膨脹),但結果通常仍然比在主伺服器上執行相同的查詢要好。

引用自:https://dba.stackexchange.com/questions/157381