Копіювання бази даних PostgreSQL на інший сервер


492

Я хочу скопіювати виробничу базу даних PostgreSQL на сервер розробки. Який найшвидший, найпростіший спосіб зробити це?

Відповіді:


666

Вам не потрібно створювати проміжний файл. Ви можете зробити

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 або просто трубу: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel

4
Якщо ви використовуєте bzip2, вимкніть компресію ssh, щоб пришвидшити передачу!
lzap

8
Як я можу працювати стиснутим, якщо витягую дані з виробництва вниз у розвиток? Я встановив з'єднання SSH від розвитку до виробництва. Так було б ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Jeromy French

2
Я б очікував, що ви зможете скопіювати віддалену базу даних з ім'ям x у локальну базу даних з ім'ям y, але рішення Феррана для цього не працює ... Мені здається, що рішення 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" RENAME TO "y"'
Darin Peterson

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 host -U ім'я користувача db_name <dump_schema_and_data_file
Ali Raza 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

Якщо ви хочете мігрувати між версіями (наприклад, ви оновили поштові адреси та у вас 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=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
Швидше за все, щоразу, коли ви оновлюєте свою базу даних, ви оновлюєте її на розробниках та інсценуваннях, перш ніж робити це на виробництві.
andrew lorien

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 (), який інакше не працював би для мене :(

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

sudo su - postgres
psql new_database_name < dump.sql

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

Крім того, ROLE, який я використовував у двох базах даних, був різним, тому мені довелося знайти-замінити все ім’я власника на дамп.


6

Вивантажте свою базу даних: pg_dump database_name_name > backup.sql


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


5

Дозвольте мені поділитися сценарієм оболонки 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"

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

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


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.