pg_resetxlog to clear backup start/end locations. - Mailing list pgsql-hackers

From Kyotaro HORIGUCHI
Subject pg_resetxlog to clear backup start/end locations.
Date
Msg-id 20140613.170818.259505364.horiguchi.kyotaro@lab.ntt.co.jp
Whole thread Raw
Responses Re: pg_resetxlog to clear backup start/end locations.  (Fujii Masao <masao.fujii@gmail.com>)
List pgsql-hackers
Hello, this is a patch that add the function to clear backup
location information to pg_resetxlog.

As per the discussion held before, this function cannot be back
patched to the older versions than 9.4. And it also slipped over
9.4 so proposed in this CF.

This simplly erases the backup location information in pg_control
written during recovery. This is seen as the output of
pg_controldata.
| $ pg_controldata | pg_control version number:            942| Catalog version number:               201406121| ...
!| Backup start location:                0/0
!| Backup end location:                  0/0
!| End-of-backup record required:        no| ...

Under some condition, this values sticks having valid values even
though the WAL record which indicates the end of backup won't
come. This option could be used to forcibly finish the blocked
recovery procedure.

regards,

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index 915a1ed..5b80cfa 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -86,6 +86,7 @@ main(int argc, char *argv[])    int            c;    bool        force = false;    bool
noupdate= false;
 
+    bool        resetbackuplocs = false;    MultiXactId set_oldestmxid = 0;    char       *endptr;    char
*endptr2;
@@ -111,7 +112,7 @@ main(int argc, char *argv[])    }
-    while ((c = getopt(argc, argv, "fl:m:no:O:x:e:")) != -1)
+    while ((c = getopt(argc, argv, "fl:m:no:O:x:e:b")) != -1)    {        switch (c)        {
@@ -123,6 +124,10 @@ main(int argc, char *argv[])                noupdate = true;                break;
+            case 'b':
+                resetbackuplocs = true;
+                break;
+            case 'e':                set_xid_epoch = strtoul(optarg, &endptr, 0);                if (endptr == optarg
||*endptr != '\0')
 
@@ -351,6 +356,13 @@ main(int argc, char *argv[])        ControlFile.checkPointCopy.PrevTimeLineID = minXlogTli;    }
+    if (resetbackuplocs)
+    {
+        ControlFile.backupStartPoint = InvalidXLogRecPtr;
+        ControlFile.backupEndPoint = InvalidXLogRecPtr;
+        ControlFile.backupEndRequired = false;
+    }
+    if (minXlogSegNo > newXlogSegNo)        newXlogSegNo = minXlogSegNo;
@@ -1088,6 +1100,7 @@ usage(void)    printf(_("  -O OFFSET        set next multitransaction offset\n"));    printf(_("
-V,--version    output version information, then exit\n"));    printf(_("  -x XID           set next transaction
ID\n"));
+    printf(_("  -b               reset backup start/end locations\n"));    printf(_("  -?, --help       show this
help,then exit\n"));    printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));} 

pgsql-hackers by date:

Previous
From: Michael Paquier
Date:
Subject: Re: WAL replay bugs
Next
From: Quan Zongliang
Date:
Subject: Re: PL/pgSQL support to define multi variables once