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

Upgrade von PostgreSQL 11 auf PostgreSQL 13 mit TimescaleDB und PostGIS unter Linux mit pg_upgrade

Unternehmen und Unternehmen, die alte Versionen von PostgreSQL (PG) verwenden, stehen vor Herausforderungen, wenn sie mindestens auf die neueste stabile Version von PostgreSQL 12 oder PostgreSQL 13 aktualisieren. Es gibt viele Gründe, warum ein Upgrade auf die neueste Version a muss. Einige der Hauptgründe dafür sind die Vorteile der kritischen Erweiterungen der integrierten Funktionen, Sicherheitsupdates, Leistungsverbesserungen und neuen Implementierungen, die für die Datenbankverwaltung von Vorteil sind.

Das Upgrade von PostgreSQL ist mit einigen Herausforderungen verbunden, da es im Vergleich zu anderen Mainstream-Datenbanken nicht so einfach ist. Machen Sie sich keine Sorgen, wenn Sie mit dieser Art von Problem konfrontiert sind. PostgreSQL bindet Sie nicht an eine bestimmte zu verwendende Version. In diesem Blog gehen wir ein Beispiel für diese Herausforderung durch, während eine TimescaleDB und PostGIS auf einem vorhandenen PostgreSQL 11-Host installiert sind.

Warum pg_upgrade?

pg_upgrade gibt es schon sehr lange als Tool zum Upgraden von Hauptversionen von PostgreSQL. Die Verwendung dieses Tools ist für Nebenversions-Upgrades nicht erforderlich, was bedeutet, dass ein Upgrade Ihrer aktuellen Version von 11.9 auf 11.13 nicht erforderlich ist.

Wenn Sie Ihr PostgreSQL mit pg_upgrade auf eine Hauptversion aktualisieren, ermöglicht das Tool, dass die in PostgreSQL-Datendateien gespeicherten Daten auf eine spätere PostgreSQL-Hauptversion aktualisiert werden können. Dies funktioniert, ohne dass ein Daten-Dump/Neuladen erforderlich ist, was bei einem großen Datensatz einige Zeit dauern kann.

Jetzt kommt die Aufregung. PostgreSQL, insbesondere für Hauptversionen, ist dafür bekannt, dass neue Funktionen hinzugefügt wurden, die häufig das Layout der Systemtabellen ändern, aber das interne Datenspeicherformat ändert sich selten. pg_upgrade nutzt diese Tatsache, um schnelle Upgrades durchzuführen, indem neue Systemtabellen erstellt und einfach die alten Benutzerdatendateien wiederverwendet werden. Wenn eine zukünftige Hauptversion jemals das Datenspeicherformat so ändert, dass das alte Datenformat unlesbar wird, ist pg_upgrade für solche Upgrades nicht verwendbar. (Die Community wird versuchen, solche Situationen zu vermeiden.)

Manche halten pg_upgrade für gefährlich, insbesondere für die Produktionsumgebung. Nun, dieses Tool wurde an anderer Stelle weit verbreitet, von der QA über die Entwicklung bis hin zu Produktionsumgebungen. Es hat seine Einschränkungen oder Vorbehalte, wie z. B. die bekannten Unicode- oder Zeichensätze, die in Ihrem Datensatz gespeichert sind. In diesem Fall könnten Sie die Verwendung von pg_dump/pg_restore in Betracht ziehen, aber es kann einige Zeit dauern, bis der Vorgang abgeschlossen ist, je nachdem, wie groß Ihre Daten sind. Für neuere Versionen von PostgreSQL, wie z. B. PG 14.0, können Sie nur einen Dump/Restore (oder Export/Import) oder eine logische Replikation durchführen, andernfalls verwenden Sie pg_upgrade.

Bei größeren Datensätzen erfordert die Verwendung von pg_upgrade, dass Sie dies auf demselben Host ausführen, der standardmäßig eine Kopie aller Ihrer physischen Dateien aus Ihrem Datenverzeichnis anlegt. In diesem Fall unterstützt pg_upgrade die Option -k oder --link, was bedeutet, dass es harte Links verwendet, anstatt Dateien in den neuen Cluster zu kopieren.

pg_upgrade tut sein Bestes, um sicherzustellen, dass die alten und neuen Cluster binärkompatibel sind, z. B. indem es nach kompatiblen Einstellungen zur Kompilierzeit sucht, einschließlich 32/64-Bit-Binärdateien. Es ist auch wichtig, dass alle externen Module binär kompatibel sind, obwohl dies nicht durch pg_upgrade überprüft werden kann.

