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