====== PostgreSQL/PostGIS Upgrade from 11 to 13 ====== Notes about upgrading a **Debian 10 Buster** to **Debian 11 Bullseye**, this causes the following packages upgrade: * **Debian 10 Buster** * postgresql-11 * postgresql-11-postgis-2.5 * **Debian 11 Bullseye** * postgresql-13 * postgresql-13-postgis-3 The **PostgreSQL database** will upgrade from version **11.16** to version **13.7**, the **PostGIS library** will upgrade from version **2.5.1** to version **3.1.1**. ===== After the system upgrade ===== Verify the that the system upgrade installed the new packages, otherwise install them manually: apt install postgresql-13-postgis-3 postgresql-13-postgis-3-scripts Once the system is fully upgraded, you will find that your databases still run on the older **11/main cluster**. Switch to the **postgres** user and run the **pg_lsclusters** command to verify: pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 11 main 5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log 13 main 5433 online postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log As you can see the default **5432/TCP** port is still used by the old version. Connect to both the clusters and check where are **your databases**: they are still **on the old cluster** and they are using the **old PostGIS extension**: psql --cluster 11/main postgres=# \l Name | Owner | Encoding | Collate | Ctype | Access privileges --------------------+--------------------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | strade | strade | UTF8 | en_US.UTF-8 | en_US.UTF-8 | ... postgres=# \connect strade strade=# \dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+--------------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 2.5.1 | public | PostGIS geometry, geography, and raster spatial types and functions ===== Execute pg_upgradecluster ===== All the administrative tasks should be performed by the **postgres** user. Connect to the new cluster and verify that it is empty (only the system databases ''postgres'', ''template0'' and ''template1'' should exist): psql --cluster 13/main postgres=# \l So you can remove the 13/main cluster ad perform the automatic upgrade: pg_dropcluster --stop 13 main pg_upgradecluster 11 main The old cluster was moved to port **5433/TCP** and turned **down**, the new cluster was moved to the default port **5432/TCP**: pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 11 main 5433 down postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log 13 main 5432 online postgres /var/lib/postgresql/13/main /var/log/postgresql/postgresql-13-main.log Connect to the new cluster and verify that your geographic databases were upgraded to the new PostGIS extension: psql --cluster 13/main postgres=# \connect strade strade=# \dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+--------------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.1.1 | public | PostGIS geometry, geography, and raster spatial types and functions ===== Cleanup ===== All the above operations were made using the **posgres** user (not ''root''). It is time to remove the old cluster and stop the new one: pg_dropcluster 11 main pg_ctlcluster 13 main stop We stopped the new cluster because we need to start it again using the **systemd** subsystem, under the controlo of the **root** user: systemctl daemon-reload systemctl enable postgresql@13-main systemctl start postgresql@13-main