Постгреси вивантажують лише частини таблиць для знімка розробника


95

У виробництві наша база даних розміром становить кілька сотень гігабайт. Для розробки та тестування нам потрібно створити знімки цієї бази даних, які є функціонально еквівалентними, але мають розмір лише 10 або 20 гігів.

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

Наприклад, скажімо, у нас є суб'єкти, які мають ці багатозахисні відносини:

  • Компанія має N підрозділів
  • Відділ має N працівників
  • Співробітник має N записів відвідувачів

Існує може бути 1000 компаній, 2500 підрозділів, 175000 співробітників і десятки мільйонів записів про відвідування. Ми хочемо, щоб повторний спосіб витягнути, скажімо, перші 100 компаній та всі його підрозділи, службовців та записи відвідувань .

В даний час ми використовуємо pg_dump для схеми, а потім запускаємо pg_dump за допомогою --disable-triggers та --data-only, щоб отримати всі дані з менших таблиць. Нам не хочеться писати спеціальні сценарії, щоб витягнути частину даних, оскільки у нас швидкий цикл розробки, і ми маємо занепокоєння, що спеціальні сценарії були б крихкими і, ймовірно, застарілими.

Як ми можемо це зробити? Чи є сторонні інструменти, які можуть допомогти витягнути з бази даних логічні розділи? Як називаються ці інструменти?

Будь-яка загальна порада також високо оцінена!

Відповіді:


108

На великих таблицях ви можете використовувати команду COPY, щоб витягнути підмножини ...

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

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


Я використовував цю техніку з великим успіхом, щоб зробити те саме, що і ОП. Для тестових запусків я завантажив обмежені дані COPY (SELECT ..) TO в базу даних «шаблон» і використав CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX. Я, звичайно, зменшив дані до мінімуму, тому завантажений знімок продукту та тестові операції створення db є досить швидкими, щоб не стати перешкодою для команди.
Трей

5
Чи є якийсь спосіб зробити цю роботу, якщо у вас є кілька об'єднаних таблиць, для яких потрібно зробити знімки? COPY FROM не підтримує імпорт кількох таблиць.
mlissner

1
Ти людина ... Це робить для мене такі речі легкими, але з іншою метою. Я використовував це для переміщення даних із загальнодоступної схеми до певної користувальницької схеми в додатку для кількох орендарів. Дякую !
Джеремі Ф.

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

1
Мені довелося використовувати і \copyзамість цього COPY, тому що останній був лише суперпопулярним. На щастя, все інше спрацювало чудово, без інших змін 9.1.
PJSCopeland

8

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

  1. Заново створіть усі таблиці в окремій схемі, після чого скопіюйте в ці таблиці лише той підмножина даних, яку ви хочете скинути, використовуючи INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...та скидаючи це.

  2. Напишіть власний скрипт для демпінгу даних у вигляді SQL-операторів. Раніше я використовував такий підхід, і він займав лише щось на зразок 20-30 рядків PHP.

  3. Змініть pg_dump, щоб він приймав умову разом із перемикачем -t при скиданні однієї таблиці.


6

http://jailer.sourceforge.net/ робить це.


12
Хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
талонії

3
Це насправді не має сенсу. ОП запитувала конкретно назви сторонніх інструментів, які це роблять. Отже, суть відповіді полягає лише в тому, що "за цією URL-адресою стоїть сторонній інструмент під назвою" Jailer ". Саме посилання забезпечує всю необхідну інформацію; більше нічого додати. Якщо це посилання перестане працювати, з URL-адреси можна легко зробити висновок про те, що "програма називається Jailer", тому було б зайвим додати це.
Пол Легато

2
Звичайно, зараз посилання розірвано, і в Google немає альтернативи.
Owensmartin

1
Зараз посилання працює для мене, і Googling для " тюремних поштових повідомлень " з'явився і на github.com/Wisser/Jailer .
Пол Легато

8
Можливо, якщо ви додали корисний опис howвикористання цього інструменту, ми зможемо зрозуміти, як він досягає мети
Брайан Еш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.