I can think of two other ways but the latter is more a pause than read-only. Neither are ideal solutions but hacks that may work depending on your needs. 1. If you’re restarting the server; then just make it a replia of nobody. Con: 1. Requires database restart which could take a while depending on database activity 2. Truly is read only… i.e. no temp tables, etc. i.e. Create a recovery.conf and restart the server… the database is truly read only. recovery.conf: standby_mode = 'on' primary_conninfo = ‘host=nowhere' 2. Without restarting server; enable synchronous replication to nowhere and reload config. Cons: 1. More of a pause than read-only 2. Clients can still write changes but will hang on commit (causing applications to hang). 3. Ctrl-c on a hanged session will actually commit the record on the master (oops) Pro or Con depending on your view: 1. When releasing the synchronous setup to nowhere; hung sessions will carry on with their commit. postgres.conf: synchronous_standby_names = ‘1 (nowhere)’ If you trust your clients; then setting the default transaction state and killing the sessions forcing a reconnect might be the best solution like has already been suggested; however, if you dealing with end users they can change their session transaction level back.
|