585

Locally, I use pgadmin3. On the remote server, however, I have no such luxury.

I've already created the backup of the database and copied it over, but is there a way to restore a backup from the command line? I only see things related to GUI or to pg_dumps.

0

37 Answers 37

721

There are two tools to look at, depending on how you created the dump file.

Your first source of reference should be the man page pg_dump as that is what creates the dump itself. It says:

Dumps can be output in script or archive file formats. Script dumps are plain-text files containing the SQL commands required to reconstruct the database to the state it was in at the time it was saved. To restore from such a script, feed it to psql(1). Script files can be used to reconstruct the database even on other machines and other architectures; with some modifications even on other SQL database products.

The alternative archive file formats must be used with pg_restore(1) to rebuild the database. They allow pg_restore to be selective about what is restored, or even to reorder the items prior to being restored. The archive file formats are designed to be portable across architectures.

So depends on the way it was dumped out. If using Linux/Unix, you can probably figure it out using the excellent file(1) command - if it mentions ASCII text and/or SQL, it should be restored with psql otherwise you should probably use pg_restore.

Restoring is pretty easy:

psql -U username -d dbname < filename.sql

-- For Postgres versions 9.0 or earlier
psql -U username -d dbname -1 -f filename.sql

or

pg_restore -U username -d dbname -1 filename.dump

Check out their respective manpages - there's quite a few options that affect how the restore works. You may have to clean out your "live" databases or recreate them from template0 (as pointed out in a comment) before restoring, depending on how the dumps were generated.

Sign up to request clarification or add additional context in comments.

16 Comments

IME you practically always want to restore into a database that has been newly-created from template0. Otherwise if you've done something like activating plpgsql in template1, the restore process will try to do it again, and the -1 switch you suggest means the whole transaction will fail. So something like "createdb -T template0 seo2" followed by "pg_restore -v -d seo2 seo.pg" to restore seo.pg (made from the seo database) into a new seo2 database. If your backup file is just a .sql file, you can trim conflicting bits of it out by hand.
You cannot have -d and -f at the same time. pg_restore: options -d/--dbname and -f/--file cannot be used together
In version 9.2 the "-f" option specifies an output file, not the dump file (and it probably means the same in earlier versions).
Regarding cannot be used together, see here: stackoverflow.com/questions/27882070/…
@Alex78191 it means it executes as a single transaction, which could completely fail and rollback, or go through. It will block some access to the database also.
|
343

create backup

pg_dump -h localhost -p 5432 -U postgres -F c -b -v -f 
"/usr/local/backup/10.70.0.61.backup" old_db

-F c is custom format (compressed, and able to do in parallel with -j N) -b is including blobs, -v is verbose, -f is the backup file name.

restore from backup

pg_restore -h localhost -p 5432 -U postgres -d old_db -v 
"/usr/local/backup/10.70.0.61.backup"

important to set -h localhost - option

4 Comments

I'd like to mention that before you execute these commands you should be located in the Posgresql bin folder. For example in Windows (if you installed it in the default folder) it would be C:\Program Files\PostgreSQL\9.6\bin
@juan_carlos_yl Or make sure the bin directory is on your PATH
>-F c is custom format (compressed, and able to do in parallel with -j N) This is wrong, only directory format support parallel dump
pg_dump -h localhost -p 5432 -U postgres -F c -b -v old_db -f "/usr/local/backup/10.70.0.61.backup" I find it more intuitive if tis written this way
152

You might need to be logged in as postgres in order to have full privileges on databases.

su - postgres
psql -l                      # will list all databases on Postgres cluster

pg_dump/pg_restore

  pg_dump -U username -f backup.dump database_name -Fc 

switch -F specify format of backup file:

  • c will use custom PostgreSQL format which is compressed and results in smallest backup file size
  • d for directory where each file is one table
  • t for TAR archive (bigger than custom format)
  • -h/--host Specifies the host name of the machine on which the server is running
  • -W/--password Force pg_dump to prompt for a password before connecting to a database

