Я хочу скопіювати виробничу базу даних 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
Якщо ви хочете мігрувати між версіями (наприклад, ви оновили поштові адреси та у вас 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=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 (), який інакше не працював би для мене :(
потім, на новому сервері, simpy:
sudo su - postgres
psql new_database_name < dump.sql
для передачі файлу dump.sql між сервером я просто використав "cat" для друку вмісту, а потім "nano", щоб відтворити його копіюючи вміст.
Крім того, ROLE, який я використовував у двох базах даних, був різним, тому мені довелося знайти-замінити все ім’я власника на дамп.
Вивантажте свою базу даних: pg_dump database_name_name > backup.sql
Імпортуйте свою базу даних назад: psql db_name < backup.sql
Дозвольте мені поділитися сценарієм оболонки Linux, щоб скопіювати ваші таблиці таблиці з одного сервера на інший PostgreSQL-сервер.
Сценарій оболонки Bash Shell для міграції даних між 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"
Я просто мігрую дані; будь ласка, створіть порожню таблицю на вашому цільовому / другому сервері баз даних.
Це скрипт утиліти. Крім того, ви можете змінити сценарій для загального використання чимось, додавши параметри для імені хоста, імені бази даних, імені таблиці та інших
Прийнята відповідь правильна, але якщо ви хочете уникнути інтерактивного введення пароля, ви можете скористатися цим:
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}}