2017-03-21 1 views
0

Zur Zeit habe ich 2 PostgreSQL-Serverzu PostgreSQL-Datenbanken auf verschiedenen Servern

  • PostgreSQL 9,4
    • Database1
    • Database2
    • Datenbank3
  • PostgreSQL 9.6 Aufrechterhaltung der Anschluss
    • Database1
    • Database2
    • Datenbank3

Auf jedem Server manchmal muss ich Schemaänderungen tun, damit ich alle Verbindungen zu dieser bestimmten Datenbank zu blockieren haben und alle bestehenden Verbindungen schließen. Da die Namen der Datenbank für einige Datenbanken die gleichen sind, was ist der beste Weg, dies zu tun? Jede Hilfe wird geschätzt.

Ich benutze pgAdmin 4.1.3.

Wie lautet der SQL-Code zum Trennen aller vorhandenen und zum Blockieren aller neuen Verbindungen und zum erneuten Zulassen neuer Verbindungen?

+0

Sie nicht brauchen, db zu isolieren Schemaänderungen zu machen ... –

+0

@VaoTsun brauche ich nicht, aber ich möchte alle trennen verbundene Benutzer und deaktivieren Sie alle eingehenden Verbindungen. – KuKeC

+0

Also ist die Frage dann? .. Verwenden Sie 'pg_cancel (terminate) _backend (pid) von pg_stat_activity', verbunden mit' select oid from pg_database' –

Antwort

2
select pg_terminate_backend(pid) from pg_stat_activity where pid <> pg_backend_pid(); 

wird alle Sitzung außer Ihnen töten. Sie können pg_cancel_backend verwenden, anstatt zu töten ...

zu blockieren, neue Verbindungen löschen Sie entweder tun können:

  1. Änderung Port (Neustart erforderlich)
  2. Änderung listen_addresses (Neustart erforderlich)
  3. Host hinzufügen alle alle 0.0.0.0/0 ablehnen auf anderen Linien in pg_hba.conf (erfordert reload)
  4. alter user set default_transaction_read_only = on für alle Benutzer
  5. Update pg_database gesetzt datallowconn = False wo datname = '...' oder ALTER DATABASE "name" ALLOW_CONNECTIONS false wenn Sie 9.5 or higher

Die vierte laufen leicht überwunden werden kann, aber erfordert keine Änderungen in Config.

Die fünfte not meant for such usage, aber auf jeden Fall hier hilfreich - danke @ Nick Barnes

+1

5. 'Update pg_database gesetzt datallowconn = false wo datname = '...' ' –

+0

ein guter Punkt! :) –

+1

Eigentlich habe ich gerade gemerkt, dass sie endlich Unterstützung für diese (sowie die 'datistemplate' Flagge) zu 'ALTER DATABASE' hinzugefügt haben (https://www.postgresql.org/docs/9.5/static/sql -alterdatabase.html) in 9.5, so dass das Kataloghacken nicht mehr nötig ist :) –

Verwandte Themen