Re: Running pg_dump from a slave server - Mailing list pgsql-general

From Venkata B Nagothi
Subject Re: Running pg_dump from a slave server
Date
Msg-id CAEyp7J-e+G-Tk+tUPbYqHNUTw=9yoKcWnkpu_noRYGaFHHtuAg@mail.gmail.com
Whole thread Raw
In response to Re: Running pg_dump from a slave server  (Sameer Kumar <sameer.kumar@ashnik.com>)
List pgsql-general

On Wed, Aug 17, 2016 at 2:09 PM, Sameer Kumar <sameer.kumar@ashnik.com> wrote:


On Wed, Aug 17, 2016 at 12:00 PM Venkata B Nagothi <nag1010@gmail.com> wrote:
On Wed, Aug 17, 2016 at 1:31 PM, Sameer Kumar <sameer.kumar@ashnik.com> wrote:


On Wed, Aug 17, 2016 at 10:34 AM Patrick B <patrickbakerbr@gmail.com> wrote:
Hi guys,

I'm using PostgreSQL 9.2 and I got one master and one slave with streaming replication.

Currently, I got a backup script that runs daily from the master, it generates a dump file with 30GB of data.

I changed the script to start running from the slave instead the master, and I'm getting this errors now:

pg_dump: Dumping the contents of table "invoices" failed: PQgetResult() failed.
pg_dump: Error message from server: ERROR:  canceling statement due to conflict with recovery
DETAIL:  User was holding a relation lock for too long.

Looks like while your pg_dump sessions were trying to fetch the data, someone fired a DDL or REINDEX or VACUUM FULL on the master database. 


Isn't that possible? I can't run pg_dump from a slave?


Well you can do that, but it has some limitation. If you do this quite often, it would be rather better to have a dedicated standby for taking backups/pg_dumps. Then you can set max_standby_streaming_delay and max_standby_archiving_delay to -1. But I would not recommend doing this if you use your standby for other read queries or for high availability.

Another option would be avoid such queries which causes Exclusive Lock on the master database during pg_dump.

Another work around could be to pause the recovery, execute the pg_dump and then, resume the recovery process. Not sure if this work around has been considered.

You can consider executing "pg_xlog_replay_pause()" before executing pg_dump and then execute "pg_xlog_replay_resume()" after the pg_dump process completes.

Ideally I would not prefer if I had only one standby. If I am right, it would increase the time my standby would take to complete recovery and become active during a promotion (if I need it during a failure of master). It may impact high availability/uptime. Isn't it?

Yes, depending on how long pg_dump takes on standby, the lag would increase by that much time. It does have an impact on high availability up-time which needs to be taken into consideration and same is the case with max_standby* parameters as you mentioned above. I am just referring to an option for a clean pg_dump from standby, ofcourse, provided it adheres with high-availability up-time SLA.

Regards,
Venkata B N

Fujitsu Australia

pgsql-general by date:

Previous
From: Sameer Kumar
Date:
Subject: Re: Running pg_dump from a slave server
Next
From: Venkata B Nagothi
Date:
Subject: Re: Question about performance - Postgres 9.5