---
title: "Postgresql Tips"
date: 2025-04-30
draft: false
tags: ["linux", "Debian", "Postgresql", "Database", "pg_dump"]
authors: ["trent"]
post: 37
---
date: 2025-04-30

## Introduction
Sometimes you want to recreate an postgresql database on a different
server or postgresql instance.
And so here are some tips how to do that.


## Backup and Restore Using Tar File
### create a backup with `pg_dump`
* switch to postgres user `su - postgres`
* create backup `pg_dump -d mytestdb -F tar -f mytestdb.tar`
* or with specific port `pg_dump -p5432 -d mytestdb -F tar -f mytestdb.tar`
* examine contents of tar `tar -tvf mytestdb.tar`
* alternately make a compressed backup
* `pg_dump -d mytestdb -Fc -f mytestdb_compressed_backup`

### restore with `pg_restore`
* switch to postgres user `su - postgres`
* start psql `psql -p5432`
* `postgres# CREATE USER mytestuser;`
* `postgres# \password mytestuser`
* `postgres# CREATE DATABASE mytestdb WITH OWNER mytestuser;`
* list users `postgres# \du`
* list databases `postgres# \l`
* `exit`
* `pg_restore -p5432 -d mytestdb mytestdb.tar`
* or `pg_restore -p5432 -d mytestdb mytestdb_compressed_backup`

### verify the restored database
* switch to postgres user `su - postgres`
* start psql `psql -p5432`
* change database `postgres# \c mytestdb`
* list tables `postgres# \d` or `postgres# \dt`

## Backup and Restore Schema Only
### create a backup with `pg_dump`
* switch to postgres user `su - postgres`
* create backup `pg_dump --schema-only -d mytestdb -f mytestdb_schema.sql`
* or with specific port `pg_dump -p54342 --schema-only -d mytestdb -f mytestdb_schema.sql`
* examine sql file `less mytestdb_schema.sql`
* note that the generated sql assigns ownership of each table, to that of the original database owner, upon creation

### restore with `psql` command
* switch to postgres user `su - postgres`
* `psql -p5432 -d mytestdb -f mytestdb_schema.sql`

### verify the restored database
* switch to postgres user `su - postgres`
* start psql `psql -p5432`
* change database `postgres# \c mytestdb`
* list tables `postgres# \d` or `postgres# \dt`
