Database Administration

This guide explains the following:

  • Postgres - Local - backup / restore

  • Postgres - Heroku - backup / restore

  • Mongo - Local - backup / restore

  • Mongo - Heroku - backup / restore

  • Accessing production databases

    • Mongo / Postgres GUI options

IMPORTANT NOTE: This document is currently in beta, but should give you a good starting point for backing up data, restoring data, and accessing production databases.

Postgres - Local

Remember you need to have your local postgres server (the elephant icon on mac) running for any of these commands to work.

Backup postgres database to file

This will create a file named db.sql which will contain all of the data of the local postgres database named APP_DATABASE_NAME change these names to match your app as needed.

This is useful for sending to your teammates if you're collaborating or just to have a backup incase you break something.

pg_dump -s -c APP_DATABASE_NAME > db.sql

The -s flag is for schema only. If you want your development data included just remove that flag.

The -c flag tells it to drop old data before creating new data. This is just incase you've done this more than once and are overwritting existing data.

Restore postgres file to database

This will create a database named APP_DATABASE_NAME using the data in db.sql. It will DESTROY the database if it already exists.

psql -d APP_DATABASE_NAME < db.sql

This will throw some errors if the dump was created by someone else. It is ok to ignore these errors.

Reset local database

For the restore process to work you need to have an empty database. The easiest way to achieve this is to just drop and re-create the database.

Make sure there is nothing actively connected to the database (pgCommander, rails, node, etc) when you do this or it won't work.

Delete the database

dropdb APP_DATABASE_NAME

Create a new empty database

createdb APP_DATABASE_NAME

Postgres - Heroku

Push existing .sql file to heroku

If you already have a .sql file you want to upload to heroku you can use this command.

heroku pg:psql < db.sql

Push / Pull database to / from Heroku

Heroku also has commands that will allow you to transfer your local database to heroku or vise-versa without needing to create a .sql file.

Push database to heroku

Uploads the local database named APP_DATABASE_NAME to heroku using the heroku config value for DATABASE_URL.

heroku pg:push APP_DATABASE_NAME DATABASE_URL

Pull database from heroku

This will download the database using the heroku config value for DATABASE_URL and store it in the database named APP_DATABASE_NAME.

heroku pg:pull DATABASE_URL APP_DATABASE_NAME

Reset database

Before you can push a database to heroku you must clear the old database (if one exists).

heroku pg:reset DATABASE_URL

Mongo - Local

Remember you need to have mongod running to do any database manipulation.

Backup mongo database to file

This will create a folder called dump and backup the contents of the mongo database APP_DATABASE_NAME in that folder.

mongodump -h 127.0.0.1 -d APP_DATABASE_NAME -o dump/

restore mongo database from file

This will create a mongo database named APP_DATABASE_NAME by using the dump named APP_DATABASE_NAME in the dump directory.

mongorestore -h 127.0.0.1 -d APP_DATABASE_NAME dump/APP_DATABASE_NAME
  • -h set host to local host.

  • -d target database name (database to create)

  • dump/APP_DATABASE_NAME source dump file to import (listed as last parameter)

Mongo - Heroku

Push existing dump to heroku

mongorestore -h xyz.mongolab.com:12345 -d remote_db_name -u username -p password dump/mylocal_db_name/

you can get the details for mongorestore from the mongo connection uri by running heroku config to get the mongo connection uri. It will be in the followin format.

MONGOLAB_URI: mongodb://username:password@server:port/remote_db_name

# which will look kinda like this:

MONGOLAB_URI: mongodb://heroku_abcdefg:abcdefghijklm@xyz.mongolab.com:12345/heroku-13411

Production Database Access

Postgres

Your local database is only for local testing. Your production database is hosted by heroku so if we want to see what is going on in the database we need to connect to it. To get the database connection details run heroku config and copy the database connection string (starts with "postgres://"). With that url in your clipboard load PG Commander and click "New Favorite" and it will automatically populate the connection fields.

If you aren't using PG Commander you'll have to manually enter the parts of the connection string. The format is as follows:

postgres:// USER_NAME : PASSWORD @ SERVER_URL : PORT_NUMBER / DATABASE_NAME

It'll look kinda like this (heroku passwords tend to contain a hyphen):
postgres://xxxxxx:yyyyyyy-zzzzzzzz@ec2-54-83-55-214.compute-1.amazonaws.com:5432/abcdefghijklmnop

Postgres GUIs

Mongo

The steps for mongo are the same except the url will start with mongodb:// and you'll be setting it up in your mongo gui instead of PG Commander.

You'll need to click "create" to create a new connection and manually enter the connection details from heroku config which will be in the following format.

MONGOLAB_URI: mongodb://username:password@server:port/remote_db_name

# which will look kinda like this:

MONGOLAB_URI: mongodb://heroku_abcdefg:abcdefghijklm@xyz.mongolab.com:12345/heroku-13411

Mongo GUIs:

Last updated