Копирование базы данных PostgreSQL на другой сервер

424

Я ищу копию базы данных PostgreSQL на сервере разработки. Какой самый быстрый и простой способ сделать это?

Теги:
database

9 ответов

567
Лучший ответ

Вам не нужно создавать промежуточный файл. Вы можете сделать

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

или

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname

с помощью psql или pg_dump для подключения к удаленному хосту.

С большой базой данных или медленным подключением, сброс файла и перенос сжатого файла могут быть более быстрыми.

Как сказал Корнел, нет необходимости сбрасывать промежуточный файл, если вы хотите работать сжатым, вы можете использовать сжатый туннель

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

или

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

но это решение также требует, чтобы сеанс был в обоих концах.

  • 27
    Нет необходимости в промежуточных файлах - вы можете использовать сжатый туннель SSH или просто pipe: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
  • 2
    Если вы используете bzip2, отключите сжатие ssh, чтобы ускорить передачу!
Показать ещё 15 комментариев
101
pg_dump the_db_name > the_backup.sql

Затем скопируйте резервную копию на ваш сервер разработки, восстановите с помощью:

psql the_new_dev_db < the_backup.sql
  • 2
    Кто-то сказал мне, что это может быть проблематично - проблемы с разрешениями, приводящие к тому, что дамп или восстановление умирают при попадании в триггер?
  • 11
    @rmbarnes: если есть проблемы - их нужно исправить. Без подробного знания того, что сделал этот «Кто-то», никто не может ни подтвердить, ни отклонить это утверждение.
Показать ещё 2 комментария
35

Используйте pg_dump, а затем psql или pg_restore - зависит от того, выбираете ли вы опции -Fp или -Fc для pg_dump.

Пример использования:

ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql
18

Если вы хотите переместиться между версиями (например, вы обновили postgres и выполнили 9.1 на локальном хосте: 5432 и 9.3, запущенные на localhost: 5434), вы можете запустить:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

Ознакомьтесь с документами по миграции.

  • 0
    Меня спрашивают пароль (myuser91 / postgres) несколько раз, есть ли способ, чтобы мне нужно было ввести пароль только один раз?
  • 0
    @MartinWeber Создайте файл pgpass в соответствии с данным документом postgresql.org/docs/9.4/static/libpq-pgpass.html.
12

pg_basebackup кажется лучшим способом сделать это сейчас, особенно для больших баз данных.

  • 9
    Не могли бы вы предоставить более подробную информацию в своем ответе, например, в качестве примера?
  • 5
    Это работает только тогда, когда обе машины имеют одинаковые версии PG.
Показать ещё 3 комментария
4

Запустите эту команду с именем базы данных, вы хотите сделать резервную копию, чтобы выполнить сброс базы данных.

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

 eg. pg_dump -U postgres mydbname -f mydbnamedump.sql

Теперь scp этот файл дампа на удаленную машину, где вы хотите скопировать DB.

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

На удаленном компьютере выполните следующую команду в папке ~/some/, чтобы восстановить БД.

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

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
3

Я много боролся, и в конечном итоге метод, позволявший мне работать с Rails 4, был следующим:

на вашем старом сервере

sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql

Мне пришлось использовать postgres linux для создания дампа. также мне пришлось использовать -c для создания базы данных на новом сервере. --inserts сообщает ему использовать синтаксис INSERT(), который в противном случае не работал бы для меня: (

то на новом сервере, simpy:

sudo su - postgres
psql new_database_name < dump.sql

чтобы передать файл dump.sql между сервером, я просто использовал "cat" для печати содержимого и "nano", чтобы воссоздать его, копируя содержимое.

Кроме того, ROLE i, использующий две базы данных, был другим, поэтому мне пришлось найти - заменить все имя владельца в дампе.

2

Позвольте мне поделиться оболочкой Linux script, чтобы скопировать данные таблицы с одного сервера на другой сервер PostgreSQL.

Ссылка, взятая из этого блога:

Linux Bash Shell script для миграции данных между серверами PostgreSQL:

#!/bin/bash
psql \
    -X \
    -U user_name \
    -h host_name1 \
    -d database_name \
    -c "\\copy tbl_Students to stdout" \
| \
psql \
    -X \
    -U user_name \
    -h host_name2 \
    -d database_name \
    -c "\\copy tbl_Students from stdin"

Я просто переношу данные; создайте пустую таблицу на сервере назначения/второго сервера базы данных.

Это утилита script. Кроме того, вы можете изменить script для общего использования, например, путем добавления параметров для имени хоста, имени базы данных, имени_таблицы и других

0

Дамп вашей базы данных: pg_dump database_name_name > backup.sql


Импортируйте свою базу данных назад: psql db_name < backup.sql

Ещё вопросы

Сообщество Overcoder
Наверх
Меню