restore backup:

   pg_restore -d database_name -U username -C backup.dump

Parameter -C should create database before importing data. If it doesn't work you can always create database eg. with command (as user postgres or other account that has rights to create databases) createdb db_name -O owner

pg_dump/psql

In case that you didn't specify the argument -F default plain text SQL format was used (or with -F p). Then you can't use pg_restore. You can import data with psql.

backup:

pg_dump -U username -f backup.sql database_name

restore:

psql -d database_name -f backup.sql

5 Comments

I used the "psql -d database_name -f backup.sql" command to restore a database I dumped from dokku on DigitalOcean. Worked great.
while using psql if your user (for e.g. postgres) has a password set then -W option should be used. For e.g. on Ubuntu without doing su postgres anywhere from terminal $ psql -h localhost -U postgres -W -d DB_NAME < DB_BACKUP.sql is the command which worked for me to restore my backup on my localhost. Note that -h option is needed.
@JiggneshhGohel As the manual says: -W option is never essential. pg_dump will automatically prompt for a password if the server demands password authentication. Also you can use PGPASSWORD env variable, if you're using plain-text passwords. -h is needed if the default PGHOST is not applicable. These options are common for many PostgreSQL utils, thus not essential to answer this question (it heavily depends on your setup).
@Tombart your 2nd option pg_dump/psql part is work for me. but 1st part pg_dump/pg_restore is not work for me for restore. Thank you.
@AnjanBiswas The first option is using compressed archive, which will need more CPUs but the backup file will occupy less space on disk. You just need to choose appropriate compression e.g. -Fc
82

POSTGRESQL 9.1.12

DUMP:

pg_dump -U user db_name > archive_name.sql

put the user password and press enter.

RESTORE:

psql -U user db_name < /directory/archive.sql

put the user password and press enter.

1 Comment

How i can capture restore log in file instead of printing on screen? please let me know i have tries with >>, 2>> , but not working thanks.
47

Below is my version of pg_dump which I use to restore the database:

pg_restore -h localhost -p 5432 -U postgres -d my_new_database my_old_database.backup

or use psql:

psql -h localhost -U postgres -p 5432 my_new_database < my_old_database.backup

where -h host, -p port, -u login username, -d name of database

1 Comment

my_new_database should already exist when using psql, not?
42

Backup and restore with GZIP

For larger size database this is very good

backup

pg_dump -U user -d mydb | gzip > mydb.pgsql.gz

restore

gunzip -c mydb.pgsql.gz | psql dbname -U user

https://www.postgresql.org/docs/14/backup-dump.html

2 Comments

For ubuntu you could use: gunzip -c mydb.pgsql.gz | sudo -u postgres psql To get the permissions to operate on the database. Also consider the --clean flag when dumping, that will wipe all existing data, might come in handy.
for windows it is hard to configure all eg. gungip command ;)
32

This worked for me:

pg_restore --verbose --clean --no-acl --no-owner --host=localhost --dbname=db_name --username=username latest.dump

Comments

25

Backup:

pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

Restore:

psql -U {user-name} -d {desintation_db} -f {dumpfilename.sql}

Comments

11

Backup & Restore

This is the combo I'm using to backup, drop, create and restore my database (on macOS and Linux):

sudo -u postgres pg_dump -Fc mydb > ./mydb.sql
sudo -u postgres dropdb mydb
sudo -u postgres createdb -O db_user mydb
sudo -u postgres pg_restore -d mydb < ./mydb.sql

Misc

  • -Fc will compress the database (Format custom)
  • List PostgreSQL users: sudo -u postgres psql -c "\du+"
  • You may want to add hostname and date to ./mydb.sql, then change it by:
    ./`hostname`_mydb_`date +"%Y%m%d_%H%M"`.sql
    

1 Comment

good stuff @DevonDahon, 4 commands that are straight to the point & doesn't need the psql shell. I was able successfully user your answer but had a warning pg_restore: [custom archiver] WARNING: ftell mismatch with expected position -- ftell used on Ubuntu 18.04 with postgres 10.13 so I don't know what that's about...
10

