Hi all,

    For PG versions < 8.3 (specifically 8.2) I wanted the %r parameter to be
substituted by the last restart point, just as the recovery code does in >
8.3. I assumed there would be objections to it (else it would have already
been there in 8.2.x), so started looking for workarounds. After a few ideas,
I settled with using the output of pg_controldata.

    Here's what I have done: I execute pg_controldata and parse it's output
to extract the same information as xlog.c provides for %r in versions > 8.3.
Then I rebuild the XLog filename, just like xlog.c, and emit it from the
script. All this is done in a perl script (at the end of this mail).

    My next step is: use this script in the restore_command to provide the
%r parameter to pg_standby, like so:

restore_command = 'pg_standby -c -d -s 5 -w 0 -t
/tmp/pg_standby.trigger.5433 ../wal_archive/ %f %p `perl
/home/gurjeet/dev/last_restart_point.pl` 2>> pg_standby.log'

    I have tested this script using the following restore_command, on a HEAD
version:

restore_command = 'echo before `perl
/home/gurjeet/dev/last_restart_point.pl` >> pg_standby.log && pg_standby -c
-d -s 5 -w 0 -t /tmp/pg_standby.trigger.5433 ../wal_archive/ %f %p %r 2>>
pg_standby.log && echo after `perl /home/gurjeet/dev/last_restart_point.pl`
>> pg_standby.log'

    Using the above restore_command, I can see that my script is able to
detect the change in the restart point (%r) just as soon as the server
updates it. Here's a snippet:

<snip>
...
Keep archive history    : 000000010000000100000021 and later
running restore     : OK
after 000000010000000100000021
before 000000010000000100000045

Trigger file        : /tmp/pg_standby.trigger.5433
Waiting for WAL file    : 000000010000000100000047
WAL file path       : ../wal_archive//000000010000000100000047
Restoring to...     : pg_xlog/RECOVERYXLOG
Sleep interval      : 5 seconds
Max wait interval   : 0 forever
Command for restore : cp "../wal_archive//000000010000000100000047"
"pg_xlog/RECOVERYXLOG"
Keep archive history    : 000000010000000100000045 and later
running restore     : OK
removing "../wal_archive//000000010000000100000025"
removing "../wal_archive//00000001000000010000002D"
removing "../wal_archive//000000010000000100000031"
...
<./snip>


    So, is this a safe way of extracting the last restart point for PG < 8.3?
Or would it be possible to make PG<8.3 provide this %r through some patch?

Best regards,
Gurjeet.

Here's the perl script:

<script>
my @text = `pg_controldata .`; # here . represents the PGDATA, since the
server is executing here.
my $line;

my $time_line_id;
my $redo_log_id;
my $redo_rec_off;
my $wal_seg_bytes;
my $redo_log_seg;

foreach $line ( @text )
{
    $line = mychomp( $line );

    if( $line =~ m/Latest checkpoint's TimeLineID:\s*(([0-9])+)/ )
    {
        # decimal number
        $time_line_id = 0 + $1;
    }
    if( $line =~ m/Latest checkpoint's REDO
location:\s*(([0-9]|[A-F])+)\/(([0-9]|[A-F])+)/ )
    {
        # hexadecimal numbers
        $redo_log_id = $1;
        $redo_rec_off = $3;
    }

    if( $line =~ m/Bytes per WAL segment:\s*([0-9]+)/ )
    {
        # decimal number
        $wal_seg_bytes = $1;
    }
}

$redo_log_seg = sprintf( "%d", hex( $redo_rec_off ) / $wal_seg_bytes );

print "" . sprintf( "%08X%08X%08X", $time_line_id, $redo_log_id,
$redo_log_seg ) . "\n";

# Wrapper around Perl's chomp function
sub mychomp
{
    my ( $tmp ) = @_;
    chomp( $tmp );
    return $tmp;
}

</script>


-- 
[EMAIL PROTECTED]
[EMAIL PROTECTED] gmail | hotmail | indiatimes | yahoo }.com

EnterpriseDB http://www.enterprisedb.com

Mail sent from my BlackLaptop device

Reply via email to