Simple PostgreSQL Upgrades in Development

Upgrading a production PostgreSQL server can be a complex and delicate process. Downtime must be minimized. Writes must be prevented while the upgrade is in progress to avoid data loss. For a large database, excessive storage usage during the upgrade may be a problem. Many other guides describe how to handle these and related issues.

But in a development environment downtime is not an issue, writes can be avoided simply by not using the database, and database size is typically fairly small. For these cases performing the same upgrade process as production can be overkill. There is a simpler way.

This guide is not platform specific, but assumes that PostgreSQL was installed with a package manager or you otherwise know how to install and remove it.

First, use pg_dumpall to backup the entire database cluster. pg_dumpall will write all the SQL necessary to recreate all users and databases in the cluster.

`$ pg_dumpall > pg95.sql`

Next, remove your existing version of PostgreSQL. This could be done with apt remove for a Debian/Ubuntu or brew uninstall of MacOS. Strictly speaking, it's not necessary to remove the old version first. brew will try to do an upgrade and apt will install multiple versions of PostgreSQL side-by-side. But additional edge cases and complications can arise in these cases.

Once the old PostgreSQL server is uninstalled, install the new version. In Debian/Ubuntu this would be something like apt install postgresql-9.6 (prefer installing a specific version to the postgresql metapackage) or brew install postgresql in MacOS.

Lastly, we need to run psql -f pg95.sql. However, the newly installed version of PostgreSQL will only have the postgres user. This means we need to connect to PostgreSQL server as the postgres user.

On Debian/Ubuntu the user must be authenticated via the OS user. So we need to sudo to the postgres user.

$ sudo -u postgres psql -f pg95.sql

On MacOS with homebrew the user can be specificied via argument to the psql command without any authentication.