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


492

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

Ответы:


668

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

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"

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

Примечание: pg_dump для резервного копирования и psqlдля восстановления. Итак, первая команда в этом ответе - копировать с локального на удаленный, а вторая - с удаленного на локальный . Подробнее -> https://www.postgresql.org/docs/9.6/app-pgdump.html


28
Нет необходимости в промежуточных файлах - вы можете использовать сжатый туннель SSH или просто pipe: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Корнел

4
Если вы используете bzip2, отключите сжатие ssh, чтобы ускорить передачу!
lzap

8
Как я могу работать сжато, если я собираю данные из производства в разработку? Я установил соединение SSH от разработки до производства. Так бы это было ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Джером Френч

2
Я ожидаю, что вы сможете скопировать удаленную базу данных с именем x в локальную базу данных с именем y, но решение @ Ferran для этого не работает ... Мне кажется, что решение porneL просто оставляет файлы bzip2 на сервер, так что это не один шаг процесса. В таком случае, я полагаю, я отброшу базу данных y, использую часть «или» решения Ferran, которая восстанавливает x, а затем переименует базу данных в y.
Дарин Петерсон

3
Вот что я сделал: (1) pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U localuser (2) dropdb y (3) psql -U postgres -c 'ALTER DATABASE "x" ПЕРЕИМЕНОВАТЬ В "y"'
Дарин Петерсон

131
pg_dump the_db_name > the_backup.sql

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

psql the_new_dev_db < the_backup.sql

3
Кто-то сказал мне, что это может быть проблематично - проблемы с разрешениями, приводящие к тому, что дамп или восстановление умирают при попадании в триггер?
Робин Барнс

17
@rmbarnes: если есть проблемы - их нужно исправить. Без подробного знания того, что сделал этот «Кто-то» - никто не может подтвердить или отклонить это утверждение.

4
Используйте флаг --no-owner с pg_dump. Это пропускает проблему, и первая редакция этого поста использовала ее - но потом я подумал, что вам может понадобиться более точная верность исходной базе данных.
размонтировано

4
Для меня выше подход работал следующим образом: pg_dump -C -h хост -U имя пользователя db_name> / any_directory / dump_schema_and_data_file .И для восстановления из файла: Psql -h хоста -U имя пользователя db_name <dump_schema_and_data_file
Али Раза Bhayani

Это спасло меня от обострения. Я использовал Google диск для перемещения файла между компьютерами. Поскольку у меня уже была база данных на новом компьютере (но пустая), я получил МНОГО ошибок дубликата ключа. Тем не менее, это среда разработки, и они ничего не повредили.
Крис Мендла,

37

Используйте 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

22

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

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

Проверьте документы по миграции .


Меня спрашивают пароль (myuser91 / postgres) несколько раз, есть ли способ, чтобы мне нужно было ввести пароль только один раз?
Мартин Вебер

@MartinWeber Создайте файл pgpass в соответствии с этим документом postgresql.org/docs/9.4/static/libpq-pgpass.html
Скотт Уоррен,

Что делать, если у них есть оба одинаковых порта?
ggnoredo

Если они находятся на разных серверах, вы можете использовать -h для указания хостов.
Haroldo_OK

16

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

Вы можете скопировать базу данных с сервера с такой же или более старой основной версией. Или точнее :

pg_basebackupработает с серверами той же или более старой основной версии, вплоть до 9.1. Однако потоковый режим WAL ( -X stream) работает только с версией сервера 9.3 и новее, а режим tar format ( --format=tar) текущей версии работает только с версией сервера 9.5 или новее.

Для этого вам нужно на исходном сервере:

  1. listen_addresses = '*'чтобы иметь возможность подключиться с целевого сервера. Убедитесь, что порт 5432 открыт в этом отношении.
  2. По крайней мере 1 доступное подключение репликации: max_wal_senders = 1( -X fetch), 2для -X stream(по умолчанию в случае PostgreSQL 12) или более.
  3. wal_level = replicaили выше, чтобы иметь возможность установить max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trustв pg_hba.conf. Это предоставляет доступ к pgкластеру любому пользователю с DST_IPкомпьютера. Возможно, вы захотите прибегнуть к более безопасному варианту.

Изменения 1, 2, 3 требуют перезагрузки сервера, изменение 4 требует перезагрузки.

На целевом сервере:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

11
Не могли бы вы предоставить более подробную информацию в своем ответе, например, в качестве примера?
Magnilex

7
Это работает только тогда, когда обе машины имеют одинаковые версии PG, хотя.
см

Скорее всего, вы будете использовать другую версию базы данных для разработки и производства. В прошлый раз у меня была неприятная беседа с одним из моих товарищей по команде, когда она пыталась сообщить о проблеме, что некоторый код не работает с PG 9.6, в то время как мы использовали 9.5 в производстве в то время. Базовое резервное копирование намного быстрее. Тогда pg_upgrade - это путь, если нужно.
Зорг

2
Скорее всего, вы хотите перейти на более новую версию и не хотите останавливать PostgreSQL.
x-yuri

1
Скорее всего, всякий раз, когда вы обновляете свою базу данных, вы обновляете ее на dev и staging, прежде чем делать это на производстве.
Эндрю Лориен

8

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

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

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

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

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

7

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

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

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

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

затем на новом сервере просто:

sudo su - postgres
psql new_database_name < dump.sql

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

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


6

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


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


5

Позвольте мне поделиться сценарием оболочки Linux для копирования данных вашей таблицы с одного сервера на другой сервер 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"

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

Это служебный скрипт. Кроме того, вы можете изменить скрипт для общего использования, например, добавив параметры для host_name, database_name, table_name и других


5

Принятый ответ правильный, но если вы хотите избежать ввода пароля в интерактивном режиме, вы можете использовать это:

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.