Re: 9.1.2: Preventing connections / syncing a database - Mailing list pgsql-general

From Jay Levitt
Subject Re: 9.1.2: Preventing connections / syncing a database
Date
Msg-id 4F01D5FD.3040706@gmail.com
Whole thread Raw
In response to Re: 9.1.2: Preventing connections / syncing a database  ("Greg Sabino Mullane" <greg@turnstep.com>)
Responses Re: 9.1.2: Preventing connections / syncing a database
List pgsql-general
Greg Sabino Mullane wrote:
> update pg_database set datallowconn = false where datname = 'foobar';

That's perfect - thanks.  Now I can (I think) do this:

pg_restore -d rails_dev_new
[wait]
psql template1
   update pg_database set datallowconn = false where datname = 'rails_dev';
   select pg_terminate_backend(procpid) from pg_stat_activity where \
     datname='rails_dev';
   begin;
   alter database rails_dev rename to rails_dev_old;
   alter database rails_dev_new rename to rails_dev;
   commit;
   drop database rails_dev_old;
   \q

>> >  2. What's a better way to slave to a master database without being a
>> >  read-only slave?  In other words, we want to use the production database as
>> >  a starting point each morning, but we'll be creating test rows and tables
>> >  that we wouldn't want to propagate to production. Can I do this while the
>> >  database is live through some existing replication tool?  The production
>> >  database is on Ubuntu but the workstations are Macs, FWIW.
>
> How incremental does it need to be? You could use Bucardo to create
> slaves that can still be written to. Then in the morning you would simply
> kick off a sync to bring the slave up to date with the master (and optionally
> remove any test rows, etc.) Many caveats there, of course - it depends on
> your exact needs. If you have the right hardware/software, using snapshots
> or clones is an excellent way to make dev databases as well.

Bucardo looks great for replication, but it mentions that it won't do DDL. I
think that means if someone added a new column to production yesterday, but
I haven't run that migration yet locally, Bucardo will choke when it tries
to sync.. ya? (Though the easy workaround is run the darn migration first.)

By "snapshots", do you mean filesystem-level snapshots like XFS or LVM? OS X
has no support for either, sadly.

If you mean Postgres snapshots (and can I mention that I don't yet
understand where MVCC snapshots meet WAL/xlog, but let's say snapshots are a
thing), I see in the Slony docs that:

 > WAL-based replication duplicates absolutely everything, and nothing extra
 > that changes data can run on a WAL-based replica.

That sounds like I couldn't use production log-shipping to sync test
databases.  Unless that doc is not *quite* true, and I could somehow:

- Sync from production
- Take a snapshot (whatever that means, exactly)
- Do whatever with the test database
- Tomorrow, just before I sync, roll back to that snapshot
- Repeat

>
> If the pg_dump / restore is working for you, I'd keep that as long as you
> can. Try fiddling with some of the compressions, etc. to maximize speed.
> Quick ideas: try nc or tweak rsync, and on the slave: turn fsync off,
> boost maintenance_work_mem and checkpoint_segments, look into parallel
> restore.

Yeah, it's working for now, but we're at that hockey-stick point on the
curve where what works now will be too slow three months from now, so I want
to start thinking ahead.

Those are good ideas; I bet the pg_restore can be much faster with giant
checkpoints, lots of memory, etc.  I also see Bucardo's split_pg_dump, which
would probably help - no point creating indexes on-the-fly.

Jay

pgsql-general by date:

Previous
From: Jay Levitt
Date:
Subject: Re: 9.1.2: Preventing connections / syncing a database
Next
From: "'Isidor Zeuner'"
Date:
Subject: handling out of memory conditions when fetching row descriptions