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