Quantcast
Channel: StackExchange Replication Questions
Viewing all articles
Browse latest Browse all 17268

Recovery from Live to a new Slave Server - PostgreSQL - ERROR

$
0
0

I've started a new SLAVE PostgreSQL server set up.

master: 192.168.100.1

slave1: 192.168.100.2

slave2(NEW SLAVE) 192.168.100.3

* NOTE: I run the pg_basebackup from another STANDBY SERVER. Not from the MASTER

1 - screen -t basebackup

2 - su - postgres

3 - cd ~/9.2/data/

4 - ssh postgres@slave1 'pg_basebackup --pgdata=- --format=tar --label=bb_master --progress --host=localhost --port=5432 --username=replicator --xlog | pv --quiet --rate-limit 100M' | tar -x --no-same-owner

5 - I've commented the "primary_conninfo =" and "standby_mode=" so the slave can get the files from WAL_ARCHIVE

6 - Afte I got the logs:

postgres(iostreams)[10037]:       2016-01-09 00:07:26.604 UTC|10085|LOG:  database system is ready to accept read only connections

7 - After the server finished the WAL_ARCHIVE, I turned on replication from MASTER on recovery.conf:

recovery.conf on the New Slave:

restore_command = 'exec nice -n 19 ionice -c 2 -n 7 ../../bin/restore_wal_segment.bash "../wal_archive/%f" "%p"'
archive_cleanup_command = 'exec nice -n 19 ionice -c 2 -n 7 ../../bin/pg_archivecleaup_mv.bash -d "../wal_archive" "%r"'
recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.100.2 port=5432 user=replicator application_name=replication_slave02'

But, once I've restarted the POSTGRESQL I got this error:

WAL segment `../wal_archive/00000005.history` not found
2016-01-09 01:13:39.183 UTC|774|FATAL:  timeline 2 of the primary does not match recovery target timeline 4

ls /var/lib/pgsql/9.2/wal_archive

postgres postgres 0000000200000C6900000065
postgres postgres 0000000200000C6900000066

restore_wal_segment.bash:

#!/bin/bash -eu


# multi version switch for the pg_archivecleanup tool
# package postgresql92-contrib doesn't create an /etc/alernatives link for pg_archivecleanup, and probably
# it's not desirable either. This command switches between different versions of the command based on the
# path it's been invoked from


declare -r -x PATH='/usr/local/bin:/usr/bin:/bin';




declare -i TS_THRESHOLD=0;
declare -i WAL_MTIME=-1;

declare PG_VERSION='';



    # invocation check
    if [ ${#} -lt 2 ] || ([ ${#} -ge 3 ] && (! [[ "${3}" =~ ^[0-9]{1,10}$ ]])); then
        printf 'Usage:\n' 1>&2;
        printf '\t%s { wal_segment_file } { target_file } [ minimum_age_in_seconds ]\n' "${0}" 1>&2;
        exit 2;
    fi;



    # make sure we're running in a PG cluster and extract the version
    if \
        [ -f 'PG_VERSION' ] && \
        [ -f 'postmaster.opts' ] && \
        [ -a 'pg_xlog' ] \
    ; then
        PG_VERSION="$(0<'PG_VERSION')";
        if (! [[ "${PG_VERSION}" =~ ^[0-9]+\. ]]); then
            printf 'PG cluster advertises an invalid PostgreSQL version (%s)\n' "${PG_VERSION}" 1>&2;
            exit 3;
        fi;
    else
        printf 'Current path does not look like a PostgreSQL cluster directory. Aborting\n' 1>&2;
        exit 3;
    fi;

    # This is race-condition prone but we're really trusting postgres not to start multiple instances of this
    # routine in parallel
    if (! ([ -f "${1}" ] || [ -h "${1}" ])); then
        printf 'WAL segment `%s` not found\n' "${1}" 1>&2
        exit 4;
    fi;

    if [ ${#} -ge 3 ]; then
        # we refuse to restore files newer than the threshold with error 7
        TS_THRESHOLD=$(($(date +'%s') - ${3}));
        WAL_MTIME=$(stat --format='%Y' "${1}");

        if [ ${WAL_MTIME} -gt ${TS_THRESHOLD} ]; then
            printf 'Archived WAL segment `%s` is newer than the configured delay (%d seconds)\n' "${1}" ${3} 1>&2
            exit 7;
        fi;
    fi;

    exec cat 0<${1} 1>"${2}";

pg_archivecleaup_mv.bash

#!/bin/bash -eu


# multi version switch for the pg_archivecleanup tool
# package postgresql92-contrib doesn't create an /etc/alernatives link for pg_archivecleanup, and probably
# it's not desirable either. This command switches between different versions of the command based on the
# path it's been invoked from


declare -r -x PATH='/usr/local/bin:/usr/bin:/bin';


declare PG_VERSION='';


    # make sure we're running in a PG cluster and extract the version
    if \
        [ -f 'PG_VERSION' ] && \
        [ -f 'postmaster.opts' ] && \
        [ -a 'pg_xlog' ] \
    ; then
        PG_VERSION="$(0<'PG_VERSION')";
        if (! [[ "${PG_VERSION}" =~ ^[0-9]+\. ]]); then
            printf 'PG cluster advertises an invalid PostgreSQL version (%s)\n' "${PG_VERSION}" 1>&2;
            exit 3;
        fi;
    else
        printf 'Current path does not look like a PostgreSQL cluster directory. Aborting\n' 1>&2;
        exit 3;
    fi;

    # we got the version. we just try to run it. -u is unset so that we can pass "${@}" even if it's not set
    set +u;
    exec "/usr/pgsql-${PG_VERSION}/bin/pg_archivecleanup" "${@}";

What can I do to solve the problem? It's really important as it's a production New Slave. Thank you!


Viewing all articles
Browse latest Browse all 17268

Trending Articles