На производстве размер нашей базы данных составляет несколько сотен гигабайт. Для разработки и тестирования нам необходимо создать моментальные снимки этой базы данных, которые функционально эквивалентны, но имеют размер всего 10 или 20 гигабайт.
Проблема в том, что данные наших бизнес-структур разбросаны по множеству таблиц. Мы хотим создать своего рода отфильтрованный снимок, чтобы в дамп были включены только некоторые объекты. Таким образом, мы можем получать свежие снимки примерно раз в месяц для разработки и тестирования.
Например, предположим, что у нас есть сущности, которые имеют эти отношения «многие ко многим»:
- Компания имеет N подразделений
- В подразделении N сотрудников
- У сотрудника N записей о посещаемости
Есть около 1000 компаний, 2500 подразделений, 175 000 сотрудников и десятки миллионов записей о посещаемости. Нам нужен воспроизводимый способ получения, скажем, первых 100 компаний и всех входящих в них подразделений, сотрудников и учетных записей посещаемости .
В настоящее время мы используем pg_dump для схемы, а затем запускаем pg_dump с --disable-triggers и --data-only, чтобы получить все данные из меньших таблиц. Мы не хотим писать пользовательские сценарии для извлечения части данных, потому что у нас быстрый цикл разработки и мы обеспокоены тем, что пользовательские сценарии будут хрупкими и, вероятно, будут устаревшими.
Как мы можем это сделать? Существуют ли сторонние инструменты, которые могут помочь извлечь логические разделы из базы данных? Как называются эти инструменты?
Также приветствуются любые общие советы!
источник
\copy
вместо негоCOPY
, потому что последний был доступен только суперпользователю. К счастью, все остальное работало отлично, без каких-либо других изменений в 9.1.Я не знаю ни одного программного обеспечения, которое уже делает это, но могу придумать 3 альтернативных решения. К сожалению, все они требуют определенного кода.
Воссоздайте все таблицы в отдельной схеме, затем скопируйте в эти таблицы только подмножество данных, которые вы хотите сбросить, используя
INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...
и выгрузив их.Напишите свой собственный сценарий для сброса данных в виде операторов SQL. Я использовал этот подход в прошлом, и потребовалось всего около 20-30 строк PHP.
Измените pg_dump так, чтобы он принимал условие вместе с переключателем -t при выгрузке одной таблицы.
источник
http://jailer.sourceforge.net/ делает это.
источник
how
как используете этот инструмент, мы сможем понять, как он достигает цели