PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

pg_ctl Tipps und Tricks

pg_ctl ist ein sehr nützliches, aber unterschätztes Dienstprogramm, das das Leben von Entwicklungsteams erleichtern kann. Lesen Sie weiter, um mehr über pg_ctl zu erfahren und wie es Ihre Entwicklungs- und Test-Workflows verbessern kann.

Was ist pg_ctl?

pg_ctl ist ein Befehlszeilentool, das in der Standard-Postgres-Distribution enthalten ist. Es ist überall dort verfügbar, wo es Postgres selbst gibt, ähnlich wie die anderen enthaltenen Tools wie psql und pg_dump .

Die ausführbare Datei befindet sich im selben Verzeichnis wie die anderen Postgres-Binärdateien. Der genaue Speicherort variiert je nach Linux-Distribution und Postgres-Version:

# debain, ubuntu, ...
/usr/lib/postgresql/11/bin

# rhel, centos, ...
/usr/pgsql-11/bin

Sie können dieses Verzeichnis zu Ihrem PATH hinzufügen oder den vollständigen Pfad mit dem Alias ​​pg_ctl versehen.

Erstellen Sie einen Datenbankcluster

Im Gegensatz zu anderen RDBMS wird ein einzelner Postgres-Datenbankserverprozess (historisch postmaster genannt ), verwaltet einen Datenbank-Cluster . Die Verwendung des Begriffs Cluster ist nicht modern und bezieht sich nicht auf eine Gruppe vernetzter Knoten. Ein Datenbank-Cluster hostet eine Reihe von Datenbanken, wobei einige Funktionen (Rollen, physische Replikation, WAL-Dateien usw.) allen gemeinsam sind. Der Postgressystemd-Dienst, der von Ihrer Linux-Distribution installiert wird, bedient einen einzelnen Datenbankcluster.

Sie können pg_ctl verwenden um einen Datenbank-Cluster zu erstellen. Bei der Erstellung befindet sich der Cluster vollständig in einem einzigen Verzeichnis. Sie enthält alle notwendigen Konfigurationsdateien (postgres.conf , pg_hba.conf , usw.) und Datendateien. Es ist in sich abgeschlossen und kann auf einen anderen halbwegs ähnlichen Computer verschoben werden, wenn die Dateiberechtigungen korrekt gehandhabt werden. Sie können sogar Protokolldateien innerhalb des Verzeichnisses ablegen, sodass Sie alle zugehörigen Dateien (Konfiguration, Daten, Protokolle) an einem Ort haben.

Verwenden Sie zum Erstellen eines Datenbank-Clusters:

$ pg_ctl -D myclus initdb

Dadurch wird ein Verzeichnis namens myclus erstellt unter dem aktuellen Verzeichnis und füllt es mit allen Dateien, die zum Starten eines Servers von dort aus erforderlich sind.

Hier ist eine Beispielsitzung:

$ pg_ctl -D myclus initdb
The files belonging to this database system will be owned by user "alice".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory myclus ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    /usr/lib/postgresql/11/bin/pg_ctl -D myclus -l logfile start

Datenbankserver starten

Ein „Postgres-Server“ ist im Grunde ein Postmaster Prozess, der mit dem Speicherort eines Datenbank-Cluster-Verzeichnisses gestartet wird. Dieser Postmaster-Prozess erzeugt seinerseits mehrere Prozesse, die verschiedene Hintergrundaktivitäten ausführen und eingehende Verbindungen verarbeiten. Sie können dieses Prozessmodell in Aktion sehen, indem Sie den Systemprozessbaum beispielsweise mit einem Tool wie htop anzeigen.

Um einen Postmaster-Prozess für Ihren neuen Datenbank-Cluster zu starten, verwenden Sie:

$ pg_ctl -D myclus -l myclus/log start

Das -l Die Option gibt den Speicherort der Postgres-Protokolldatei an, die sich in diesem Fall im Clusterverzeichnis selbst befindet. Es ist nicht ungewöhnlich, die Protokolldatei im Clusterverzeichnis abzulegen.

