sql >> Base de Datos >  >> RDS >> PostgreSQL

Actualización de PostgreSQL 11 a PostgreSQL 13 con TimescaleDB y PostGIS en Linux usando pg_upgrade

Los negocios y empresas que usan versiones antiguas de PostgreSQL (PG) enfrentan desafíos al actualizar al menos a la versión estable más reciente de PostgreSQL 12 o PostgreSQL 13. Hay muchas razones por las que actualizar a la última versión es una deber. Algunas de las razones principales de esto son para aprovechar sus mejoras críticas a sus funcionalidades integradas, actualizaciones de seguridad, mejoras de rendimiento y nuevas implementaciones beneficiosas para la administración de bases de datos.

La actualización de PostgreSQL presenta algunos desafíos, ya que no es tan fácil en comparación con otras bases de datos convencionales. Si te enfrentas a este tipo de problema, no te preocupes. PostgreSQL no lo bloquea en una versión específica para usar. En este blog, veremos un ejemplo de este desafío al tener TimescaleDB y PostGIS instalados en un host PostgreSQL 11 existente.

¿Por qué pg_upgrade?

pg_upgrade ha existido durante mucho tiempo como una herramienta para actualizar las versiones principales de PostgreSQL. No se requiere el uso de esta herramienta para actualizaciones de versiones menores, lo que significa que no es necesario actualizar su versión actual de 11.9 a 11.13.

Al actualizar su PostgreSQL a una versión principal con pg_upgrade, la herramienta funciona al permitir que los datos almacenados en los archivos de datos de PostgreSQL se actualicen a una versión principal posterior de PostgreSQL. Esto funciona sin necesidad de un volcado/recarga de datos, lo que puede llevar algún tiempo si tiene un gran conjunto de datos.

Ahora, aquí viene el alboroto. Se sabe que PostgreSQL, especialmente para los lanzamientos de versiones principales, tiene nuevas funciones agregadas que a menudo cambian el diseño de las tablas del sistema, pero el formato de almacenamiento de datos interno rara vez cambia. pg_upgrade utiliza este hecho para realizar actualizaciones rápidas al crear nuevas tablas del sistema y simplemente reutilizar los archivos de datos de usuario anteriores. Si una versión importante futura alguna vez cambia el formato de almacenamiento de datos de una manera que hace que el formato de datos anterior sea ilegible, pg_upgrade no se podrá utilizar para dichas actualizaciones. (La comunidad intentará evitar tales situaciones).

Algunos pueden considerar que pg_upgrade es peligroso, especialmente para el entorno de producción. Bueno, esta herramienta se ha utilizado ampliamente en otros lugares, desde control de calidad hasta entornos de desarrollo y producción. Tiene sus limitaciones o advertencias, como el Unicode conocido o los conjuntos de caracteres almacenados en su conjunto de datos. En ese caso, podría considerar usar pg_dump/pg_restore, pero puede llevar algún tiempo terminar dependiendo del tamaño de sus datos. Para las versiones más nuevas de PostgreSQL, como PG 14.0, solo puede realizar un volcado/restauración (o exportación/importación) o replicación lógica; de lo contrario, utilice pg_upgrade.

Para conjuntos de datos más grandes, el uso de pg_upgrade requiere que lo ejecute en el mismo host, que por defecto aplica una copia de todos sus archivos físicos desde su directorio de datos. En ese caso, pg_upgrade admite la opción -k o --link, lo que significa que utilizará enlaces físicos en lugar de copiar archivos en el nuevo clúster.

pg_upgrade hace todo lo posible para asegurarse de que los clústeres antiguos y nuevos sean compatibles con los binarios, por ejemplo, al verificar la configuración de tiempo de compilación compatible, incluidos los binarios de 32/64 bits. También es importante que todos los módulos externos sean compatibles con binarios, aunque pg_upgrade no puede comprobarlo.

pg_upgrade admite actualizaciones de 8.4.X y posteriores a la versión principal actual de PostgreSQL, incluidas las versiones instantáneas y beta.

Esta es la situación...

En esta configuración, utilicé ClusterControl para implementar un clúster de base de datos PostgreSQL 11 para un solo nodo. Se han probado los siguientes en Centos 7 y 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)

Así que obtuve lo siguiente,

Versión del servidor PostgreSQL: 11.13

Versión de TimescaleDB: 2.3.1

Versión PostGIS: 3.1.4

Si desea probar esto con ClusterControl, hay dos formas de tener TimescaleDB. Puede implementar un clúster de TimescaleDB o tener PostgreSQL y habilitar el complemento TimescaleDB.

