Update postgresql

Update packages and install the new PostgreSQL 13

sudo apt-get update
sudo apt-get install postgresql-13 postgresql-server-dev-13

Check if there are any differences in the config files

diff /etc/postgresql/12/main/postgresql.conf /etc/postgresql/13/main/postgresql.conf
diff /etc/postgresql/12/main/pg_hba.conf /etc/postgresql/13/main/pg_hba.conf

Stop the PostgreSQL service

sudo systemctl stop postgresql.service

Log in as the postgres user

sudo su - postgres

Check clusters (notice the –check argument, this will not change any data)

/usr/lib/postgresql/13/bin/pg_upgrade \
  --old-datadir=/var/lib/postgresql/12/main \
  --new-datadir=/var/lib/postgresql/13/main \
  --old-bindir=/usr/lib/postgresql/12/bin \
  --new-bindir=/usr/lib/postgresql/13/bin \
  --old-options '-c config_file=/etc/postgresql/12/main/postgresql.conf' \
  --new-options '-c config_file=/etc/postgresql/13/main/postgresql.conf' \
  --check

Migrate the data (without the –check argument)

/usr/lib/postgresql/13/bin/pg_upgrade \
  --old-datadir=/var/lib/postgresql/12/main \
  --new-datadir=/var/lib/postgresql/13/main \
  --old-bindir=/usr/lib/postgresql/12/bin \
  --new-bindir=/usr/lib/postgresql/13/bin \
  --old-options '-c config_file=/etc/postgresql/12/main/postgresql.conf' \
  --new-options '-c config_file=/etc/postgresql/13/main/postgresql.conf'

Go back to the regular user

exit

Swap the ports for the old and new PostgreSQL versions

sudo vim /etc/postgresql/13/main/postgresql.conf
# ...and change "port = 5433" to "port = 5432"

sudo vim /etc/postgresql/12/main/postgresql.conf
# ...and change "port = 5432" to "port = 5433"

Start the PostgreSQL service

sudo systemctl start postgresql.service

Log in as the postgres user again

sudo su - postgres

Check the new PostgreSQL version

psql -c "SELECT version();"

Run the generated analyze_new_cluster script

/usr/lib/postgresql/13/bin/vacuumdb --all --analyze-in-stages

Back to normal user

exit

Check which old PostgreSQL packages are installed

apt list --installed | grep postgresql

Remove the old PostgreSQL packages (from the listing above)

sudo apt-get remove postgresql-12 postgresql-server-dev-12

Remove the old configuration

sudo rm -rf /etc/postgresql/12/

Log in as the postgres user once more

sudo su - postgres

Finally, drop the old cluster data

./delete_old_cluster.sh

Done!

Source