Як я можу експортувати підмножину табличних даних із бази даних виробництва у свою локальну базу даних тестування?


10

У нас відносно великі виробничі постгреси на базі db: ~ 20 Гб. База даних PostgreSQL розміщується на героїці.

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

Я не хочу самостійно генерувати вибіркові дані, а скоріше використовую дані, які вже існують у виробничому середовищі.

~ 100 рядків з кожної таблиці в базі даних буде достатньо. Чи є простий спосіб досягти цього?


1
Щойно з цікавості, чому 20 ГБ занадто багато місця на диску? У мене на тестовому диску на моєму VM виділено 100 ГБ просто місця для нуля в БД.
jcolebrand

Оскільки я іноді не ношу із собою зовнішній hd, мій ssd просто не забезпечує достатньо місця. Плюс мені справді потрібні лише вибіркові дані з мого db, а не з цілого db.
Jottr

1
Досить справедливо, але все-таки я закликаю вас проявляти творчість. Подумайте, як SD-карта підходить до слота для SD, оскільки у мене ніколи не виникало проблем із тим, щоб мати більше даних :-), але це все одно: - \ мій особистий ноутбук знижений до останнього безкоштовного 10 Гб.
jcolebrand

Відповіді:


3

Я не використовував цей інструмент, але Джейлер обіцяє зробити саме це

Інструмент підстроювання та перегляду баз даних. Експорт послідовних, референційно неушкоджених наборів рядків із реляційних баз даних (JDBC)

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


1

Тюремник може допомогти в цій ситуації. Я працюю над тією самою, що і ваша (намагаюся отримати ~ 100 записів кожної таблиці), і ось такі кроки я зробив: - Знайдіть кореневу сутність (ту, що пов'язана майже з таблицями) та отримайте підмножину записів кореневий рядок (наприклад, root - люди, тоді я шукатиму всі пов’язані записи на 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_URLна 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 останніх вставлених або, можливо, перший перший. Якщо вам потрібно щось дійсно випадкове, подивіться цю відповідь Stackoverflow .


Дякую за спробу допомогти, але це не відповідає на моє запитання.
Jottr

Я знаю, як обмежити свій вибір. Моя проблема полягає в тому, що мені потрібен якийсь спосіб клонувати db з heroku з підмножиною його даних; Скидання цілого дБ, як описано в посібнику з герокусу , не є можливим.
Jottr

1
@elementz - Чи є причина, що ви не можете просто перекинути таблицю та КОПІРУВАТИ (ВИБІРТЕ ... ГРОМУВАННЯ 100) НА "ім'я файлу" ...? Ви не можете КОПУТАТИ в Хероку?
rfusca

@rfusca - я не знав, що КОПІЯ існує. Я спробую звітувати.
Jottr

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