Postgres дамп только частей таблиц для снимка dev - PullRequest
85 голосов
/ 17 ноября 2009

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

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

Например, скажем, у нас есть сущности, которые имеют эти отношения «многие ко многим»:

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

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

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

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

Любой общий совет также приветствуется!

Ответы [ 3 ]

96 голосов
/ 17 ноября 2009

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

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

5 голосов
/ 24 июля 2012

http://jailer.sourceforge.net/ делает это.

5 голосов
/ 17 ноября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...