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

Erste Schritte mit Postgres 13 auf Ubuntu 20.04

PostgreSQL 13, die neueste Version der Postgres-Datenbanksoftware, bietet viele Verbesserungen unter der Haube. Obwohl es das beliebteste und vielseitigste Open-Source-RDBMS ist, ist es nicht am einfachsten einzurichten und zu starten. Lesen Sie weiter, um zu erfahren, wie Sie mit der neuesten Version von Postgres auf der neuesten LTS-Version des Ubuntu-Servers loslegen können.

Installation

Ubuntu 20.04 kommt mit Postgres 12 aus seinem Universum Repository. Seit wir Version 13 wollen, können wir direkt das offizielle APT-Repository des PostgreSQL-Projekts verwenden. Dieses Repository enthält Binärdateien für Ubuntu 20.04 und enthält auch Pakete für verschiedene Erweiterungen, die Sie möglicherweise später installieren möchten.

Lassen Sie uns das Repository wie folgt einrichten (beachten Sie, dass „focal“ der Codename für Ubuntu 20.04 ist):

# add the repository
sudo tee /etc/apt/sources.list.d/pgdg.list <<END
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
END

# get the signing key and import it
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo apt-key add ACCC4CF8.asc

# fetch the metadata from the new repo
sudo apt-get update

Wir können jetzt den PostgreSQL-Server und andere Befehlszeilentools installieren mit:

sudo apt-get install -y postgresql-13

Die Installation macht ein paar Dinge:

  • Es installiert den PostgreSQL-Server, Dienstprogramme und einen Befehlszeilen-Client namens psql .
  • Es erstellt einen Linux-Systembenutzer namens postgres . Alle Datendateien gehören diesem Benutzer, und alle Prozesse werden unter diesem Benutzer ausgeführt.
  • Es erstellt einen Datenbank-Cluster (siehe unten). In diesem Cluster erstellt es eine Datenbank, auch postgres genannt .
  • Es erstellt einen PostgreSQL-Benutzer (nicht der Benutzer des Linux-Systems), auch postgres genannt . Dieser PostgreSQL-Benutzer hat Superuser-Privilegien.

Sie können sehen, dass dies langsam verwirrend wird!

Datenbank-Cluster

In Postgres-Begriffen haben wir jetzt einen einzelnen Datenbank-Cluster, der läuft. Ein einzelner Datenbankcluster kann eine oder mehrere Datenbanken enthalten. In dem Datenbankcluster, den wir jetzt haben, gibt es eine Datenbank namens „postgres“. (Es gibt auch ein paar „Vorlagen“-Datenbanken, die wir vorerst ignorieren können.)

Ein Datenbank-Cluster wird von einem Postgres-Hauptprozess namens postmaster verwaltet .Es bringt verschiedene untergeordnete Prozesse hervor, die entweder verschiedene Systemaufgaben ausführen oder eingehende Client-Verbindungen handhaben. Sehen Sie sich die aktuell laufenden Prozesse an:

alice@ubu:~$ ps -o uname,pid,ppid,cmd -H -U postgres
USER         PID    PPID CMD
postgres    4880       1 /usr/lib/postgresql/13/bin/postgres -D /var/lib/postgresql/13/main -c config_file=/etc/postgresql/13/main/postgresql.conf
postgres    4882    4880   postgres: 13/main: checkpointer
postgres    4883    4880   postgres: 13/main: background writer
postgres    4884    4880   postgres: 13/main: walwriter
postgres    4885    4880   postgres: 13/main: autovacuum launcher
postgres    4886    4880   postgres: 13/main: stats collector
postgres    4887    4880   postgres: 13/main: logical replication launcher

Hier ist der Postmaster-Prozess 4880 und er hat 6 untergeordnete Prozesse hervorgebracht, die verschiedene Verwaltungsaktivitäten handhaben. Sie können auch den Speicherort des Clusters sehen (/var/lib/postgresql/13/main ) und den Speicherort der Konfigurationsdatei (/etc/postgresql/13/main/postgresql.conf ).

Neuladen und Neustarten

Gelegentlich müssen Sie möglicherweise neu laden oder neu starten Ihren Postgres-Server. Durch das erneute Laden überprüft Postgres seine Konfigurationsdateien erneut und wendet die Änderungen an. Wenn keine Änderungen an den Konfigurationsdateien vorgenommen werden, passiert nichts Schlimmes. Das Neuladen stört die aktuell verbundenen Clients nicht. Um Ihren Postgres-Server neu zu laden, können Sie Folgendes tun:

sudo systemctl reload postgresql

Einige Konfigurationsänderungen werden erst wirksam, nachdem Sie den Server neu gestartet haben. Dies ist störender und trennt alle verbundenen Clients. Um neu zu starten, können Sie:

sudo systemctl restart postgresql

Protokolldateien

Wie Sie sehen können, gibt es einen systemd-Dienst namens postgresql mit denen Sie den Postmaster steuern können. Wenn der Dienst nicht startet, können Sie seinen Status überprüfen, um nach Fehlermeldungen zu suchen:

alice@ubu:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Thu 2020-10-29 04:52:29 UTC; 25min ago
   Main PID: 4557 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 1075)
     Memory: 0B
     CGroup: /system.slice/postgresql.service

Oct 29 04:52:29 ubu systemd[1]: Starting PostgreSQL RDBMS...
Oct 29 04:52:29 ubu systemd[1]: Finished PostgreSQL RDBMS.

Der PostgreSQL-Server schreibt eine Protokolldatei, die Sie auf detailliertere Fehlermeldungen überprüfen können. Diese Datei befindet sich unter /var/log/postgresql/postgresql-13-main.log :

alice@ubu:~$ cat /var/log/postgresql/postgresql-13-main.log
2020-10-29 04:52:34.096 UTC [4880] LOG:  starting PostgreSQL 13.0 (Ubuntu 13.0-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, 64-bit
2020-10-29 04:52:34.097 UTC [4880] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2020-10-29 04:52:34.099 UTC [4880] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2020-10-29 04:52:34.106 UTC [4881] LOG:  database system was shut down at 2020-10-29 04:52:31 UTC
2020-10-29 04:52:34.112 UTC [4880] LOG:  database system is ready to accept connections

Herstellen einer Verbindung zu Ihrem Postgres-Server

Jetzt, da wir unseren Server eingerichtet und ausgeführt haben, versuchen wir, eine Verbindung zu ihm herzustellen. Standardmäßig lauscht der Server nur auf:

  • TCP-Verbindungen von 127.0.0.1 auf Port 5432 und
  • Unix-Domain-Sockets in /var/run/postgresql

Aufgrund der Standardkonfiguration besteht die einzige Möglichkeit, sich derzeit mit dem Server zu verbinden, über den Unix-Socket von einem Prozess, der als Systembenutzer postgres ausgeführt wird . Lassen Sie uns den standardmäßigen interaktiven Client psql ausführen so:

alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.

postgres=#

Hier führen wir psql als Systembenutzer postgres („sudo -u postgres psql“) aus und verbinden uns mit der Datenbank namens „postgres“ (das letzte „postgres“ in der Befehlszeile). Name der aktuell verbundenen Datenbank („postgres“) und dass wir Superuser-Privilegien haben („#“ im Gegensatz zu „$“).

Die Verbindung erfolgte über Unix-Sockets (dies ist die Standardmethode in psql). Da der Postgres-Benutzer standardmäßig kein Passwort hat und die Standardkonfiguration eine Passwortauthentifizierung für TCP-Verbindungen erfordert, ist es derzeit nicht möglich, eine Verbindung über 127.0.0.1:5432 herzustellen .

Eingehende Verbindungen von einem internen Netzwerk zulassen

Lassen Sie uns zunächst die Konfiguration ändern, um Verbindungen von einem internen Netzwerk zuzulassen. Angenommen, die IP unseres Servers in diesem Netzwerk ist 10.1.2.3, können wir die Hauptkonfigurationsdatei unter /etc/postgresql/13/main/postgresql.conf bearbeiten und ändere die Zeilen:

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all

zu:

listen_addresses = 'localhost,10.1.2.3'

Wir müssen Postgres auch anweisen, die Passwortauthentifizierung für Verbindungen zu verwenden, die von diesen Netzwerken hereinkommen. Bearbeiten Sie dazu eine weitere Konfigurationsdatei namens /etc/postgresql/13/main/pg_hba.conf und ändern Sie die Zeile:

host    all             all             127.0.0.1/32            md5

zu:

host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             10.1.0.0/16             scram-sha-256

(Angenommen, das interne Netzwerk ist 10.1.0.0/16.)

Wir haben auch den Standard md5 geändert -Methode zum neueren und sichereren scram-sha-256 . Alle anderen Vorkommen von md5 in der Datei sollte auch durch scram-sha-256 ersetzt werden . Wenn Ihre Anwendung oder Ihr Datenbanktreiber diese Methode nicht unterstützt, verwenden Sie weiterhin md5 Methode statt.

Damit diese Änderungen wirksam werden, müssen Sie den Server neu starten:

sudo systemctl restart postgresql

Erstellen eines regulären Benutzers und einer regulären Datenbank

Wir haben es fast geschafft!

Wir können jetzt einen regulären Benutzer erstellen, mit dem sich unsere Anwendung verbinden kann, und eine Datenbank, über die sie die volle Kontrolle hat. Verbinden Sie sich als Superuser postgres lokal von der Servermaschine, um dies zu tun:

alice@ubu:~$ sudo -u postgres psql postgres
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
Type "help" for help.

postgres=# SET password_encryption = 'scram-sha-256';
SET
postgres=# CREATE USER alice PASSWORD 's3cr3tp@ss';
CREATE ROLE
postgres=#

(Lassen Sie den ersten Befehl weg, wenn Sie md5 verwenden möchten stattdessen.) Dadurch wurde ein Benutzer namens alice erstellt mit dem Passwort s3cr3tp@ss . Lassen Sie uns auch eine Datenbank erstellen, die dieser Benutzer besitzen wird:

postgres=# CREATE DATABASE app1 OWNER alice;
CREATE DATABASE
postgres=#

Die Datenbank heißt app1 . Seit alice diese Datenbank besitzt, sind alle Operationen innerhalb der Datenbank (wie das Erstellen von Tabellen, das Einfügen von Zeilen) erlaubt, wenn sich die Anwendung als der Benutzer alice verbindet .

Versuchen wir, uns als alice zu verbinden , über das Netzwerk:

~$ psql -h 10.1.2.3 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

app1=>

Cool! Wir sind jetzt mit der Datenbank app1 verbunden als Benutzer alice .

Datenbanken löschen, sichern und wiederherstellen

Hier sind ein paar Tricks, die Ihnen bei der weiteren Arbeit mit Ihrem Postgressserver helfen können:

Löschen einer Datenbank

Sie können die gerade erstellte Datenbank („app1“) wie folgt löschen:

alice@ubu:~$ psql -h 127.0.0.1 -U alice app1
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

app1=> \c postgres
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "postgres" as user "alice".
postgres=> DROP DATABASE app1;
DROP DATABASE
postgres=>

Beachten Sie, dass Sie zuerst mit dem „\c“-Befehl von psql.

zu einer anderen Datenbank wechseln müssen

Um eine andere Datenbank zu erstellen oder app1 neu zu erstellen , verbinden Sie sich als Superuser und führen Sie wie zuvor „CREATE DATABASE“ aus.

Sichern Sie die Datenbank

Der einfachste Weg, die Daten in Ihrer Datenbank zu sichern, ist die Verwendung von pg_dump so:

alice@ubu:~$ pg_dump -h 127.0.0.1 -U alice -f backup.sql app1
Password:

Dadurch wird eine SQL-Datei mit dem Namen „backup.sql“ erstellt, die alle SQL-Befehle enthält, die zum Neuerstellen des Schemas und der Daten in der Datenbank app1 erforderlich sind , im Textformat. Sie können diese Befehle in jeder Datenbank ausführen, und das Schema und die Daten werden in diese Datenbank eingefügt.

Lesen Sie hier mehr über pg_dump.

Daten wiederherstellen

Die oben erstellte SQL-Befehlsdatei kann folgendermaßen wiederhergestellt werden:

alice@ubu:~$ psql -h 127.0.0.1 -U alice app2
Password for user alice:
psql (13.0 (Ubuntu 13.0-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

app2=> \i backup.sql
SET
SET
(..snip..)

Beachten Sie, dass wir das Schema und die Daten in einer anderen Datenbank, app2, wiederhergestellt haben . Mit dem „\i“-Befehl von psql können Sie die SQL-Befehle aus einer Datei ausführen.

Nächste Schritte

Es gibt eine ganze Reihe von Artikeln, Tutorials, Videos und Kursen, die Ihnen helfen, sich mit PostgreSQL vertraut zu machen. Verbringen Sie jedoch etwas Zeit mit der offiziellen Dokumentation hier, die eine maßgebliche und umfassende Abdeckung aller PostgreSQL-Funktionen, -Syntax und gebündelten Dienstprogramme bietet.