Sie sollten eine Ausgabe wie diese sehen:

waiting for server to start.... done
server started

Das Neuladen, Neustarten und Stoppen geschieht wie erwartet:

$ pg_ctl -D myclus -l myclus/log reload
server signaled
$ pg_ctl -D myclus -l myclus/log restart
waiting for server to shut down.... done
server stopped
waiting for server to start.... done
server started
$ pg_ctl -D myclus -l myclus/log stop
waiting for server to shut down.... done
server stopped

Sie sollten jetzt mit Clients wie psql eine Verbindung zu diesem neuen Cluster herstellen können und pgAdmin .

Port und andere Optionen einstellen

Praktischerweise müssen Sie, wenn Sie Postgres bereits auf Ihrem Computer installiert haben, wahrscheinlich myclus/postgres.conf bearbeiten und ändern Sie die Werte für Port , unix_socket_directories und vielleicht auch listen_address bevor der Cluster sauber startet. Dies liegt daran, dass der vom System installierte Postgres-Dienst bereits auf Port 5432 und den Verzeichnissen in unix_socket_directories ausgeführt wird kann von einem normalen Benutzer nicht beschrieben werden. Die standardmäßige listen_address ist localhost, was bedeutet, dass Sie von außerhalb von localhost keine Verbindung zum Cluster herstellen können.

Wenn Sie pg_ctl verwenden Zum Erstellen und Abbauen von Clustern in Ihren automatisierten Testskripten ist es einfacher, wenn Sie diese Optionen direkt von der Befehlszeile aus angeben können, anstatt myclus/postgres.conf programmgesteuert zu bearbeiten .Sie können die Optionen wie folgt angeben:

$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i" start

Dadurch wird der Server auf Port 6000 gestartet, wobei der Unix-Socket im Verzeichnis /tmp erstellt wird und auf allen Schnittstellen lauschen.

Sie müssen diese Optionen nur für „start“ angeben, Sie können sie für andere Befehle weglassen, einschließlich sogar „restart“.

Andere nützliche Startoptionen

Es gibt ein paar andere Optionen, die Sie innerhalb von „-o“ verwenden können und die nützlich sein könnten:

  • -F deaktiviert fsync, nützlich zur schnelleren Fertigstellung von Testskripten
  • -B shared_bufffers Setzen Sie den Wert von shared_buffers , Beispiel -B 100MB
  • -c conf_var=value Setzen Sie einen beliebigen Konfigurationswert, Beispiel -c wal_level=logical

Hier ist ein Beispiel mit einigen dieser Sätze:

$ pg_ctl -D myclus -l myclus/log -o "-p 6000 -k /tmp -i -B 100MB -c wal_level=logical" start

Diese Optionen sind eigentlich die Befehlszeilenoptionen von postgres Prozess, dessen vollständige Liste hier dokumentiert ist.

Datenbank einer anderen Postgres-Version ausführen

EnterpriseDB hostet vorgefertigte Binärdateien für verschiedene Postgres-Versionen für verschiedene Plattformen. Dies sind Tarballs ohne Installer.

Schnappen Sie sich den gewünschten Tarball, entpacken Sie ihn, suchen Sie pg_ctl binär damit, und verwenden Sie das, um einen Cluster zu erstellen. pg_ctl findet automatisch die zugehörige initdb/postgres/andere Binärdateien, die zum Erstellen/Starten des Clusters benötigt werden.

Sie können dies unabhängig von einer bestehenden PostgreSQL-Installation auf dem Computer verwenden.

Dienste unter Windows erstellen

pg_ctl ist auf allen Plattformen verfügbar, einschließlich MacOS und Windows. Insbesondere können Sie damit auf einfache Weise einen Dienst erstellen, der über den Service Control Manager (SCM) gestartet und gestoppt werden kann. Verwenden Sie zum Erstellen eines Dienstes:

pg_ctl -D myclus -N myclus_service register

Dadurch wird ein automatisch startender Dienst namens „myclus_service“ erstellt.

Diese Funktion ist nur in Postgres v10 und höher verfügbar.