try this:

psql -U <username> -d <dbname> -f <filename>.sql

Restore DB psql from .sql file

1 Comment

psql -U <username> -d <dbname> -f <filename>.sql
10

If you are using docker, this answer may be helpful.

  1. Start the container
    docker start <postgres_container_id>
    
  2. Access bash inside container
    docker exec -it <postgres_container_id> bash
    
  3. Copy the .tar backup file to docker container (In another window)
    docker cp postgres_dump.tar <postgres_container_id>:/
    
  4. Restore the backup
    pg_restore -c -U <postgres-user> -d <database-name>  -v "postgres_dump.tar" -W
    
  5. Enter password

Comments

9

1. Open the Terminal.

2. Backup your database with following command

your postgres bin -> /opt/PostgreSQL/9.1/bin/

your source database server -> 192.168.1.111

your backup file location and name -> /home/dinesh/db/mydb.backup

your source db name -> mydatabase

/opt/PostgreSQL/9.1/bin/pg_dump --host '192.168.1.111' --port 5432 --username "postgres" --no-password  --format custom --blobs --file "/home/dinesh/db/mydb.backup" "mydatabase"

3. Restore mydb.backup file into destination.

your destination server -> localhost

your destination database name -> mydatabase

Create database for restore the backup.

/opt/PostgreSQL/9.1/bin/psql -h 'localhost' -p 5432 -U postgres -c "CREATE DATABASE mydatabase"

Restore the backup.

/opt/PostgreSQL/9.1/bin/pg_restore --host 'localhost' --port 5432 --username "postgres" --dbname "mydatabase" --no-password --clean "/home/dinesh/db/mydb.backup"

Comments

8

If you create a backup using pg_dump you can easily restore it in the following way:

  1. Open command line window
  2. Go to Postgres bin folder. For example: cd "C:\ProgramFiles\PostgreSQL\9.5\bin"
  3. Enter the command to restore your database. For example: psql.exe -U postgres -d YourDatabase -f D:\Backup\.sql
  4. Type password for your postgres user
  5. Check the restore process

Comments

8

To restore a dump file:

psql -d [Dbname] -U [UserName] -p 5432 < [FileLocation]

To restore a .SQL file:

pg_restore -U [Username] -d [Dbname] -1 [FileLocation]

If you get user authentication errors, go to the file pg_hba.conf which is in PSQL/data folder in your program files, and change the "METHOD" to "Trust".

Restart your psql service in windows services (Win + R --> services.msc).

Comments

7

1) Open psql terminal.

2) Unzip/ untar the dump file.

3) Create an empty database.

4) use the following command to restore the .dump file

<database_name>-# \i <path_to_.dump_file>

Comments

7

try:

pg_restore -h localhost -p 5432 -U <username> -d <dbname> -1 <filename>

Comments

7

I didnt see here mentions about dump file extension (*.dump).

This solution worked for me:

I got a dump file and needed to recover it.

First I tried to do this with pg_restore and got:

pg_restore: error: input file appears to be a text format dump. Please use psql.

I did it with psql and worked well:

psql -U myUser -d myDataBase < path_to_the_file/file.dump

Comments

6

Save and restore the exact same state with compressed dump

Other answers gave all the key bits separately, but hopefully this will provide be the "just works save and restore to exact state" command pair that you usually want.

Dump the DB to a file mydb.psql:

PGPASSWORD=mypassword pg_dump -U my_username -h localhost \
  mydb -Fc -f mydb.psql

Restore the DB from a file mydb.psql:

PGPASSWORD=mypassword pg_restore -U my_username -h localhost \
  --clean -d mydb -v --no-privileges --no-owner mydb.psql

