Лучшая практика копирования / обновления на основе мультисистемной базы данных - PullRequest
0 голосов
/ 29 августа 2018

поэтому после поиска и не нахождения похожих случаев я хочу открыть новый вопрос. Итак, вот случай: Мы работаем с большой базой данных с очень сложной структурой данных. Кроме того, мы работаем над несколькими системами, чтобы обеспечить стабильность (разработку, тестирование, качество и производительность), и всегда приходится бороться за перемещение данных между этими системами. Как я уже сказал, структура данных очень велика, и внутри базы данных также много логики. Клиенты могут добавлять новые части данных в качестве конфигурации, а также имеется статический доход от данных, которые используются для статистики и мониторинга. Итак, позвольте мне объяснить проблему на небольшом примере:

enter image description here

Давайте возьмем эту базу данных в качестве примера. У нас есть несколько семей, которые проводят соревнования друг с другом. И они создадут некоторую статистику о заработанных ими баллах.

  • Фиолетовые таблицы являются фиксированными конфигурациями. Они создаются один раз и могут быть изменены только через оператора. Эти изменения будут сначала выполнены и протестированы в системе разработки.
  • Желтые таблицы меняют конфигурации. Каждая семья может создавать или удалять несколько конкурсов и назначать своих детей.
  • Красная таблица - это просто данные. Каждый раз, когда ребенок зарабатывает очки, добавляется новая строка с указанием суммы и текущего времени, а также отношения к ребенку и соревнованиям. Эта таблица будет основой для более поздней статистики.

Эта база данных разработана на двух продуктивных системах: семействе и системе разработки, используемой программистами / операторами.

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

  • Необходимо скопировать новые / проверенные / исправленные семейства из разработки в продуктивную систему.
  • Также необходимо копировать Contests, Contest-Kid-Assignments и Points из продуктивного в систему разработки, чтобы найти новые ошибки.
  • Также должна быть возможность изменить структуру таблицы в системе разработки и передать это изменение в производительную систему. (Это не должно быть главной темой здесь, иногда это могут быть такие большие изменения, что просто не существует легкого пути, поэтому давайте оставим этот пункт простым, но помните об этом.)

Я хочу скопировать части таблиц в другую систему, но иметь возможность игнорировать некоторые таблицы (например, «Точки»), и я хочу убедиться, что дети не копируются без родительского семейства, поэтому в них нет объекта «без родителей». база данных.

Вопрос: Что было бы хорошим и безопасным способом сделать это?

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

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

Также многие разработчики, которых я знаю, просто копируют всю базу данных (делают резервную копию и запускают ее на другой сервер), но это также создает проблемы: пользователи копируются, и их guid меняются, поэтому они теряют разрешения и т. Д. Не думаю, что это хорошее решение. Кроме того, база данных не работает в течение достаточно долгого времени, и это никогда не гладкий процесс.

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

Так что я надеюсь, что кто-то знает инструмент или что-то подобное, чтобы помочь мне.

1 Ответ

0 голосов
/ 29 августа 2018

Добро пожаловать на старания разработки для такого государства, как база данных. :) RedGate создает инструмент под названием «Контроль исходного кода SQL», который подходит для перемещения измененных данных и схемы в рабочую среду и может взаимодействовать с решениями по управлению исходными кодами, такими как GIT. Это немного дорого, но это лучшее, что я нашел. Один из вариантов для того, чтобы держать dev в актуальном состоянии с помощью данных о продуктах и ​​изменениях в dev, я придумал на своем последнем месте работы, который был ... не на 100% идеальным, но лучше, чем ничего, и бесплатным. Он был разработан в Powershell и работал примерно так:

  1. Создание сценариев SQL Pre-restore, Pre-dacpac и Post-dacpac для хранения данных и Различия разрешений между dev и prod
  2. Используйте SQLPackage.EXE для создания DacPac of Dev (Dacpac - это, по сути, XML-схема db, нет данные)
  3. Выполнить процедуру предварительного восстановления (часто копируя тестовые данные, которые необходимо сохранить)
  4. Восстановить Prod over Dev
  5. Выполнить сценарий Pre-dacpac (любой DDL, который может привести к потере данных, может потребоваться перейти сюда)
  6. Используйте SQLPackage.EXE для применения DacPac, созданного на шаге 2, к вновь восстановленной базе данных
  7. Выполнить сценарий Post-Dacpac (Права, восстановление данных, скопированных на шаге 3)

Опять же, как я уже сказал, это сработало и автоматизировало восстановление данных продукта в нашу среду разработки, сохранив при этом наши изменения разработчика без изменений, но потребовалось немало поддержки и обслуживания. Кроме того, имейте в виду, что после того, как ваша БД достигнет определенного размера, ночное восстановление больше не является жизнеспособным вариантом из-за времени, которое требуется для восстановления.

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