Я хочу скопировать производственную базу данных PostgreSQL на сервер разработки. Какой самый быстрый и простой способ сделать это?
Я хочу скопировать производственную базу данных PostgreSQL на сервер разработки. Какой самый быстрый и простой способ сделать это?
Ответы:
Вам не нужно создавать промежуточный файл. Ты можешь сделать
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
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
?
pg_dump the_db_name > the_backup.sql
Затем скопируйте резервную копию на сервер разработки, восстановите с помощью:
psql the_new_dev_db < the_backup.sql
Используйте 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
Если вы хотите выполнить миграцию между версиями (например, вы обновили postgres и у вас запущен 9.1 на localhost: 5432 и 9.3 на localhost: 5434), вы можете запустить:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
pg_basebackup
кажется, лучший способ сделать это сейчас, особенно для больших баз данных.
Вы можете скопировать базу данных с сервера с такой же или более старой основной версией. Или точнее :
pg_basebackup
работает с серверами той же или более старой основной версии, вплоть до 9.1. Однако потоковый режим WAL (-X stream
) работает только с версией сервера 9.3 и новее, а режим tar format (--format=tar
) текущей версии работает только с версией сервера 9.5 или новее.
Для этого вам нужно на исходном сервере:
listen_addresses = '*'
чтобы иметь возможность подключиться с целевого сервера. Убедитесь, что порт 5432 открыт в этом отношении.max_wal_senders = 1
( -X fetch
), 2
для -X stream
(по умолчанию в случае PostgreSQL 12) или более.wal_level = replica
или выше, чтобы иметь возможность установить max_wal_senders > 0
.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
Запустите эту команду с именем базы данных, которую вы хотите сделать резервную копию, чтобы получить дамп БД.
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
Я очень много боролся, и в итоге метод, который позволил мне заставить его работать с 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» для его повторного копирования и вставки содержимого.
Кроме того, роль, которую я использовал в двух базах данных, отличалась, поэтому мне пришлось найти и заменить все имя владельца в дампе.
Дамп вашей базы данных: pg_dump database_name_name > backup.sql
Импортируйте вашу базу данных обратно: psql db_name < backup.sql
Позвольте мне поделиться сценарием оболочки 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 и других
Принятый ответ правильный, но если вы хотите избежать ввода пароля в интерактивном режиме, вы можете использовать это:
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}}