PostgreSQL 14: Database migration with pg_dump

nabbisen - Jan 4 '23 - - Dev Community

Summary

PostgreSQL offers native ways to export database as backup from existing server and import to restore it to another one.

This post shows how to do it. It is really simple thanks to them.

It consists of a pair of key commands.

Export (backup)

pg_dump dbname > dumpfile
Enter fullscreen mode Exit fullscreen mode

Import (restoration)

psql dbname < dumpfile
Enter fullscreen mode Exit fullscreen mode

You must create database where you migrate to beforehand.

Environment


Tutorial

Create database on new server

Create user

The user name must be the same to the owner of existing database. It is shown as {DB_OWNER} below.

$ createuser -U {DB_ADMIN} --port {DB_PORT} --pwprompt {DB_OWNER}
Enter fullscreen mode Exit fullscreen mode

You will be asked of the password of the new user (role):

Enter password for new role: 
Enter it again: 
Enter fullscreen mode Exit fullscreen mode

Then the password of {DB_ADMIN} (the database administrator such as postgres) will be required:

Password:
Enter fullscreen mode Exit fullscreen mode

Create database

As to below, {DB_OWNER} is that you created above. {DB_NAME} is the very database you are migrating.
Run:

$ createdb -U {DB_ADMIN} --port {DB_PORT} --encoding=UTF8 --locale=C --template=template0 --owner={DB_OWNER} {DB_NAME}
Enter fullscreen mode Exit fullscreen mode

Then the password of {DB_ADMIN} will be required again:

Password:
Enter fullscreen mode Exit fullscreen mode

Now your new database is ready.

Migrate

Export

Get the data from {DB_NAME} on {OLD_SERVER} and write it in {EXPORT_FILE}.sql:

$ pg_dump -U {DB_OWNER} -h {OLD_SERVER} {DB_NAME} > {EXPORTED_FILE}.sql
Enter fullscreen mode Exit fullscreen mode

Next, I compressed the exported file and move it to the new server instead.

(Alternative) Direct import from the old server

Alternatively, you might import it to the new server directly with -h option:

$ psql -U {DB_OWNER} -h {NEW_SERVER} {DB_NAME} < {EXPORTED_FILE}.sql
Enter fullscreen mode Exit fullscreen mode

Transfer

When it is big, you had better compress it before moving it.

$ gzip {EXPORTED_FILE}.sql
Enter fullscreen mode Exit fullscreen mode

Then deliver it to the new server with scp or another.

$ scp {EXPORTED_FILE}.sql.gz new-server
Enter fullscreen mode Exit fullscreen mode

Transfer is successful ?
Enter the new server, and decompress it.

$ gunzip {EXPORTED_FILE}.sql.gz
Enter fullscreen mode Exit fullscreen mode

Import

It's the final step !! Supposed you are in the new server, run:

$ psql -U {DB_OWNER} -d {DB_NAME} -f {EXPORTED_FILE}.sql
Enter fullscreen mode Exit fullscreen mode

The password will be required:

Password for user {DB_OWNER}: 
Enter fullscreen mode Exit fullscreen mode

The output was in my case:

SET
(...)
 set_config 
------------

(1 row)

SET
CREATE FUNCTION
(...)
CREATE TABLE
CREATE SEQUENCE
ALTER TABLE
(...)
COPY 20
(...)
 setval 
--------
   6820
(1 row)
(...)

ALTER TABLE
(...)
Enter fullscreen mode Exit fullscreen mode

Reference

With many thanks to:


Happy storing 🕊

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .