sql >> Database teknologi >  >> RDS >> PostgreSQL

Opgradering af PostgreSQL 11 til PostgreSQL 13 med TimescaleDB og PostGIS i Linux ved hjælp af pg_upgrade

Virksomheder og virksomheder, der bruger gamle versioner af PostgreSQL (PG), står over for udfordringer, når de opgraderer til mindst den seneste stabile version fra PostgreSQL 12 eller PostgreSQL 13. Der er mange grunde til, at opgradering til den seneste version er en skal. Nogle af hovedårsagerne til dette er at drage fordel af dets kritiske forbedringer af dets indbyggede funktionaliteter, sikkerhedsopdateringer, ydeevneforbedringer og nye implementeringer, der er gavnlige for databasestyring.

Opgradering af PostgreSQL kommer med et par udfordringer, da det ikke er så nemt sammenlignet med andre almindelige databaser. Hvis du står over for denne type problemer, skal du ikke bekymre dig. PostgreSQL låser dig ikke op på en specifik version at bruge. I denne blog vil vi gennemgå et eksempel på denne udfordring, mens vi har en TimescaleDB og PostGIS installeret på en eksisterende PostgreSQL 11-vært.

Hvorfor pg_upgrade?

pg_upgrade har eksisteret i meget lang tid som et værktøj til at opgradere større versioner af PostgreSQL. Det er ikke nødvendigt at bruge dette værktøj til mindre versionsopgraderinger, hvilket betyder, at det ikke er nødvendigt at opgradere din nuværende version af 11.9 til 11.13.

Når du opgraderer din PostgreSQL til en større version med pg_upgrade, fungerer værktøjet ved at tillade, at de data, der er gemt i PostgreSQL-datafiler, opgraderes til en senere PostgreSQL-hovedversion. Dette fungerer uden behov for et datadump/genindlæsning, hvilket kan tage noget tid, hvis du har et stort datasæt.

Nu, her kommer balladen. PostgreSQL, især for større versionsudgivelser, er kendt for at have tilføjet nye funktioner, der ofte ændrer layoutet af systemtabellerne, men det interne datalagringsformat ændres sjældent. pg_upgrade bruger dette faktum til at udføre hurtige opgraderinger ved at oprette nye systemtabeller og blot genbruge de gamle brugerdatafiler. Hvis en fremtidig større udgivelse nogensinde ændrer datalagringsformatet på en måde, der gør det gamle dataformat ulæseligt, vil pg_upgrade ikke kunne bruges til sådanne opgraderinger. (Fællesskabet vil forsøge at undgå sådanne situationer.)

Nogle kan betragte pg_upgrade for at være farligt, især for produktionsmiljøet. Nå, dette værktøj er blevet meget brugt andre steder fra QA, til dev, til produktionsmiljøer. Det har sine begrænsninger eller forbehold, såsom den kendte Unicode eller tegnsæt gemt i dit datasæt. I så fald kan du overveje at bruge pg_dump/pg_restore, men det kan tage lidt tid at blive færdig, afhængigt af hvor store dine data er. For nyere versioner af PostgreSQL, såsom PG 14.0, kan du kun tage en dump/gendannelse (eller eksport/import) eller logisk replikering, ellers brug pg_upgrade.

For større datasæt kræver brug af pg_upgrade, at du kører dette på den samme vært, som som standard anvender en kopi af alle dine fysiske filer fra dit databibliotek. I så fald understøtter pg_upgrade indstillingen -k eller --link, hvilket betyder, at den vil bruge hårde links i stedet for at kopiere filer til den nye klynge.

pg_upgrade gør sit bedste for at sikre, at de gamle og nye klynger er binært kompatible, f.eks. ved at tjekke for kompatible kompileringstidsindstillinger, inklusive 32/64-bit binære filer. Det er også vigtigt, at eventuelle eksterne moduler er binært kompatible, selvom dette ikke kan kontrolleres af pg_upgrade.

pg_upgrade understøtter opgraderinger fra 8.4.X og nyere til den nuværende større udgivelse af PostgreSQL, inklusive snapshot- og betaudgivelser.

Her er situationen...

I denne opsætning brugte jeg ClusterControl til at implementere en PostgreSQL 11-databaseklynge til en enkelt node. Følgende er blevet testet på Centos 7 og Ubuntu Focal (20.04.1):

$ /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)

Så jeg fik følgende,

PostgreSQL-serverversion: 11.13

TidsskalaDB-version: 2.3.1

PostGIS-version: 3.1.4

Hvis du vil teste dette med ClusterControl, er der to måder at have TimescaleDB på. Du kan implementere en TimescaleDB-klynge eller have PostgreSQL og aktivere TimescaleDB-pluginnet.

Opsætning til din PostgreSQL 13

