sql >> Databáze >  >> RDS >> PostgreSQL

Upgrade PostgreSQL 11 na PostgreSQL 13 s TimescaleDB a PostGIS v Linuxu pomocí pg_upgrade

Podniky a podniky používající staré verze PostgreSQL (PG) čelí problémům při upgradu na alespoň nejnovější stabilní verzi z PostgreSQL 12 nebo PostgreSQL 13. Existuje mnoho důvodů, proč je upgrade na nejnovější verzi musí. Jedním z hlavních důvodů je využití důležitých vylepšení vestavěných funkcí, aktualizací zabezpečení, zlepšení výkonu a nových implementací, které jsou užitečné pro správu databází.

Upgrade PostgreSQL přináší několik problémů, protože není tak snadný ve srovnání s jinými mainstreamovými databázemi. Pokud čelíte tomuto typu problému, nezoufejte. PostgreSQL vás nezamyká na konkrétní verzi, kterou chcete použít. V tomto blogu si projdeme příklad této výzvy a zároveň budeme mít nainstalované TimescaleDB a PostGIS na stávajícím hostiteli PostgreSQL 11.

Proč pg_upgrade?

pg_upgrade existuje již velmi dlouho jako nástroj pro aktualizaci hlavních verzí PostgreSQL. Použití tohoto nástroje není vyžadováno pro upgrady menších verzí, což znamená, že aktualizace vaší aktuální verze 11.9 na 11.13 není nutná.

Při upgradu vašeho PostgreSQL na hlavní verzi pomocí pg_upgrade nástroj funguje tak, že umožňuje upgradovat data uložená v datových souborech PostgreSQL na pozdější hlavní verzi PostgreSQL. Funguje to bez nutnosti výpisu/znovu načítání dat, což může nějakou dobu trvat, pokud máte velkou datovou sadu.

A teď přichází povyk. Je známo, že PostgreSQL, zejména pro vydání hlavních verzí, obsahuje nové funkce, které často mění rozložení systémových tabulek, ale formát interního úložiště dat se mění jen zřídka. pg_upgrade využívá této skutečnosti k provádění rychlých upgradů vytvořením nových systémových tabulek a jednoduchým opětovným použitím starých uživatelských datových souborů. Pokud budoucí hlavní vydání někdy změní formát ukládání dat tak, že starý formát dat bude nečitelný, pg_upgrade nebude pro takové aktualizace použitelné. (Komunita se pokusí takovým situacím vyhnout.)

Někteří mohou považovat pg_upgrade za nebezpečný, zejména pro produkční prostředí. No, tento nástroj byl široce používán jinde, od QA přes vývoj až po produkční prostředí. Má svá omezení nebo upozornění, jako je známý Unicode nebo znakové sady uložené ve vaší datové sadě. V takovém případě můžete zvážit použití pg_dump/pg_restore, ale dokončení může nějakou dobu trvat v závislosti na tom, jak velká jsou vaše data. U novějších verzí PostgreSQL, jako je PG 14.0, můžete provést pouze výpis/obnovu (nebo export/import) nebo logickou replikaci, jinak použijte pg_upgrade.

U větších datových sad použití pg_upgrade vyžaduje, abyste to spustili na stejném hostiteli, což ve výchozím nastavení použije kopii všech vašich fyzických souborů z vašeho datového adresáře. V takovém případě pg_upgrade podporuje volbu -k nebo --link, což znamená, že místo kopírování souborů do nového clusteru použije pevné odkazy.

pg_upgrade dělá, co je v jeho silách, aby se ujistil, že staré a nové clustery jsou binárně kompatibilní, např. tím, že zkontroluje kompatibilní nastavení kompilace, včetně 32/64bitových binárních souborů. Je také důležité, aby všechny externí moduly byly binárně kompatibilní, i když to nelze zkontrolovat pomocí pg_upgrade.

pg_upgrade podporuje upgrady z 8.4.X a novější na aktuální hlavní vydání PostgreSQL, včetně snapshotů a beta verzí.

Tady je situace…

V tomto nastavení jsem použil ClusterControl k nasazení databázového clusteru PostgreSQL 11 pro jeden uzel. Na Centos 7 a Ubuntu Focal (20.04.1) bylo testováno následující:

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

Takže mám následující,

Verze serveru PostgreSQL: 11.13

Verze TimescaleDB: 2.3.1

Verze PostGIS: 3.1.4

Pokud to chcete otestovat pomocí ClusterControl, existují dva způsoby, jak mít TimescaleDB. Můžete nasadit cluster TimescaleDB nebo mít PostgreSQL a povolit plugin TimescaleDB.

Nastavení pro PostgreSQL 13

Použití vašeho nastavení správce balíčků pro prostředí Linux s vaším úložištěm PostgreSQL a TimescaleDB je jednodušší. Zde jsou kroky, jak to udělat:

