PostgreSQL: Як створити повну копію схеми бази даних в одній базі даних?


26

Як я можу скопіювати свою publicсхему в ту саму базу даних із повною структурою таблиці, даними, функціями, fk, pk тощо.
Моя версія Postgres становить 8,4
PS мені потрібно скопіювати схему НЕ базу даних


У вас є більше схем чи тільки public?
a_horse_with_no_name

У мене є громадські та демонстраційні схеми. І мені потрібно скопіювати демо для створення демо-рахунку ...

Це було б зручною справою.
Куберчаун

Відповіді:


19

Немає простого способу зробити це в самому pg_dump / pg_restore. Ви можете спробувати наступне, якщо ви зможете тимчасово видалити базу даних.

  1. Візьміть дамп вашої загальнодоступної схеми за допомогою pg_dump
  2. запустіть "ALTER SCHEMA public RENAME TO public_copy"
  3. Відновіть дамп вашої загальнодоступної схеми з кроку 1 за допомогою pg_restore

як я можу отримати доступ до pg_dump та pg_restore через PHP?

Це залежить від того, де ви працюєте з базою даних. Ви можете отримати доступ до pg_dump та pg_restore з оболонки на своєму сервері. Якщо у вас немає доступу до оболонки, ви можете спробувати використовувати PHPs shell_exec , інакше вам потрібно буде вивчити альтернативний метод резервного копіювання, можливо, використовуючи інструмент GUI PostgreSQL

1
+1 Це найрозумніше рішення поки що. Команда Shell буде виглядати приблизно так ( більше в керівництві ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Найпростіше, як суперпользователь ( postgres), без peerавторизації в pg_haba.conf. Відновлення після перейменування оригінальної схеми: psql my_db -f '/path/to/file.pgsql'. Якщо у вас є звичайний дамп SQL, вам це не потрібно pg_restore.
Ервін Брандстеттер

Є простий спосіб, дивіться мою відповідь. pg_dump підтримує перемикач -n для вибору схеми. Потім просто відредагуйте назву схеми на дамп і перезавантажте.
Скотт Марлоу

2
Просто перейменувавши схему, не буде оновлено посилання всередині функцій: gist.github.com/pschultz/5387172 . Заміна імені на дамп є набагато надійнішим, якщо ви шукаєте пошук і замінюєте правильно.
Пітер

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

Якщо ви застрягли в php, тоді використовуйте будь-які тики

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

або команда exec (). Для зміни ви можете використовувати sed таким же чином.

Ось ще 6 символів


1
безпечніше перейменовувати схему та завантажувати резервну копію вихідної схеми, особливо коли ім'я схеми може відображатися як вміст (наприклад public).
artm

7

За допомогою pgAdmin можна зробити наступне. Це досить керівництво, але може бути все, що вам потрібно. Підхід на основі сценарію був би набагато бажанішим. Не впевнений, наскільки добре це буде працювати, якщо у вас немає доступу адміністратора і якщо ваша база даних велика, але ви повинні працювати чудово на базі даних про розробку, яку ви просто маєте на локальному комп'ютері.

  1. Клацніть правою кнопкою миші назву схеми, яку потрібно скопіювати, і натисніть Резервне копіювання. (Ви можете піти глибше, ніж це, і вибрати просто резервне копіювання структури замість обох).

  2. Дайте ім’я файлу резервного копіювання, а також виберіть формат. (Я зазвичай використовую Тар.)

  3. Натисніть Резервне копіювання.

  4. Клацніть правою кнопкою миші схему, з якої ви створили резервну копію, і натисніть властивості та тимчасово перейменуйте її на щось інше. (напр. temprename )

  5. Клацніть корінь схеми та клацніть правою кнопкою миші в браузері об’єктів, а потім натисніть кнопку Створити нову схему та надайте схемі ім'я загальнодоступним . Це буде схема, яку ви копіюєте з резервної копії.

  6. Клацніть правою кнопкою миші нову загальнодоступну схему на кроці 5. та натисніть кнопку "Відновити". Відновити з резервного файлу на кроці 3.

  7. Перейменуйте нову загальнодоступну схему на іншу назву (наприклад, новина ).

  8. Перейменуйте схему зміни режиму перейменування від кроку 4 до початкового імені.


Нова схема, створена на кроці 5, повинна мати те саме ім’я, що і резервна копія схеми, інакше pgAdmin не відновить нічого.
Cao Minh Tu

5

Ви можете використовувати

CREATE DATABASE new_db TEMPLATE = old_db;

Потім відкиньте всі схеми, які вам не потрібні:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

Єдиним недоліком є ​​те, що всі підключення до old_db повинні бути визначені, перш ніж ви зможете створити копію (таким чином, процес, який виконує CREATE DATABASE оператор, повинен підключитися, наприклад, до template1)

Якщо це не варіант, pg_dump / pg_restore - єдиний спосіб зробити це.


1
Перш ніж задати це питання, я використав аналогічний метод клонування бази даних. Але це витрачає багато часу, і я думаю, що клонування тільки схеми відбувається набагато швидше ...

@sigra: метод клонування a_horse - це найшвидший доступ до баз даних, оскільки фактичні файли можна просто скопіювати, що економить багато накладних витрат. Я сумніваюсь, що скидання і перезавантаження схеми буде швидше, якщо схема не буде лише невеликою частиною цілого db. Отже, +1 на цю відповідь, навіть якщо вона не відповідає фактичному заданому запитанню.
Ервін Брандстеттер

Це дуже багато роботи для клонування однієї схеми. скидання схеми, перейменування її на дамп і перезавантаження набагато швидше.
Скотт Марлоу

@ScottMarlowe: залежить від того, яка найбільша схема. Якщо найбільший - це один із скинутих, то так, я згоден.
a_horse_with_no_name

2

розширення на відповідь користувача1113185 , ось повний робочий процес за допомогою psql / pg_dump.

Нижче експортуються всі об'єкти old_schemaта імпортуються їх у нову new_schemaсхему, як user, у dbnameбазі даних:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.