pg_upgrade unterstützt Upgrades von 8.4.X und höher auf die aktuelle Hauptversion von PostgreSQL, einschließlich Snapshot- und Beta-Versionen.

Hier ist die Situation…

In diesem Setup habe ich ClusterControl verwendet, um einen PostgreSQL 11-Datenbankcluster für einen einzelnen Knoten bereitzustellen. Folgendes wurde auf Centos 7 und Ubuntu Focal (20.04.1) getestet:

$ /usr/pgsql-11/bin/postgres --version
postgres (PostgreSQL) 11.13

postgres=# \dx
                                           List of installed extensions

          Name          | Version |   Schema   |                            Description

------------------------+---------+------------+-------------------------------------------------------------------
 fuzzystrmatch          | 1.1     | public     | determine similarities and distance between strings
 pg_stat_statements     | 1.6     | public     | track execution statistics of all SQL statements executed
 plpgsql                | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis                | 3.1.4   | public     | PostGIS geometry and geography spatial types and functions
 postgis_raster         | 3.1.4   | public     | PostGIS raster types and functions
 postgis_sfcgal         | 3.1.4   | public     | PostGIS SFCGAL functions
 postgis_tiger_geocoder | 3.1.4   | tiger      | PostGIS tiger geocoder and reverse geocoder
 postgis_topology       | 3.1.4   | topology   | PostGIS topology spatial types and functions
 timescaledb            | 2.3.1   | public     | Enables scalable inserts and complex queries for time-series data
(9 rows)

Also habe ich Folgendes,

PostgreSQL-Serverversion: 11.13

TimescaleDB-Version: 2.3.1

PostGIS-Version: 3.1.4

Wenn Sie dies mit ClusterControl testen möchten, gibt es zwei Möglichkeiten, TimescaleDB zu haben. Sie können einen TimescaleDB-Cluster bereitstellen oder PostgreSQL haben und das TimescaleDB-Plugin aktivieren.

Einrichtung für Ihr PostgreSQL 13

Die Verwendung Ihres Paketmanager-Setups für die Linux-Umgebung mit Ihrem PostgreSQL- und TimescaleDB-Repository ist einfacher. Hier sind die Schritte dazu:

Erforderliche Repositories einrichten

Als Erstes fügen wir das PostgreSQL-Repository hinzu.

Für CentOS/RHEL/Oracle Linux

Sie müssen sicherstellen, dass Sie das richtige Repository haben. Für Enterprise Linux (EL) 7 können Sie Folgendes tun:

sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Für andere Architekturen können Sie hier https://download.postgresql.org/pub/repos/yum/reporpms/ verwenden und das Unterverzeichnis EL-7-x86_64 ersetzen.

Fügen wir auch das TimescaleDB-Repository hinzu.

vi /etc/yum.repos.d/timescale_timescaledb.repo

Fügen Sie dann den folgenden Inhalt für diese Datei hinzu,