Some of the flags:

  • -Fc: Format "custom", which happens to also be compressed as opposed to plaintext, and produces a much smaller dump file. Docs: https://www.postgresql.org/docs/current/app-pgdump.html file tmp.psql says:

    tmp.psql: PostgreSQL custom database dump - v1.14-0
    

    Compression can also be further customized with the -Z option.

  • --clean: destroy the target DB before restoring it, thus returning to the exact same pristine state. Any data created after the dump will be lost. If you don't pass this, it attempts to just add the dump on top of pre-existing data, which could fail unique constraints and corrupt your data.

  • -v: verbose, output logs while restore. Can be helpful do debug things

  • --no-privileges --no-owner: prevent issuing GRANT commands that setup privileges. These can cause trouble e.g. if you are restoring a production DB locally to reproduce, as the production and local may have different privilege setups. See also: pg_restore error: role XXX does not exist

PGPASSWORD, -U and -h can of course be modified depending on your login method, e.g. without PGPASSWORD you're prompted for a password, and none of those are needed if you set up peer auth locally.

Tested on Ubuntu 22.04, PostgreSQL 14.5.

Comments

6

Restoring a postgres backup file depends on how you made the backup in the first place.

If you used pg_dump with -F c or -F d you need to use pg_restore, otherwise you can just use:

psql -h localhost -p 5432 -U postgres < backupfile

9 ways to backup and restore postgres databases

1 Comment

Do you realize that you missed the database name part and it will complain about destination database doesn't exist?
5

The shortest way with no password prompt:

psql "postgresql://<db_user>:<db_pass>@<ip>:<port>/<db_name>" < "backup.sql"

If you are using Windows OS:

psql.exe "postgresql://<db_user>:<db_pass>@<ip>:<port>/<db_name>" < "backup.sql"

Comments

4

As below link said, you can use psql command for restoring the dump file:

https://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP-RESTORE

psql dbname < infile

if you need to set username just add the username after the command like:

psql dbname < infile username

Comments

2

I was having authentication problems running pg_dump, so I moved my dump file

mv database_dump /tmp

into the temp directory and then ran

su -u postgres
cd /tmp
pg_restore database_dump

If you have a large database dump, you may just want to create another directory where your current user and the postgres user can access and putting the database dump file into that.

Comments

2

Try to see if the following commands can help you:

sudo su - yourdbuser
psql
\i yourbackupfile

Comments

2

If you have a backup SQL file then you can easily Restore it. Just follow the instructions, given in the below

1. At first, create a database using pgAdmin or whatever you want (for example my_db is our created db name)
2. Now Open command line window
3. Go to Postgres bin folder. For example:  cd "C:\ProgramFiles\PostgreSQL\pg10\bin"
4. Enter the following command to restore your database: psql.exe -U postgres -d my_db -f D:\Backup\backup_file_name.sql 

Type password for your postgres user if needed and let Postgres to do its work. Then you can check the restore process.

Comments

2

Sorry for the necropost, but these solutions did not work for me. I'm on postgres 10. On Linux:

  1. I had to change directory to my pg_hba.conf.
  2. I had to edit the file to change method from peer to md5 as stated here
  3. Restart the service: service postgresql-10 restart
  4. Change directory to where my backup.sql was located and execute:
    psql postgres -d database_name -1 -f backup.sql

    -database_name is the name of my database

    -backup.sql is the name of my .sql backup file.

Comments

2

For example, you export the schema and data or only the schema of apple database of the user(role) john to backup.sql with psql which must be used to import non-archive files as shown below. *backup.sql is created if it doesn't exist and my answer explains how to export schema and data and my answer explains how to import archive backup.sql into orange database and the doc explains how to export and import databases:

pg_dump -U john apple > backup.sql

Or:

pg_dump -U john -s apple > backup.sql

Or, you export only the data of the specific tables of apple database of the user(role) john to backup.sql with only INSERT statement which has column names as shown below:

pg_dump -U john -a --column-inserts -t person -t animal apple > backup.sql

Then, you need to input a password after running the command above:

Password:

Now, you can import backup.sql into orange database of the user(role) john as shown below. *You have to create orange database before hand otherwise there is error and my answer explains how to create a database:

psql -U john -f backup.sql orange

Or:

psql -U john -d orange -f backup.sql

Or:

psql --username=john --file=backup.sql orange