Nastavte požadovaná úložiště

Nejprve přidejte úložiště PostgreSQL.

Pro CentOS/RHEL/Oracle Linux

Musíte se ujistit, že máte správné úložiště. Pro Enterprise Linux (EL) 7 můžete provést následující:

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

Pro jinou architekturu můžete založit zde https://download.postgresql.org/pub/repos/yum/reporpms/ a nahradit podadresář EL-7-x86_64.

Přidejme také úložiště TimescaleDB.

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

Pak přidejte pro tento soubor následující obsah

[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

Pokud používáte jinou verzi než EL 7, stačí odpovídajícím způsobem nahradit baseurl.

Pro Ubuntu/Debian

Přidat úložiště PG pro Ubuntu Focal:

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

U ostatních distribucí Ubuntu/Debianu stačí odpovídajícím způsobem nahradit focal, který najdete zde http://apt.postgresql.org/pub/repos/apt/dists/. Například nahraďte focal-pgdg buster-pgdg.

Nyní přidáme úložiště pro 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"

Importujte svazek klíčů

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

a aktualizujte seznamy balíčků pro aktualizace pro balíčky, které vyžadují aktualizaci, a také pro nové balíčky, které právě přišly do repozitářů.

sudo apt-get update

Pokud používáte Debian z ubuntu, můžete podadresář v URL nahradit.

Teď, když máme úložiště připravené, můžeme začít.

Instalace PostgreSQL verze 13 s TimescaleDB a PostGIS

Instalaci PostgreSQL 13 lze provést na stejném hostiteli. Nejprve se musíte ujistit, že věci, jako je port databáze, jsou jedinečné. Jinými slovy, musí se lišit od aktuálního PostgreSQL 11 nainstalovaného na stejném hostiteli.

Pro CentOS/RHEL/Oracle Linux

Spusťte níže uvedený příkaz a nainstalujte PostgreSQL 13 a jeho závislé balíčky: 

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

Potom inicializujte klastr databáze a jeho požadovanou kolekci databází spuštěním příkazu níže:

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

V tuto chvíli by měly existovat dva datové adresáře pro PG 11 a 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

Teď, když jsme dobří s PostgreSQL 13, pojďme nainstalovat TimescaleDB. Musíme se ujistit, že plugin, který se má nainstalovat, má stejnou verzi na PostreSQL 11. 

Uvědomte si, že aby bylo zajištěno, že pg_upgrade bude fungovat hladce, měly by být zásuvné moduly vaší zdrojové a cílové verze hlavní verze stejné verze. Je to proto, že pg_upgrade vyhledá své určené knihovny propojené s pluginy nebo rozšířeními, které byly načteny nebo používány vaší starou nebo zdrojovou databázovou verzí vašeho PostgreSQL. Ve svém Enterprise Linuxu to můžete ověřit spuštěním showduplicates nebo ověřením pomocí níže uvedených informací, buď pomocí dnf nebo 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

Nebo to ověřte pomocí možnosti info:

$ 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

Nyní jsme připraveni nainstalovat balíček TimescaleDB pro verzi PG 13.

$ 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

Až jej nainstalujete, můžete zkusit spustit nástroj timescaledb-tune a vyladit konfigurační soubor postgresql.conf. Stačí spustit příkaz níže:

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

Nyní nainstalujme balíček PostGIS také pro verzi PG 13.

$ yum install -y postgis31_13.x86_64 

Pro Ubuntu/Debian

Stačí spustit:

$  apt install postgresql-client-13 postgresql-13

Skvělá věc na distribucích Ubuntu/Debian je, že existují nástroje pro PostgreSQL, které jsou velmi užitečné pro správu vašich clusterů PostgreSQL, jako jsou pg_lsclusters,  pg_ctlcluster atd. 

Můžete ověřit nainstalované dostupné clustery.

$ 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

V Ubuntu/Debianu není potřeba měnit port, protože s ním bude manipulováno během instalační fáze a podle toho jej detekuje a nastavuje jedinečně.

Nyní nainstalujme TimescaleDB.

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

Volitelně můžete spustit nástroj timescaledb-tune k vyladění konfiguračního souboru postgresql.conf jednoduchým vyvoláním nástroje následovně:

$ timescaledb-tune

Nyní jsme připraveni nainstalovat balíček PostGIS pro PG 13.

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

Zkontrolujte svůj postgresql.conf

Vždy je lepší zkontrolovat konfigurační soubor postgresql.conf. Ve verzích Enterprise Linux můžete svůj postgresql.conf najít buď v adresáři data_directory, nebo v cestě PGDATA. Zatímco pro Ubuntu/Debian jej můžete najít  v /etc/postgresql/<číslo-verze>//postgresql.conf. Ujistěte se, že ve vašem postgresql.conf jsou správně nakonfigurovány následující řádky:

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.

Doporučeným postupem je porovnat staré a nové verze vašich konfiguračních souborů PostgreSQL, abyste se ujistili, že váš postgresql.conf je identický s tím, co je potřeba a nastavený.

Než přistoupíme k dalšímu kroku, musíme také zkontrolovat, zda je správně načten váš PostgreSQL verze 13. Ujistěte se, že máte nejnovější verzi získanou nebo nainstalovanou ve vašem hostiteli. Spusťte databázi a ujistěte se, že se spouští a běží správně.

Chcete-li začít v distribucích EL, spusťte níže uvedený příkaz:

$ 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

nebo pro Ubuntu/Debian spusťte níže uvedený příkaz:

$ 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

nebo pomocí nástroje pg_ctlcluster spusťte, restartujte nebo zastavte svůj PG Cluster.

Až budete připraveni, spusťte pg_upgrade…

Než budete pokračovat, ujistěte se, že máte vždy připravenou a dostupnou zálohu ze starého serveru. Než přistoupíte k velkému upgradu, vždy berte logické zálohování a fyzické zálohování jako osvědčený postup.

Nyní, když jste připraveni, můžete spustit pg_upgrade. V praxi musíte nejprve spustit pg_upgrade s kontrolou pro zjištění nekompatibility a problémů, než přistoupíte k hlavnímu postupu pg_upgrade. Před spuštěním pg_upgrade se ujistěte, že PG 11 i PG 13 jsou během provádění tohoto procesu mimo provoz. To jen znamená, že tento proces vyžaduje prostoje.

Chcete-li to provést, spusťte následující příkaz s volbou --check:

$ 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

Nahraďte odpovídajícím způsobem hodnotu --old-datadir nebo soubor config_file, pokud se liší od vašeho nastavení.

To spustí kontroly kompatibility stejně jako výsledek níže:

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*

Pokud všechny kontroly signalizují „ok“, znamená to úspěšnou kontrolu a spodní zpráva ukazuje, že clustery jsou kompatibilní, měli byste začít.

Nakonec spusťte příkaz znovu bez možnosti --check: 

$ 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

V závislosti na velikosti vaší datové sady to může chvíli trvat. Ve výše uvedeném příkladu příkazu zkopíruje transakční protokoly, které jsou fyzickými soubory. Pokud je však váš disk malý, můžete použít volbu -k nebo --link, která používá pevné odkazy. Pokud vše půjde dobře, měl by vám poskytnout zprávy, jako je výše uvedená, s upozorněním na dokončení aktualizace a upozornění na aktualizaci rozšíření, která můžete mít. V tomto nastavení to jde hladce. Soubor update_extensions.sql obsahuje pouze následující:

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

Jak jste si všimli, pg_upgrade provádí řadu akcí. Analyzuje všechny řádky ze zdrojového clusteru, kopíruje protokoly metadat transakcí a data o stavu více transakcí a ostatní.

Jakmile zjistíte, že vše vypadá dobře, spusťte skript analyze_new_cluster.sh, který se spustí

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

Uvědomte si, že byste měli specifikovat port vašeho PostgreSQL 13, aby Vacuumdb fungoval správně na správném cílovém serveru.

V tomto případě je výsledek upgradu s povolenými rozšířeními TimescaleDB a PostGIS dobrý. Jakmile se vše objeví v pořádku, nezapomeňte spustit server a proveďte sérii testů a kontrol.

Otestujte proces upgradu

Proces upgradu vždy otestujte a zkontrolujte. Zde je několik tabulek a uživatelsky definovaná databáze, která obsahuje hypertabulky a tabulky PostGIS, které se spoléhají na použití geometrie a geografických prostorových typů a funkcí.

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

Kontrola některých mých PostGIS a hypertabulek:

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)

Nyní je vše připraveno sloužit jako můj nový cluster.

Jakmile věci rozjedete, můžete spustit:

$ sudo -iu postgres ./delete_old_cluster.sh

Ujistěte se, že spouštíte pouze skript, protože se jedná o velmi nebezpečný skript, protože smaže všechny soubory ve vašem starém clusteru PostgreSQL.

Závěr

pg_upgrade je skvělý nástroj pro správu a upgrade vašeho databázového serveru PostgreSQL. Zvládne složitá nastavení, například s povolenými rozšířeními TimescaleDB nebo PostGIS. Ačkoli tento nástroj přichází se svými omezeními, nic nebrání jeho použití, zejména pro vaši práci DBA a na produkčních serverech kromě QA a vývojových prostředí.


  1. Datový model realitní kanceláře

  2. INSERT INTO @TABLE EXEC @query s SQL Server 2000

  3. Můžete rozdělit/rozložit pole v dotazu MySQL?

  4. Vnitřní spojení vs kde