Det er nemmere at bruge din pakkehåndteringsopsætning til Linux-miljøet med dit PostgreSQL- og TimescaleDB-lager. Her er trinene til at gøre det:

Konfigurer de nødvendige arkiver

Lad os først tilføje PostgreSQL-lageret.

Til CentOS/RHEL/Oracle Linux

Du skal sikre dig, at du har det rigtige lager. For Enterprise Linux (EL) 7 kan du gøre følgende:

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

For anden arkitektur kan du basere dig her https://download.postgresql.org/pub/repos/yum/reporpms/ og erstatte EL-7-x86_64-undermappen.

Lad os også tilføje TimescaleDB-lageret.

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

Tilføj derefter følgende indhold til denne fil,

[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

Bare udskift baseurl i overensstemmelse hermed, hvis du bruger en anden version end EL 7.

Til Ubuntu/Debian

Tilføj PG-lageret til Ubuntu Focal:

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

For andre Ubuntu/Debian-distributioner skal du bare udskifte fokalen i overensstemmelse hermed, som du kan finde her http://apt.postgresql.org/pub/repos/apt/dists/. Udskift f.eks. focal-pgdg med buster-pgdg.

Lad os nu tilføje lageret for TimescaleDB,

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"

Importer nøgleringen,

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

og opdatere pakkelisterne for opgraderinger til pakker, der skal opgraderes, såvel som nye pakker, der lige er kommet til lagrene.

sudo apt-get update

Du kan erstatte underbiblioteket i URL'en, hvis du bruger Debian fra ubuntu.

Nu hvor vi har depotet klar, er vi godt i gang.

Installer PostgreSQL version 13 med TimescaleDB og PostGIS

Installation af PostgreSQL 13 kan gøres på den samme vært. Først skal du sikre dig, at ting såsom databaseporten er unikke. Med andre ord skal den være forskellig fra den aktuelle PostgreSQL 11 installeret på den samme vært.

Til CentOS/RHEL/Oracle Linux

Kør kommandoen nedenfor for at installere PostgreSQL 13 og dens afhængige pakker: 

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

Initialiser derefter databaseklyngen og dens nødvendige samling af databaser ved at køre kommandoen nedenfor:

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

På dette tidspunkt skulle der være to datamapper både for PG 11 og PG 13:

[[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

Nu hvor vi er gode med PostgreSQL 13, lad os installere TimescaleDB. Vi skal sikre os, at plugin'et, der skal installeres, er den samme version på PostreSQL 11. 

Bemærk, at for at sikre, at pg_upgrade fungerer problemfrit, skal plugins til din kilde- og hovedversionsdestination være den samme version. Dette skyldes, at pg_upgrade vil lede efter dets udpegede biblioteker knyttet til plugins eller udvidelser, der er blevet indlæst eller brugt af din gamle eller kildedatabaseversion af din PostgreSQL. Du kan verificere dette i din Enterprise Linux ved at køre showduplicates eller ved at verificere med info ligesom nedenfor enten med dnf eller yum:

$ 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

Eller bekræft det med infoindstillingen:

$ 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

Nu er vi klar til at installere TimescaleDB-pakken til PG 13-versionen.

$ 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

Når du har installeret det, kan du prøve at køre timescaledb-tune-værktøjet for at justere din postgresql.conf-konfigurationsfil. Bare kør kommandoen nedenfor:

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

Lad os nu også installere PostGIS-pakken til PG 13-versionen.

$ yum install -y postgis31_13.x86_64 

Til Ubuntu/Debian

Kør blot:

$  apt install postgresql-client-13 postgresql-13

Det fantastiske med Ubuntu/Debian-distributioner er, at der er værktøjer til PostgreSQL, som er meget praktiske til at administrere dine PostgreSQL-klynger, såsom pg_lsclusters,  pg_ctlcluster osv. 

Du kan bekræfte, at dine tilgængelige klynger er installeret.

$ 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

I Ubuntu/Debian er der ingen grund til at ændre porten, da den vil blive håndteret under installationsfasen, og den registrerer og indstiller den unikt i overensstemmelse hermed.

Lad os nu installere TimescaleDB.

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

Valgfrit kan du køre timescaledb-tune-værktøjet for at justere din postgresql.conf-konfigurationsfil ved blot at kalde værktøjet som følgende:

$ timescaledb-tune

Nu er vi klar til at installere PostGIS-pakken til PG 13.

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

Gennemgå din postgresql.conf

Det er altid bedre at gennemgå din postgresql.conf konfigurationsfil. I Enterprise Linux-versioner kan du finde din postgresql.conf enten i din data_directory eller PGDATA-sti. Hvorimod for Ubuntu/Debian, kan du finde det i /etc/postgresql///postgresql.conf. Sørg for, at følgende linjer i din postgresql.conf er korrekt konfigureret:

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.

Det er bedste praksis at sammenligne dine gamle og nye versioner af dine PostgreSQL-konfigurationsfiler for at sikre, at din postgresql.conf er identisk med det, der er nødvendigt og indstillet.

Før vi fortsætter med næste trin, skal vi også kontrollere, at din PostgreSQL version 13 er indlæst i overensstemmelse hermed. Sørg for, at du har den seneste version købt eller installeret på din vært. Start databasen, og sørg for, at den starter og kører korrekt.

For at starte i EL-distributioner skal du køre kommandoen nedenfor:

$ 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

eller for Ubuntu/Debian, kør kommandoen nedenfor:

$ 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

eller brug pg_ctlcluster-værktøjet til at starte, genstarte eller stoppe din PG-klynge.

Når du er klar, kør pg_upgrade...

Inden du går videre, skal du først sikre dig, at du altid har din backup fra din gamle server klar og tilgængelig. Tag altid en logisk backup og fysisk backup som god praksis, før du fortsætter med en større opgradering.

Nu hvor du er klar, er du god til at køre pg_upgrade. I praksis skal du først køre pg_upgrade med en kontrol for at bestemme inkompatibiliteten og problemerne, før du fortsætter til hovedproceduren for pg_upgrade. Før du kører pg_upgrade, skal du sørge for, at både PG 11 og PG 13 er nede, mens du udfører denne proces. Det betyder blot, at der er behov for nedetid til denne proces.

For at gøre det skal du køre følgende kommando med --check mulighed:

$ 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

Erstat --old-datadir-værdien eller config_file i overensstemmelse hermed, hvis den er forskellig fra din opsætning.

Dette skal køre kompatibilitetstjek ligesom resultatet nedenfor:

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*

Hvis alle kontroller signalerer "ok", betyder det en vellykket kontrol, og den nederste meddelelse viser, at klynger er kompatible, så burde du være godt i gang.

Kør endelig kommandoen igen uden --check-indstillingen: 

$ 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

Afhængigt af størrelsen på dit datasæt kan det tage lidt tid. I eksempelkommandoen ovenfor kopierer den transaktionsloggene, som er af fysiske filer. Men hvis din diskstørrelse er trang, kan du bruge -k eller --link muligheden, som bruger hårde links. Hvis alt går vel, bør det give dig beskeder som ovenstående, der giver dig besked om fuldstændig opgradering og meddelelser om at opdatere de udvidelser, du måtte have. I denne opsætning går det glat. Update_extensions.sql indeholder kun følgende:

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

Som du har bemærket, udfører pg_upgrade en række handlinger. Den analyserer alle rækker fra kildeklyngen, kopierer transaktionsmetadatalogfiler og dens multitransaktionsstatusdata og resten.

Når du har fundet ud af, at alt ser godt ud, så kør analyse_new_cluster.sh-scriptet, som skal køre

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

Bemærk, at du skal angive porten på din PostgreSQL 13, så vacuumdb kører korrekt til den rigtige målserver.

I dette tilfælde går opgraderingsresultatet med TimescaleDB og PostGIS-udvidelser aktiveret godt. Når alt vises i orden, skal du sørge for at starte serveren og udføre en række tests og kontroller.

Test opgraderingsprocessen

Test og gennemgå altid opgraderingsprocessen. Her er et par tabeller og en brugerdefineret database, som indeholder hypertabeller og PostGIS-tabeller, der er afhængige af at bruge geometri og geografi rumlige typer og funktioner.

$ 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)

Tjek nogle af mine PostGIS og hypertabeller:

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)

Nu ser alt ud til at være klar til at fungere som min nye klynge.

Når du har fået gang i tingene, kan du køre:

$ sudo -iu postgres ./delete_old_cluster.sh

Sørg for, at du kun kører scriptet, da dette er et meget farligt script, da det vil slette alle filer i din gamle PostgreSQL-klynge.

Konklusion

pg_upgrade er et fantastisk værktøj til at administrere og opgradere din PostgreSQL-databaseserver. Det kan håndtere komplekse opsætninger, såsom med TimescaleDB eller PostGIS-udvidelser aktiveret. Selvom dette værktøj kommer med sine begrænsninger, er der ingen stopper for at bruge det, især til dit DBA-arbejde og på produktionsservere bortset fra QA og udviklingsmiljøer.


  1. Hvad er nyt i ProxySQL 2.0

  2. SQL:Vælg poster, hvor ALLE sammenføjede poster opfylder en betingelse

  3. .NET Core 2.1 Identity får alle brugere med deres tilknyttede roller

  4. Sådan gendannes en enkelt MySQL-tabel ved hjælp af mysqldump?