[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/7/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

Ersetzen Sie einfach die Basis-URL entsprechend, wenn Sie eine andere Version als EL 7 verwenden.

Für Ubuntu/Debian

Fügen Sie das PG-Repository für Ubuntu Focal hinzu:

deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main

Ersetzen Sie bei anderen Ubuntu/Debian-Distributionen einfach den Focal entsprechend, den Sie hier http://apt.postgresql.org/pub/repos/apt/dists/ finden. Ersetzen Sie beispielsweise „focal-pgdg“ durch „buster-pgdg“.

Jetzt fügen wir das Repository für TimescaleDB hinzu,

sudo sh -c "echo 'deb [signed-by=/usr/share/keyrings/timescale.keyring] https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main' > /etc/apt/sources.list.d/timescaledb.list"

Schlüsselbund importieren,

wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/timescale.keyring

und aktualisieren Sie die Paketlisten für Upgrades für Pakete, die aktualisiert werden müssen, sowie für neue Pakete, die gerade in die Repositories gekommen sind.

sudo apt-get update

Sie können das Unterverzeichnis in der URL ersetzen, wenn Sie Debian von Ubuntu verwenden.

Nun, da wir das Repository bereit haben, können wir loslegen.

Installieren Sie PostgreSQL Version 13 mit TimescaleDB und PostGIS

Die Installation von PostgreSQL 13 kann auf demselben Host erfolgen. Zunächst müssen Sie sicherstellen, dass Dinge wie der Datenbankport eindeutig sind. Mit anderen Worten, es muss sich von dem aktuellen PostgreSQL 11 unterscheiden, das auf demselben Host installiert ist.

Für CentOS/RHEL/Oracle Linux

Führen Sie den folgenden Befehl aus, um PostgreSQL 13 und die abhängigen Pakete zu installieren: 

yum install postgresql13.x86_64 postgresql13-server.x86_64 postgresql13-contrib.x86_64 postgresql13-libs.x86_64  

Initialisieren Sie dann den Datenbank-Cluster und seine erforderliche Sammlung von Datenbanken, indem Sie den folgenden Befehl ausführen:

$ /usr/pgsql-13/bin/postgresql-13-setup initdb

An dieser Stelle sollten zwei Datenverzeichnisse sowohl für PG 11 als auch für PG 13 vorhanden sein:

[[email protected] ~]# ls -alth /var/lib/pgsql/* -d
drwx------. 4 postgres postgres 51 Sep 22 14:19 /var/lib/pgsql/13
drwx------. 4 postgres postgres 33 Sep 21 18:53 /var/lib/pgsql/11

Jetzt, da wir mit PostgreSQL 13 vertraut sind, lassen Sie uns TimescaleDB installieren. Wir müssen sicherstellen, dass das zu installierende Plug-in die gleiche Version auf PostreSQL 11 ist. 

Beachten Sie, dass, um sicherzustellen, dass pg_upgrade reibungslos funktioniert, die Plugins Ihrer Quell- und Hauptversion des Ziels die gleiche Version sein sollten. Dies liegt daran, dass pg_upgrade nach seinen ausgewiesenen Bibliotheken sucht, die mit den Plugins oder Erweiterungen verknüpft sind, die von Ihrer alten oder Quelldatenbankversion Ihres PostgreSQL geladen oder verwendet wurden. Sie können dies in Ihrem Enterprise-Linux überprüfen, indem Sie showduplicates ausführen oder indem Sie die Informationen wie unten entweder mit dnf oder yum verifizieren:

$ yum --showduplicates list timescaledb_13.x86_64 timescaledb-2-postgresql-13.x86_64 timescaledb-2-oss-postgresql-13.x86_64 timescaledb-2-loader-postgresql-13.x86_64|grep '2.3.1'
Repository pgdg-common is listed more than once in the configuration
timescaledb-2-loader-postgresql-13.x86_64  2.3.1-0.el7     timescale_timescaledb
timescaledb-2-oss-postgresql-13.x86_64     2.3.1-0.el7     timescale_timescaledb
timescaledb-2-postgresql-13.x86_64         2.3.1-0.el7     timescale_timescaledb

Oder überprüfen Sie es mit der Info-Option:

$ yum info timescaledb-2-loader-postgresql-13-2.3.1-0.el7.x86_64 timescaledb-2-postgresql-13-2.3.1-0.el7.x86_64

Jetzt können wir das TimescaleDB-Paket für die PG 13-Version installieren.

$ yum install timescaledb-2-loader-postgresql-13-2.3.1-0.el7.x86_64 timescaledb-2-postgresql-13-2.3.1-0.el7.x86_64

Nachdem Sie es installiert haben, können Sie versuchen, das Tool timescaledb-tune auszuführen, um Ihre postgresql.conf-Konfigurationsdatei zu optimieren. Führen Sie einfach den folgenden Befehl aus:

$  timescaledb-tune --pg-config=/usr/pgsql-13/bin/pg_config

Jetzt installieren wir auch das PostGIS-Paket für die PG 13-Version.

$ yum install -y postgis31_13.x86_64 

Für Ubuntu/Debian

Einfach ausführen:

$  apt install postgresql-client-13 postgresql-13

Das Tolle an Ubuntu/Debian-Distributionen ist, dass es Tools für PostgreSQL gibt, die sehr praktisch sind, um Ihre PostgreSQL-Cluster zu verwalten, wie pg_lsclusters, pg_ctlcluster usw. 

Sie können überprüfen, ob Ihre verfügbaren Cluster installiert sind.

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
11  main    5432 online   postgres /var/lib/postgresql/11/main log/postgresql-%Y-%m-%d_%H%M%S.log
13  main    5433 online postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log

In Ubuntu/Debian besteht keine Notwendigkeit, den Port zu ändern, da er während der Installationsphase behandelt wird und ihn entsprechend eindeutig erkennt und einstellt.

Jetzt installieren wir TimescaleDB.

$ apt install timescaledb-2-loader-postgresql-13 timescaledb-2-postgresql-13

Optional können Sie das Tool timescaledb-tune ausführen, um Ihre postgresql.conf-Konfigurationsdatei zu optimieren, indem Sie das Tool einfach wie folgt aufrufen:

$ timescaledb-tune

Jetzt können wir das PostGIS-Paket für PG 13 installieren.

$ apt install postgresql-13-postgis-3-scripts postgresql-13-postgis-3

Überprüfen Sie Ihre postgresql.conf

Es ist immer besser, Ihre postgresql.conf-Konfigurationsdatei zu überprüfen. In Enterprise-Linux-Versionen können Sie Ihre postgresql.conf entweder in Ihrem data_directory- oder PGDATA-Pfad finden. Während Sie es für Ubuntu/Debian in /etc/postgresql///postgresql.conf finden. Stellen Sie sicher, dass in Ihrer postgresql.conf die folgenden Zeilen richtig konfiguriert sind:

shared_preload_libraries = 'pg_stat_statements,timescaledb'     # pg_stat_statements is not required but if you are using ClusterControl, make sure this is appended.
port = 5532   # make sure that the port number is unique than the old version of your PostgreSQL

listen_address = *     # depends on your setup but if you need to specify the available network interfaces to its IP addresses (IPv4 or IPv6) set it accordingly.

Es empfiehlt sich, Ihre alten und neuen Versionen Ihrer PostgreSQL-Konfigurationsdateien zu vergleichen, um sicherzustellen, dass Ihre postgresql.conf identisch mit dem ist, was benötigt und eingestellt wird.

Bevor Sie mit dem nächsten Schritt fortfahren, müssen wir auch überprüfen, ob Ihre PostgreSQL-Version 13 entsprechend geladen ist. Stellen Sie sicher, dass Sie die neueste Version erworben oder auf Ihrem Host installiert haben. Starten Sie die Datenbank und stellen Sie sicher, dass sie richtig startet und läuft.

Um in EL-Distributionen zu starten, führen Sie den folgenden Befehl aus:

$ sudo -iu postgres /usr/pgsql-13/bin/pg_ctl -D /var/lib/pgsql/13/data/ -o "-c config_file=/var/lib/pgsql/13/data/postgresql.conf" start

oder führen Sie für Ubuntu/Debian den folgenden Befehl aus:

$ sudo -iu postgres /usr/lib/postgresql/13/bin/pg_ctl -D /var/lib/postgresql/13/main/ -o "-c config_file=/etc/postgresql/13/main/postgresql.conf" start

oder verwenden Sie das Tool pg_ctlcluster, um Ihren PG-Cluster zu starten, neu zu starten oder zu stoppen.

Wenn Sie fertig sind, führen Sie pg_upgrade…

aus

Bevor Sie fortfahren, stellen Sie zunächst sicher, dass Sie immer Ihr Backup von Ihrem alten Server bereit und verfügbar haben. Führen Sie immer eine logische Sicherung und eine physische Sicherung durch, bevor Sie mit einem größeren Upgrade fortfahren.

Nun, da Sie bereit sind, können Sie pg_upgrade ausführen. In der Praxis müssen Sie zunächst pg_upgrade mit einer Überprüfung ausführen, um die Inkompatibilität und Probleme festzustellen, bevor Sie mit dem Hauptverfahren von pg_upgrade fortfahren. Stellen Sie vor dem Ausführen von pg_upgrade sicher, dass sowohl PG 11 als auch PG 13 während dieses Vorgangs heruntergefahren sind. Das bedeutet lediglich, dass für diesen Vorgang Ausfallzeiten erforderlich sind.

Führen Sie dazu den folgenden Befehl mit der Option --check aus:

$ sudo -iu postgres /usr/lib/postgresql/13/bin/pg_upgrade -o "-c config_file=/etc/postgresql/11/main/postgresql.conf" --old-datadir=/var/lib/postgresql/11/main/   -O "-c config_file=/etc/postgresql/13/main/postgresql.conf"  --new-datadir=/var/lib/postgresql/13/main/ --old-bindir=/usr/lib/postgresql/11/bin --new-bindir=/usr/lib/postgresql/13/bin --check

Ersetzen Sie den --old-datadir-Wert oder die Konfigurationsdatei entsprechend, wenn sie sich von Ihrem Setup unterscheidet.

Dies soll Kompatibilitätsprüfungen wie das Ergebnis unten ausführen:

Performing Consistency Checks

-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

*Clusters are compatible*

Wenn alle Prüfungen „ok“ signalisieren, bedeutet dies eine erfolgreiche Prüfung, und die untere Meldung zeigt, dass die Cluster kompatibel sind, dann sollten Sie startklar sein.

Führen Sie den Befehl abschließend noch einmal ohne die Option --check aus: 

$ sudo -iu postgres /usr/lib/postgresql/13/bin/pg_upgrade -o "-c config_file=/etc/postgresql/11/main/postgresql.conf" --old-datadir=/var/lib/postgresql/11/main/   -O "-c config_file=/etc/postgresql/13/main/postgresql.conf"  --new-datadir=/var/lib/postgresql/13/main/ --old-bindir=/usr/lib/postgresql/11/bin --new-bindir=/usr/lib/postgresql/13/bin

Performing Consistency Checks

-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Creating dump of global objects                             ok
Creating dump of database schemas                           ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.
Performing Upgrade

------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_xact to new server                           ok
Setting oldest XID for new cluster                          ok
Setting next transaction ID and epoch for new cluster       ok
Deleting files from new pg_multixact/offsets                ok
Copying old pg_multixact/offsets to new server              ok
Deleting files from new pg_multixact/members                ok
Copying old pg_multixact/members to new server              ok
Setting next multixact ID and offset for new cluster        ok
Resetting WAL archives                                      ok
Setting frozenxid and minmxid counters in new cluster       ok
Restoring global objects in the new cluster                 ok
Restoring database schemas in the new cluste                ok
Copying user relation files                                 ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to analyze new cluster                      ok
Creating script to delete old cluster                       ok
Checking for extension updates                              notice
Your installation contains extensions that should be updated
with the ALTER EXTENSION command.  The file
    update_extensions.sql
when executed by psql by the database superuser will update
these extensions.

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

Je nach Größe Ihres Datensatzes kann es etwas dauern. Im obigen Beispielbefehl werden die Transaktionsprotokolle kopiert, die von physischen Dateien stammen. Wenn Ihre Festplattengröße jedoch knapp ist, können Sie die Option -k oder --link verwenden, die feste Links verwendet. Wenn alles gut geht, sollten Sie Meldungen wie die obige erhalten, die Sie über das vollständige Upgrade und Hinweise zur Aktualisierung der möglicherweise vorhandenen Erweiterungen informieren. In diesem Setup geht es problemlos. Die update_extensions.sql enthält nur Folgendes:

$ cat update_extensions.sql
\connect postgres
ALTER EXTENSION "pg_stat_statements" UPDATE;

Wie Sie bemerkt haben, führt pg_upgrade eine Reihe von Aktionen aus. Es analysiert alle Zeilen aus dem Quellcluster, kopiert Transaktionsmetadatenprotokolle und seine Multitransaktionsstatusdaten und den Rest.

Sobald Sie herausgefunden haben, dass alles gut aussieht, führen Sie das Skript analyze_new_cluster.sh aus, das ausgeführt werden soll

vacuumdb --all --analyze-only.
$ sudo -iu postgres PGPORT=5433 ./analyze_new_cluster.sh

Beachten Sie, dass Sie den Port Ihres PostgreSQL 13 angeben sollten, damit Vacuumdb korrekt auf dem richtigen Zielserver ausgeführt wird.

In diesem Fall ist das Upgrade-Ergebnis mit aktivierten TimescaleDB- und PostGIS-Erweiterungen gut. Sobald alles in Ordnung erscheint, stellen Sie sicher, dass Sie den Server starten und eine Reihe von Tests und Überprüfungen durchführen.

Testen Sie den Upgrade-Prozess

Testen und überprüfen Sie den Upgrade-Prozess immer. Hier sind ein paar Tabellen und eine benutzerdefinierte Datenbank, die Hypertabellen und PostGIS-Tabellen enthält, die auf der Verwendung von räumlichen Typen und Funktionen aus Geometrie und Geografie beruhen.

$ sudo -iu postgres psql -p5433
psql (13.4 (Ubuntu 13.4-1.pgdg20.04+1))
Type "help" for help.

postgres=# \l

                              List of databases

   Name    |  Owner   | Encoding | Collate |  Ctype  |   Access privileges

-----------+----------+----------+---------+---------+-----------------------
 mydb      | postgres | UTF8     | C.UTF-8 | C.UTF-8 |
 postgres  | postgres | UTF8     | C.UTF-8 | C.UTF-8 |
 template0 | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres          +
           |          |          |         |         | postgres=CTc/postgres
 template1 | postgres | UTF8     | C.UTF-8 | C.UTF-8 | postgres=CTc/postgres+
           |          |          |         |         | =c/postgres
(4 rows)

postgres=# \c mydb
You are now connected to database "mydb" as user "postgres".

mydb=# set search_path="$user",public;
SET
mydb=# \dt+
                                  List of relations

 Schema |      Name       | Type  |  Owner   | Persistence |    Size    | Description

--------+-----------------+-------+----------+-------------+------------+-------------
 public | conditions      | table | postgres | permanent   | 8192 bytes |
 public | global_points   | table | postgres | permanent   | 16 kB      |
 public | roads           | table | postgres | permanent   | 16 kB      |
 public | sample_table    | table | postgres | permanent   | 8192 bytes |
 public | spatial_ref_sys | table | postgres | permanent   | 6968 kB    |
(5 rows)

Überprüfen einiger meiner PostGIS und Hypertabellen:

mydb=# \d roads
                        Table "public.roads"

   Column   |         Type         | Collation | Nullable | Default
------------+----------------------+-----------+----------+---------
 road_id    | integer              |           |          |
 road_name  | character varying    |           |          |
 roads_geom | geometry(LineString) |           |          |

mydb=# \d sample_table
                                     Table "public.sample_table"

 Column |           Type           | Collation | Nullable |                 Default
--------+--------------------------+-----------+----------+------------------------------------------
 id     | integer                  |           | not null | nextval('sample_table_id_seq'::regclass)
 time   | timestamp with time zone |           | not null |
 name   | character varying        |           | not null |
Indexes:
   "sample_table_pkey" PRIMARY KEY, btree (id, "time")
    "sample_table_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON sample_table FOR EACH ROW EXECUTE FUNCTION _timescaledb_internal.insert_blocker()
Number of child tables: 371 (Use \d+ to list them.)

mydb=# \d conditions
                        Table "public.conditions"

   Column    |           Type           | Collation | Nullable | Default
-------------+--------------------------+-----------+----------+---------
 time        | timestamp with time zone |           | not null |
 location    | text                     |           | not null |
 location2   | character(10)            |           | not null |
 temperature | double precision         |           |          |
 humidity    | double precision         |           |          |
Indexes:
    "conditions_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON conditions FOR EACH ROW EXECUTE FUNCTION _timescaledb_internal.insert_blocker()
Number of child tables: 366 (Use \d+ to list them.)

mydb=# select count(*) from sample_table;
 count
-------
  2588
(1 row)



mydb=# SELECT name FROM global_points WHERE ST_DWithin(location, 'SRID=4326;POINT(-110 29)'::geography, 1000000);
  name

--------
 Town
 Forest
(2 rows)



mydb=# SELECT n, ST_AsEWKT(ST_GeometryN(the_geom, n)) As geomewkt
mydb-# FROM (
mydb(# VALUES (ST_GeomFromEWKT('MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)') ),
mydb(# ( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') )
mydb(# )As foo(the_geom)
mydb-# CROSS JOIN generate_series(1,100) n
mydb-# WHERE n <= ST_NumGeometries(the_geom);
 n |                geomewkt

---+-----------------------------------------
 1 | POINT(1 2 7)
 1 | CIRCULARSTRING(2.5 2.5,4.5 2.5,3.5 3.5)
 2 | POINT(3 4 7)
 2 | LINESTRING(10 11,12 11)
 3 | POINT(5 6 7)
 4 | POINT(8 9 10)
(6 rows)

Jetzt sieht alles bereit aus, um als mein neuer Cluster zu dienen.

Sobald Sie die Dinge zum Laufen gebracht haben, können Sie Folgendes ausführen:

$ sudo -iu postgres ./delete_old_cluster.sh

Stellen Sie sicher, dass Sie nur das Skript ausführen, da dies ein sehr gefährliches Skript ist, da es alle Dateien in Ihrem alten PostgreSQL-Cluster löschen wird.

Fazit

pg_upgrade ist ein großartiges Tool zum Verwalten und Aktualisieren Ihres PostgreSQL-Datenbankservers. Es kann komplexe Setups handhaben, z. B. mit aktivierten TimescaleDB- oder PostGIS-Erweiterungen. Obwohl dieses Tool mit seinen Einschränkungen einhergeht, gibt es kein Halten mehr, es zu verwenden, insbesondere für Ihre DBA-Arbeit und auf Produktionsservern, abgesehen von QA- und Entwicklungsumgebungen.