Дамп Postgres только части таблиц для снэпшота разработчика

97

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

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

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

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

Есть около 1000 компаний, 2500 подразделений, 175 000 сотрудников и десятки миллионов записей о посещаемости. Нам нужен воспроизводимый способ получения, скажем, первых 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

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

Бен
источник
1
Я использовал эту технику с большим успехом, чтобы сделать то же самое, что и OP. Для тестовых прогонов я загрузил данные COPY (SELECT ..) TO .. ​​с ограничениями в "шаблонную" базу данных и использовал CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX. Я, конечно, сократил данные до минимума, чтобы загрузить моментальный снимок продукта и проверить операции создания базы данных достаточно быстро, чтобы не мешать команде.
Trey
5
Есть ли способ заставить это работать, если у вас есть несколько объединенных таблиц, снимки которых вы хотите сделать? COPY FROM не поддерживает импорт нескольких таблиц.
mlissner 06
1
Ты мужчина ... Это упрощает мне жизнь, но для другой цели. Я использовал его для перемещения данных из общедоступной схемы в пользовательскую схему в мультитенантном приложении. Благодарность !
Джереми Ф.
5
Обратите внимание, что этот метод не обновляет последовательности в скопированных таблицах, поэтому дальнейшие вставки могут нарушить ограничения первичного ключа.
user2859458
1
Мне пришлось использовать \copyвместо него COPY, потому что последний был доступен только суперпользователю. К счастью, все остальное работало отлично, без каких-либо других изменений в 9.1.
PAOopeland
8

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

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

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

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

Александр Кметек
источник
5

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

Пол Легато
источник
13
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится.
talonmies
3
В этом нет никакого смысла. OP специально запросил имена сторонних инструментов, которые это делают. Таким образом, суть ответа сводится к следующему: «По этому URL-адресу существует сторонний инструмент под названием« Jailer », который делает это». Сама ссылка предоставляет всю необходимую информацию; больше нечего добавить. Если эта ссылка перестает работать, из URL-адреса можно легко вывести, что «программа называется Jailer», поэтому добавлять это было бы излишним.
Пол Легато
2
Конечно, сейчас ссылка не работает, и Google не находит альтернативы.
owensmartin
1
Ссылка в настоящее время у меня работает, и поиск в Google для "jailer postgres" тоже нашел github.com/Wisser/Jailer .
Пол Легато
8
Возможно, если вы добавите полезное описание того, howкак используете этот инструмент, мы сможем понять, как он достигает цели
Брайан Эш