Дамп Postgres только частей таблиц для моментального снимка dev

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

Проблема состоит в том, что данные для наших бизнес-объектов разбросаны по многим таблицам. Мы хотим создать какой-то фильтрованный снимок, чтобы в дампе были включены только некоторые из объектов. Таким образом, мы можем получать свежие снимки каждый месяц или около того для разработчиков и тестирования.

Например, предположим, что у нас есть сущности, которые имеют эти отношения "многие-ко-многим":

  • Компания имеет N отделов
  • Отдел имеет N сотрудников
  • Сотрудник имеет N записей о посещаемости.

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

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

Как мы можем это сделать? Существуют ли сторонние инструменты, которые могут помочь вывести логические разделы из базы данных? Что называются этими инструментами?

Любой общий совет также оценили!

Ответ 1

На больших таблицах вы можете использовать команду 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

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

Ответ 2

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

  • Восстановите все таблицы в отдельной схеме, а затем скопируйте в эти таблицы только подмножество данных, которые вы хотите сбросить, используя INSERT INTO copy.tablename SELECT * FROM tablename WHERE ... и выгрузите это.

  • Напишите свой собственный script для сброса данных в виде операторов SQL. Я использовал этот подход в прошлом, и он занимал примерно 20-30 строк PHP.

  • Измените pg_dump, чтобы он принимал условие вместе с ключ -t при сбросе отдельной таблицы.