You are right. I did not read the doc correctly.

Is there anyway to specify a timestamp and get the database to recover to
the first transaction after that point?


On Mon, Jul 1, 2013 at 10:07 AM, Fujii Masao <masao.fu...@gmail.com> wrote:

> On Sat, Jun 29, 2013 at 7:12 AM,  <eyal.ka...@delphix.com> wrote:
> > The following bug has been logged on the website:
> >
> > Bug reference:      8269
> > Logged by:          PITR Recovery by timestamp ignores
> recovery_target_inclusive
> > Email address:      eyal.ka...@delphix.com
> > PostgreSQL version: 9.2.4
> > Operating system:   RHEL
> > Description:
> >
> > While doing Point-in-time recovery and specifying a timestamp as the
> target,
> > I noticed that the timestamp is always considered as exclusive (as if
> > recovery_target_inclusive was set to false), i.e the recovery process
> will
> > always stop before the timestamp and never after. Example:
> >
> >
> > $cat recovery.conf:
> > restore_command = 'cp ../archive/%f %p 2>/dev/null'
> > recovery_target_time = '2013-06-27 17:40:10-0700'
> > recovery_target_inclusive = true
> >
> >
> > after recovery in the postgres log file:
> > ...
> > LOG:  starting point-in-time recovery to 2013-06-27 17:40:10-07
> > LOG:  restored log file "000000010000002B000000A7" from archive
> > ...
> > LOG:  recovery stopping before commit of transaction 1962, time
> 2013-06-27
> > 17:40:15.849203-07
> > LOG:  redo done at 2B/B0004098
> > LOG:  last completed transaction was at log time 2013-06-27
> > 17:39:59.047882-07
> > LOG:  selected new timeline ID: 2
> >
> >
> > By looking at the source, it appears that the problem is in xlog.c,
> function
> > 'recoveryStopsHere':
> > #########
> > 5969: if (recoveryTargetInclusive)
> > 5970:   stopsHere = (recordXtime > recoveryTargetTime);
> > 5971: else
> > 5972:   stopsHere = (recordXtime >= recoveryTargetTime);
> > 5973:if (stopsHere)
> > 5974:   *includeThis = false;
> > #########
> >
> >
> > Even if recoveryTargetInclusive is true, includeThis will bet set to
> false
> > when reaching the last record, causing the record not to be applied.
>
> In that case, since the time of the last record is newer than the
> recovery_target_time,
> it seems correct not to apply that record.
>
> That is, if recovery_target_inclusive is true, all the records whose
> time is older than
> or equal to the recovery_target_time should be applied. If
> recovery_target_inclusive
> is false, all the records whose time is only older than the
> recovery_target_time should
> be applied. Currently the recovery process works as expected.
>
> Regards,
>
> --
> Fujii Masao
>

Reply via email to