Configuración de su PostgreSQL 13

Usar la configuración de su administrador de paquetes para el entorno Linux con su repositorio de PostgreSQL y TimescaleDB es más fácil. Estos son los pasos para hacerlo:

Configurar los repositorios requeridos

Primero, agreguemos el repositorio de PostgreSQL.

Para CentOS/RHEL/Oracle Linux

Debe asegurarse de tener el repositorio correcto. Para Enterprise Linux (EL) 7, puede hacer lo siguiente:

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

Para otra arquitectura, puede basarse aquí https://download.postgresql.org/pub/repos/yum/reporpms/ y reemplazar el subdirectorio EL-7-x86_64.

Agreguemos también el repositorio TimescaleDB.

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

Luego agregue los siguientes contenidos para este archivo,

[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

Simplemente reemplace la baseurl según corresponda si está utilizando una versión que no sea EL 7.

Para Ubuntu/Debian

Agregue el repositorio PG para Ubuntu Focal:

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

Para otras distribuciones de Ubuntu/Debian, simplemente reemplace el focal correspondiente, que puede encontrar aquí http://apt.postgresql.org/pub/repos/apt/dists/. Por ejemplo, reemplace focal-pgdg con buster-pgdg.

Ahora, agreguemos el repositorio para 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"

Importar el llavero,

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

y actualice las listas de paquetes para las actualizaciones de los paquetes que necesitan actualizarse, así como los nuevos paquetes que acaban de llegar a los repositorios.

sudo apt-get update

Puede reemplazar el subdirectorio en la URL si está usando Debian desde ubuntu.

Ahora que tenemos el repositorio listo, estamos listos para comenzar.

Instalar PostgreSQL versión 13 con TimescaleDB y PostGIS

La instalación de PostgreSQL 13 se puede realizar en el mismo host. Primero, debe asegurarse de que cosas como el puerto de la base de datos sean únicos. En otras palabras, tiene que ser diferente del PostgreSQL 11 actual instalado en el mismo host.

Para CentOS/RHEL/Oracle Linux

Ejecute el siguiente comando para instalar PostgreSQL 13 y sus paquetes dependientes: 

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

Luego, inicialice el clúster de la base de datos y su colección requerida de bases de datos ejecutando el siguiente comando:

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

En este punto, debería haber dos directorios de datos para PG 11 y 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

Ahora que somos buenos con PostgreSQL 13, instalemos TimescaleDB. Necesitamos asegurarnos de que el complemento que se instalará sea la misma versión en PostreSQL 11. 

Tenga en cuenta que, para asegurarse de que pg_upgrade funcione sin problemas, los complementos de su destino de origen y versión principal deben ser la misma versión. Esto se debe a que pg_upgrade buscará sus bibliotecas designadas vinculadas a los complementos o extensiones que han sido cargados o utilizados por su versión anterior o de base de datos de origen de su PostgreSQL. Puede verificar esto en su Enterprise Linux ejecutando showduplicates o verificando con información como a continuación, ya sea con dnf o 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

O verifíquelo con la opción de información:

$ 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

Ahora, estamos listos para instalar el paquete TimescaleDB para la versión 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

Después de instalarlo, puede intentar ejecutar la herramienta timescaledb-tune para ajustar su archivo de configuración postgresql.conf. Simplemente ejecute el siguiente comando:

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

Ahora, instalemos el paquete PostGIS para la versión PG 13 también.

$ yum install -y postgis31_13.x86_64 

Para Ubuntu/Debian

Simplemente ejecute:

$  apt install postgresql-client-13 postgresql-13

Lo mejor de las distribuciones Ubuntu/Debian es que existen herramientas para PostgreSQL que son muy útiles para administrar sus clústeres de PostgreSQL, como pg_lsclusters, pg_ctlcluster, etc. 

Puede verificar sus clústeres disponibles instalados.

$ 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

En Ubuntu/Debian, no hay necesidad de cambiar el puerto ya que se manejará durante la fase de instalación y lo detecta y configura de manera única, en consecuencia.

Ahora, instalemos TimescaleDB.

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

Opcionalmente, puede ejecutar la herramienta timescaledb-tune para ajustar su archivo de configuración postgresql.conf simplemente invocando la herramienta de la siguiente manera:

$ timescaledb-tune

Ahora, estamos listos para instalar el paquete PostGIS para PG 13.

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

Revise su postgresql.conf

Siempre es mejor revisar su archivo de configuración postgresql.conf. En las versiones Enterprise Linux, puede ubicar su postgresql.conf en su directorio de datos o en la ruta PGDATA. Mientras que para Ubuntu/Debian, puede ubicarlo en /etc/postgresql///postgresql.conf. Asegúrese de que en su postgresql.conf, las siguientes líneas estén configuradas correctamente:

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.

La mejor práctica es comparar las versiones anterior y nueva de los archivos de configuración de PostgreSQL para asegurarse de que postgresql.conf sea idéntico a lo que se necesita y está configurado.

Antes de continuar con el siguiente paso, también debemos verificar que su versión 13 de PostgreSQL esté cargada en consecuencia. Asegúrese de tener la última versión adquirida o instalada en su host. Inicie la base de datos y asegúrese de que se inicie y se ejecute correctamente.

Para comenzar en las distribuciones EL, ejecute el siguiente comando:

$ 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

o para Ubuntu/Debian, ejecute el siguiente comando:

$ 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

o use la herramienta pg_ctlcluster para iniciar, reiniciar o detener su PG Cluster.

Cuando esté listo, ejecute pg_upgrade…

Antes de continuar, primero asegúrese de tener siempre la copia de seguridad de su antiguo servidor lista y disponible. Realice siempre una copia de seguridad lógica y una copia de seguridad física como buena práctica antes de proceder con una actualización importante.

Ahora que está listo, puede ejecutar pg_upgrade. En la práctica, debe ejecutar inicialmente pg_upgrade con una verificación para determinar la incompatibilidad y los problemas antes de continuar con el procedimiento principal de pg_upgrade. Antes de ejecutar pg_upgrade, asegúrese de que tanto PG 11 como PG 13 estén inactivos mientras realiza este proceso. Eso solo significa que se necesita tiempo de inactividad para este proceso.

Para hacerlo, ejecute el siguiente comando con la opción --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

Reemplace el valor --old-datadir o config_file en consecuencia si es diferente de su configuración.

Esto ejecutará comprobaciones de compatibilidad como el siguiente resultado:

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*

Si todas las comprobaciones indican "bien", eso significa una comprobación exitosa y el mensaje inferior muestra que los clústeres son compatibles, entonces debería estar listo para continuar.

Por último, ejecuta el comando de nuevo sin la opción --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

Según el tamaño de su conjunto de datos, puede llevar un poco de tiempo. En el comando de ejemplo anterior, copia los registros de transacciones, que son archivos físicos. Sin embargo, si el tamaño de su disco es reducido, puede usar la opción -k o --link, que usa enlaces duros. Si todo va bien, debería proporcionarle mensajes como el anterior notificándole con una actualización completa y avisos para actualizar las extensiones que pueda tener. En esta configuración, va sin problemas. El update_extensions.sql contiene solo lo siguiente:

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

Como notó, pg_upgrade realiza una serie de acciones. Analiza todas las filas del clúster de origen, copiando los registros de metadatos de transacciones y sus datos de estado de transacciones múltiples y el resto.

Una vez que se haya dado cuenta de que todo se ve bien, ejecute el script Analyze_new_cluster.sh, que ejecutará

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

Tenga en cuenta que debe especificar el puerto de su PostgreSQL 13 para que vacuumdb se ejecute correctamente en el servidor de destino correcto.

En este caso, el resultado de la actualización con las extensiones TimescaleDB y PostGIS habilitadas va bien. Una vez que todo aparezca en orden, asegúrese de iniciar el servidor y realizar una serie de pruebas y comprobaciones.

Probar el proceso de actualización

Siempre pruebe y revise el proceso de actualización. Aquí hay algunas tablas y una base de datos definida por el usuario, que contiene hipertablas y tablas PostGIS que se basan en el uso de funciones y tipos espaciales de geometría y geografía.

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

Revisando algunos de mis PostGIS e hipertablas:

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)

Ahora todo parece estar listo para funcionar como mi nuevo clúster.

Una vez que empiece a funcionar, puede ejecutar:

$ sudo -iu postgres ./delete_old_cluster.sh

Asegúrese de ejecutar solo el script, ya que es un script muy peligroso, ya que eliminará todos los archivos de su antiguo clúster de PostgreSQL.

Conclusión

pg_upgrade es una gran herramienta para administrar y actualizar su servidor de base de datos PostgreSQL. Puede manejar configuraciones complejas, como con las extensiones TimescaleDB o PostGIS habilitadas. Aunque esta herramienta viene con sus limitaciones, no se puede dejar de usarla, especialmente para su trabajo de DBA y en servidores de producción además de los entornos de control de calidad y desarrollo.