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


10

У нас есть относительно большой объем производства на базе базы данных Postgres: ~ 20 ГБ. База данных PostgreSQL размещена на heroku.

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

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

~ 100 строк из каждой таблицы в базе данных будет достаточно. Есть ли простой способ сделать это?


1
Просто из любопытства, почему 20 ГБ слишком много места на диске? У меня есть 100 ГБ, выделенных на моем тестовом диске на моей виртуальной машине, для чистого пространства базы данных.
Jcolebrand

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

1
Справедливо, но, тем не менее, я призываю вас проявить творческий подход. Рассмотрим SD-карту для размещения в слоте SD, так как у меня никогда не было проблем с наличием большего количества данных :-), но это отстой: - \ мой личный ноутбук дошел до последних 10 ГБ.
Jcolebrand

Ответы:


3

Я не использовал этот инструмент, но Jailer обещает сделать именно это

Подмножество базы данных и инструмент просмотра. Экспортирует согласованные, ссылочно-неповрежденные наборы строк из реляционных баз данных (JDBC)

http://sourceforge.net/projects/jailer/


1

Тюремщик может помочь в этой ситуации. Я работаю над тем же, что и у вас (пытаясь получить ~ 100 записей каждой таблицы), и вот шаги, которые я сделал: - Найти корневой объект (тот, который связан почти с таблицами) и получить подмножество записей корневая строка (например, root is people, тогда я буду искать все связанные записи с people.id = 1 ...) - После завершения шага 1 снова начните с другой таблицы (той, в которой вы хотели бы иметь 100 записей ) и получить его подмножество из результата выше.


1

Другим вариантом является то , что я только недавно наткнулся ( как должное, я еще использовать его, но план в ближайшее время ): rdbms-subsetter.

Это немного проще и легче, чем Jailer, с несколькими приятными особенностями / преимуществами:

  • CLI так легко подключить к существующим инструментам
  • Открытый исходный код
  • Будет следовать внешним ключам для получения согласованного набора данных
    • Если у вас нет четко определенных внешних ключей, отношения могут быть предоставлены через файл конфигурации JSON. В моем случае я планирую создать этот конфиг из метаданных схемы, хранящихся в другом месте (спасибо, Rails: \)
  • Вы можете настроить таргетинг на конкретную строку и получить все связанные записи (например, у конкретного клиента есть проблемы, поэтому вы можете сделать все, чтобы данные его учетной записи были доступны локально)
  • Может потребоваться постоянное количество записей в таблице или логарифм, чтобы получить больше данных из больших таблиц без лишних затрат.

Стоит упомянуть еще один вариант для баз данных Heroku, который я часто использовал (как я там работал).

На самом деле Heroku довольно быстро выводит на экран новую БД с моментальными снимками, поскольку сначала она готовит журналы упреждающей записи, затем подключается к основной БД, чтобы наверстать упущенное, а затем перестает следовать за ней. Вы можете создавать эти «вилки» в разных приложениях, чтобы не слишком сильно влиять на работу:

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

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

В приведенной выше команде, если у вас есть БД, доступная с помощью DATABASE_URLon your-production-app, вы получите БД, доступную с PRODUCTION_SNAPSHOT_URL(если вы указали --as) в другом приложении с именем some-other-app-to-own-forked-database.


0

Чтобы получить случайный набор строк, вы можете использовать LIMIT следующим образом:

SELECT * FROM my_table LIMIT 100

Это самый простой способ, он просто выберет 100 первых строк, с которыми столкнулся PostreSQL. Это может быть 100 последних вставленных или, возможно, 100 первых. Если вам нужно что-то действительно случайное, посмотрите на этот ответ Stackoverflow .


Спасибо за попытку помочь, но это не отвечает на мой вопрос.
Jottr

Я знаю, как ограничить свой выбор. Моя проблема в том, что мне нужен какой-то способ клонировать БД из heroku с подмножеством его данных; Сбросить всю базу данных, как описано в руководстве к HeroKUS, не вариант.
Jottr

1
@elementz - Есть ли причина, по которой вы не можете просто перебрать таблицы и скопировать (SELECT ... LIMIT 100) в «имя файла» ...? Можете ли вы не скопировать в Heroku?
rfusca

@rfusca - я не знал, что COPY TO существует. Я постараюсь доложить.
Jottr

3
@rfusca: использование простого LIMITне справится с ссылками FK. Например: 100 строк из таблицы заказов могут содержать клиентов, которых нет при экспорте 100 строк из таблицы клиентов.
a_horse_with_no_name
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.