Or:

psql --username john --file backup.sql orange

Or:

psql --username=john --dbname=orange --file=backup.sql

Or:

psql --username john --dbname orange --file backup.sql

Or, you can try these below which don't work on Windows:

psql -U john orange < backup.sql
psql -U john -d orange < backup.sql
psql --username=john --dbname=orange < backup.sql
psql --username john --dbname orange < backup.sql

Then, you need to input a password after running the command above:

Password for user john:

In addition, you can import backup.sql into orange database of the user(role) john without a password prompt by setting a password(e.g., banana) to PGPASSWORD as shown below:

PGPASSWORD=banana psql -U john -f backup.sql orange

Comments

2

This solution only works for Windows.

First, ensure you have already added the postgres bin folder to the "Path" environment variable. In my case this folder is C:\Program Files\PostgreSQL\12\bin.

Then, open the Windows command interpreter (cmd), go to the folder where you have the .sql file and execute this command:

pg_restore -U userName -d database-1 backupfile.sql

For example:

pg_restore -U sam -d SamDataBase -1 SamDataBaseBackup.sql

It can ask you for the password of the user so ensure to type it correctly and then click enter.

Comments

1

If you have created a new database named mydb, To restore a .sql dump to that database with psql,

psql --file=dump.sql --username=postgres --host=localhost --port=5432 mydb

the password will be prompted by psql

The connection options are

  -h, --host=HOSTNAME      database server host or socket directory (default: "/var/run/postgresql")
  -p, --port=PORT          database server port (default: "5432")
  -U, --username=USERNAME  database user name (default: "xyz")
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)

Comments

1

For example, you export and archive the schema and data or only the schema of apple database of the user(role) john to backup.sql with -Fc or -Ft as shown below. *backup.sql is created if it doesn't exist and my answer explains how to export and archive a database with -Fc or -Ft and my answer explains how to import backup.sql into orange database and the doc explains how to export and import databases:

pg_dump -U john -Fc apple > backup.sql

Or:

pg_dump -U john -Ft apple > backup.sql

Or:

pg_dump -U john -s -Fc apple > backup.sql

Or:

pg_dump -U john -s -Ft apple > backup.sql

Or, you export and archive(-Fc or -Ft) only the data of the specific tables of apple database of the user(role) john to backup.sql with only INSERT statement which has column names as shown below:

pg_dump -U john -Fc -a --column-inserts -t person -t animal apple > backup.sql

Or:

pg_dump -U john -Ft -a --column-inserts -t person -t animal apple > backup.sql

Then, you need to input a password after running the command above:

Password:

Now, you can import archive backup.sql into orange database of the user(role) john with pg_restore which must be used to import archive files as shown below. *You have to create orange database before hand otherwise there is error and my answer explains how to create a database:

pg_restore -U john -d orange < backup.sql

Or:

pg_restore --username=john --dbname=orange < backup.sql

Or:

pg_restore --username john --dbname orange < backup.sql

Then, you need to input a password after running the command above:

Password for user john:

In addition, you can import backup.sql into orange database of the user(role) john without a password prompt by setting a password(e.g., banana) to PGPASSWORD as shown below:

PGPASSWORD=banana pg_restore -U john -d orange < backup.sql

Comments

1

For taking a backup, one can use pg_dump command and for restoring psql command can be useful.

I did it by connecting an FTP of ec2 instance via putty, and ran the above commands as below. [pgclient should be installed on an ec2].

For backup,

pg_dump -h endpointOfSourceDBName -Fp --no-acl --no-owner -U postgres -t "\"Emp\""  SourceDBName > OutputFileName.sql  

where,
-F format
--format=format
p
plain
c
custom
d
directory
t
tar

-O
--no-owner

-t pattern
--table=pattern

-x
--no-privileges
--no-acl

For restoring,

psql \
   -f sourcefilename.sql \
   --host endPointOfDestinationDB \
   --port 5432 \
   --username postgres \
   --password passwordOfDestinationDB \
   --dbname destinationDBName

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.