]> granicus.if.org Git - postgresql/commitdiff
Extend near-wraparound hints to include replication slots
authorSimon Riggs <simon@2ndQuadrant.com>
Fri, 29 Dec 2017 14:01:25 +0000 (14:01 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Fri, 29 Dec 2017 14:01:25 +0000 (14:01 +0000)
Author: Feike Steenbergen
Reviewed-by: Michael Paquier
doc/src/sgml/logicaldecoding.sgml
src/backend/access/transam/multixact.c
src/backend/access/transam/varsup.c
src/backend/commands/vacuum.c

index 6bab1b9b322de0dcb782882146a2a05b449c2543..fa101937e54cadffa59b6b5b1d5acf096a3e1487 100644 (file)
@@ -248,16 +248,18 @@ $ pg_recvlogical -d postgres --slot test --drop-slot
      may consume changes from a slot at any given time.
     </para>
 
-    <note>
+    <caution>
      <para>
       Replication slots persist across crashes and know nothing about the state
       of their consumer(s). They will prevent removal of required resources
       even when there is no connection using them. This consumes storage
       because neither required WAL nor required rows from the system catalogs
       can be removed by <command>VACUUM</command> as long as they are required by a replication
-      slot.  So if a slot is no longer required it should be dropped.
+      slot.  In extreme cases this could cause the database to shut down to prevent
+      transaction ID wraparound (see <xref linkend="vacuum-for-wraparound"/>).
+      So if a slot is no longer required it should be dropped.
      </para>
-    </note>
+    </caution>
    </sect2>
 
    <sect2>
index 0fb6bf2f02885f62d2f6de0355de21a50681a39e..ba01e94328b7019c82c03a0b27bbe4c909bd1b0c 100644 (file)
@@ -1000,14 +1000,14 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset)
                                                 errmsg("database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"",
                                                                oldest_datname),
                                                 errhint("Execute a database-wide VACUUM in that database.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                        else
                                ereport(ERROR,
                                                (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
                                                 errmsg("database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u",
                                                                oldest_datoid),
                                                 errhint("Execute a database-wide VACUUM in that database.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                }
 
                /*
@@ -1031,7 +1031,7 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset)
                                                                           oldest_datname,
                                                                           multiWrapLimit - result),
                                                 errhint("Execute a database-wide VACUUM in that database.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                        else
                                ereport(WARNING,
                                                (errmsg_plural("database with OID %u must be vacuumed before %u more MultiXactId is used",
@@ -1040,7 +1040,7 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset)
                                                                           oldest_datoid,
                                                                           multiWrapLimit - result),
                                                 errhint("Execute a database-wide VACUUM in that database.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                }
 
                /* Re-acquire lock and start over */
@@ -2321,7 +2321,7 @@ SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid,
                                                                   oldest_datname,
                                                                   multiWrapLimit - curMulti),
                                         errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n"
-                                                        "You might also need to commit or roll back old prepared transactions.")));
+                                                        "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                else
                        ereport(WARNING,
                                        (errmsg_plural("database with OID %u must be vacuumed before %u more MultiXactId is used",
@@ -2330,7 +2330,7 @@ SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid,
                                                                   oldest_datoid,
                                                                   multiWrapLimit - curMulti),
                                         errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n"
-                                                        "You might also need to commit or roll back old prepared transactions.")));
+                                                        "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
        }
 }
 
index 702c8c957f0eabb11982c1d4f2b74bc6469c3d25..4f094e2e63593f1cdc7d2dedfa291016542419d8 100644 (file)
@@ -124,14 +124,14 @@ GetNewTransactionId(bool isSubXact)
                                                 errmsg("database is not accepting commands to avoid wraparound data loss in database \"%s\"",
                                                                oldest_datname),
                                                 errhint("Stop the postmaster and vacuum that database in single-user mode.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                        else
                                ereport(ERROR,
                                                (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
                                                 errmsg("database is not accepting commands to avoid wraparound data loss in database with OID %u",
                                                                oldest_datoid),
                                                 errhint("Stop the postmaster and vacuum that database in single-user mode.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                }
                else if (TransactionIdFollowsOrEquals(xid, xidWarnLimit))
                {
@@ -144,14 +144,14 @@ GetNewTransactionId(bool isSubXact)
                                                                oldest_datname,
                                                                xidWrapLimit - xid),
                                                 errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                        else
                                ereport(WARNING,
                                                (errmsg("database with OID %u must be vacuumed within %u transactions",
                                                                oldest_datoid,
                                                                xidWrapLimit - xid),
                                                 errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n"
-                                                                "You might also need to commit or roll back old prepared transactions.")));
+                                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                }
 
                /* Re-acquire lock and start over */
@@ -403,14 +403,14 @@ SetTransactionIdLimit(TransactionId oldest_datfrozenxid, Oid oldest_datoid)
                                                        oldest_datname,
                                                        xidWrapLimit - curXid),
                                         errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n"
-                                                        "You might also need to commit or roll back old prepared transactions.")));
+                                                        "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                else
                        ereport(WARNING,
                                        (errmsg("database with OID %u must be vacuumed within %u transactions",
                                                        oldest_datoid,
                                                        xidWrapLimit - curXid),
                                         errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n"
-                                                        "You might also need to commit or roll back old prepared transactions.")));
+                                                        "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
        }
 }
 
index 4abe6b15e0dec01034eaea3b7cecc57ee6380d3c..d5f3fa5a314198b377da416b9d9220d0e156c56c 100644 (file)
@@ -655,7 +655,8 @@ vacuum_set_xid_limits(Relation rel,
        {
                ereport(WARNING,
                                (errmsg("oldest xmin is far in the past"),
-                                errhint("Close open transactions soon to avoid wraparound problems.")));
+                                errhint("Close open transactions soon to avoid wraparound problems.\n"
+                                                "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
                limit = *oldestXmin;
        }