powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Теория: синхронизация структуры БД на двух машинах
15 сообщений из 15, страница 1 из 1
Теория: синхронизация структуры БД на двух машинах
    #33779885
Обычно разработка сайта ведется на некоторой тестовой машине (машинах), со своей собственной, тестовой БД, а затем уже, когда происходит очередная выкладка, изменения переносятся на "реальный сервер". Реальный сервер имеет очень похожую конфигурацию: там тоже есть БД, причем структура этой БД должна совпадать со структурой тестовой БД.

Довольно хорошо известно, что в общем случае, имея 2 версии структуры одной и той же БД, невозможно автоматически их синхронизировать между собой. Например, мы на тестовой базе переименовали некоторое поле. Как синхронизатор поймет, что произошло: переименование, лил удаление поля + создание нового с другим именем? Ситуация еще более усложняется при наличии связей с внешними ключами.

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

Внимимание: здесь схема существенно отличается от схемы работы с исходными кодами сайта, когда обновление их элементарно производится через CVS. Получается, у нас 2 сущности: исходники и БД, причем последняя очень плохо поддается версионности (а уж об откате к предыдущей версии вообще и говорить не приходится). Хотелось бы хотя бы чуть-чуть приблизить их друг к другу.

Очень часто приходится видеть такую схему: ALTER-команды каждый разработчик логирует самостоятельно, а затем складывает их в CVS и обеспечивает версионность. Но такая схема очень сильно подвержена различного рода ошибкам, она неустойчива: достаточно 1 раз ошибиться, чтобы структуры баз начали отличаться, и отличие это мы уже найти не сможем, если база большая (или сможем, но с трудом).

Я думаю, это происходит потому, что задача решается не на том слое абстракции: логирование и версионность должен обеспечивать тот слой, который имеет наибольшую информацию о производимых изменениях. Этот слой - вовсе даже не разработчик и CVS, а сама СУБД. Она ведь прекрасно знает, какие операции над ней выполняются, и может их складировать, параллельно отслеживая версии.

Собственно, от самой СУБД хотелось бы иметь 2 команды в API:

1. get_current_version() - возвращает текущую версию структуры БД. С каждым новом ALTER-ом текущая версия увеличивается на 1.

2. get_diff_alters(from_version) - возвращает список ALTER-команд, выполненных над базой от версии from_version до текущей

Причем эта штука должна работать не на уровне лог-файлов запросов, а на уровне самой БД (потому что логи, во-первых, сваливают в кучу запросы для различных БД в пределах СУБД, а во-вторых, не парсятся легко).

Спрашивается, новы ли эти мысли, и реализовано ли что-то подобное хотя бы для одной из популярных СУБД? Конечно, прежде всего интересуют PostgreSQL и MySQL.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33779906
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий КотеровСпрашивается, новы ли эти мысли, и реализовано ли что-то подобное хотя бы для одной из популярных СУБД?
Никаких проблем. В моей реальности это называется "триггер на DDL". Вроде бы еще есть DDL AUDIT, что наверное более правильно, но с ним я не разбирался.

Дмитрий КотеровКонечно, прежде всего интересуют PostgreSQL и MySQL.
Увы.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33780222
-me-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
только DDL триггеры не очень помогут, например, в ситуации, когда создаем новый справочник, и меняем/добавляем поля в других таблицах - внешние ключи на данный справочник.
Т.е. кроме DDL, может возникнуть необходимость хранения и части DML, если изменения накатываются на рабочую базу, и в случае отката DROP COLUMN/TABLE.

Не проще ли записывать (разработчикам) все изменения схемы как последовательность SQL патчей , к примеру, можно использовать след. структуру каталогов/файлов:
Код: plaintext
1.
2.
3.
№_версии/backup.script -- создает down.sql
№_версии/up.sql -- переход к след.версии
№_версии/down.sql -- откат к предыдущей версии
т.е. каждое новое изменение сохраняется в новом каталоге с инкрементом названия(номера версии), старые скрипты остаются read-only.
??
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33780858
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Спрашивается, новы ли эти мысли

Нет.

> реализовано ли что-то подобное хотя бы для одной из популярных СУБД?

Нет. И хорошо, что не реализовано.

Эта проблема - версионность структуры данных - в общем случае должна решаться на уровне IDE или системы контроля версий, а не на уровне СУБД.

> исходники и БД, причем последняя очень плохо поддается версионности

А почему, позвольте поинтересоваться? ddl - точно такой же текстовый файл, как и другие исходники. Вы по религиозным соображениям не используете для разработки базы данных cvs или subversion?

> (а уж об откате к предыдущей версии вообще и говорить не приходится).

Почему?

> Хотелось бы хотя бы чуть-чуть приблизить их друг к другу.

Так а проблема-то в чем заключается? Как написал guest -me-, создаете новую версию базы данных, создаете update.sql (если необходимо). Все промежуточные версии сохранены, использовать можно любую из них.

> ALTER-команды каждый разработчик

Что значит "каждый разработчик"? У вас что, целая команда занимается проектированием базы данных? Если так, два варианта: либо пишется огромный продукт, либо работа построена неправильно. Если это действительно большой продукт, Ваш вопрос выглядит очень странно: предполагается, что команда разработчиков баз данных умеет пользоваться средствами коллективной работы. Если же база данных проектируется по остаточному принципу - могу Вам только посочувствовать. Кстати, заодно и оценить качество готового продукта. ;)

> не разработчик и CVS, а сама СУБД

Извините, это полная чушь.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33781118
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-me-Т.е. кроме DDL, может возникнуть необходимость хранения и части DML,
Безусловно. Но такие DML обычно оформляются набираемыми руками скриптами, так что с ними проще.

-me-Не проще ли записывать (разработчикам) все изменения схемы
Не проще, поскольку вносит существенную вероятность ошибки. Я вообще очень плохо отношусь к подходу "надо чтобы разработчики постоянно помнили о необходимости выполнения следующего списка тупых действий".
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33781168
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь по делу. В ситуации, когда разработчики (неважно сколько) руками формируют и выполняют скрипты на тестовой/боевой базе, сбои из-за человеческого фактора имхо практически неминуемы. Не знаю, насколько это критично при обновлении сайта, при "корпоративном" программировании это может вылиться в огромные проблемы. Как можно и нужно бороться с этой проблемой:

1. Использование CASE. Любой из этих инструментов как минимум умеет и готов генерировать те самые скрипты, которые нас интересуют, по крайней мере кроме дополнительных DML. А тот же Designer еще и сам по себе версионность поддерживает.

2. Наличие выделенного тестового стенда. "Игрушка тестеров", отличная от "игрушки разработчиков". У разработчиков может твориться что угодно, но тестовый стенд модифицируется только передаваемыми через VCS скриптами и тестируется именно то, что потом пойдет на боевую БД.

Если не столь радикально.... наверное, я бы сделал следующее. Я бы убрал у разработчиков возможность напрямую менять БД (то есть не давал бы им пароль на схему приложения). Вместо этого я бы дал им инструмент (хранимку, приложение итп), который выполнял бы передаваемые ему скрипты и фиксировал их.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33781204
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer, я охотно верю, что Вы обладаете навыками эксплуатации баз данных. Готов поверить, что Вы и Oracle знаете на хорошем уровне.

Но с проектированием у Вас (и с теоретической подготовкой, и с практической) - жуткие проблемы. Ничего личного, просто констатирую факт.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33781897
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer2. Наличие выделенного тестового стенда. "Игрушка тестеров", отличная от "игрушки разработчиков". У разработчиков может твориться что угодно, но тестовый стенд модифицируется только передаваемыми через VCS скриптами и тестируется именно то, что потом пойдет на боевую БД.
ИМХО жизненная необходимость. В тестовый стенд заливаются реальные данные и на них пытаемся провести изменения. Узнаем много интересного: новое ограничение уникальности/ внешний ключ не совместим с реальными данными. Вырабатываем решение по данным.
В этом основное отличие БД от программы - данные важнее.

Механическое воспроизведение DDL из лога вряд ли полезно. С тем же ограничением уникальности: добавили, подумали, изменили. Конечный результат OK, а промежуточный - см. выше.
Версию так или иначе должен зафиксировать разработчик. А дифф получить CASEом, типа в ERWin complete compare.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33783140
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRМеханическое воспроизведение DDL из лога вряд ли полезно.
Имхо вопрос в другом: нужно иметь гарантию, что на тестовом стенде и на реалке пройдут одинаковые действия. Практически, чтобы гарантировать это, необходим прогон одного и того же скрипта изменений.

ModelRА дифф получить CASEом, типа в ERWin complete compare.
Уже упоминалось, что это не всегда возможно.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33783412
-me-только DDL триггеры не очень помогут, например, в ситуации, когда создаем новый справочник, и меняем/добавляем поля в других таблицах - внешние ключи на данный справочник.
Т.е. кроме DDL, может возникнуть необходимость хранения и части DML, если изменения накатываются на рабочую базу, и в случае отката DROP COLUMN/TABLE.

Не проще ли записывать (разработчикам) все изменения схемы как последовательность SQL патчей , к примеру, можно использовать след. структуру каталогов/файлов:
Код: plaintext
1.
2.
3.
№_версии/backup.script -- создает down.sql
№_версии/up.sql -- переход к след.версии
№_версии/down.sql -- откат к предыдущей версии
т.е. каждое новое изменение сохраняется в новом каталоге с инкрементом названия(номера версии), старые скрипты остаются read-only.
??
Именно так и делается, однако кто должен генерировать up.sql и down.sql, если структуру БД меняютс сразу несколько разработчиков? В этом и заключается тема данного топика. Традиционно их пишет сам разработчик, либо вручную, либо же настроив свою IDE работы с БД на автоматическое логирование запросов. Однако данный метод, мне кажется, плох тем, что разработчиков и IDE много, а sql-скрипт - один. И гарантии, что каждое действие будет корректно залогировано, нет.

Вот вариант с "прокси запросов" для базы, который принимает запрос на изменение от разработчика, накатывает его на базу и тут же гарантировано логирует, уже гораздо лучше. Но - это, по сути, то же самое, что триггер на DDL.

С внешними ключами и уникальностью, действительно, проблемы, но - их можно решить, разрешив или даже заставив разработчикам вставлять команды на корректировку внешних ключей/уникальных полей при выполнении соответствующих alter-ов. Т.е. если система видит, что alter сужает домен, она заставляет выполнить update/delete перед этим.

На вопрос, почему проблема с версионностью базы, ответ простой: недостаточно просто пересоздать БД с нуля, нужно еще максимально сохранить данные, которые в ней имеются. Т.е. даже если мы в каждый момент времени имеем дампы структуры базы для любой версии, это нам ничего не дает - мы не можем автоматически перейти от одной версии к другой, сохранив данные.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33783831
-me-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гм, мне вот интересно, что значит "много разработчиков"? 2, 10, 100, или все кодеры Бангалора?
И что, все эти "много" сразу модифицируют основную схему, а не свой sandbox?

Щас я предложу дикий тупизм...
I. Должна быть одна центральная схема БД (current development), которую разработчики не могут изменить прямо.
II. У каждого разработчика -- свой локальный devel sandbox - БД, схему которой они вольны менять как им захочется,
а также test sandbox - БД, на которой проверяются работоспособность/совместимость.
Генерацию up.sql можно частично автоматизировать через журналирование DDL (а возможно и DML, по требованию) средствами IDE и/или DBMS.
Генерировать down.sql должен backup.script, сохраняя данные/структуру, которые будут изменены/удалены при выполнении up.sql.
backup.script частично может быть построен из анализа up.sql.

Но самая жопа, естественно, это внесение изменений в центральный репозиторий/схему.
И тут, ИМХО, при команде от разработчика commit changes должно происходить следующее:

1. Из центрального репозитория обновляются исходники данного разработчика до последней версии в репозитории;
(пере)создается его test sandox схема БД -- в соответствии с центральной, накатываются локальные изменения,
проведенные на devel sandbox и сохраненные в скриптах up.sql;
в случае конфликтов -- отложить commit до их разрешения.

2. Если обновление прошло удачно, то запускается набор тестов (unit/functional/regression/integration etc);
также проверяется корректность работы down.sql -- после последовательного наложения up.sql+down.sql схема/данные должны в точности соответствовать центральной;
в случае сбоя - отказ в commit.

3. Если все тесты прошли, вносим изменения в исходниках в центральный репозиторий, увеличиваем номер версии БД на 1,
сохраняем в каталоге новой версии БД файлы up.sql, backup.script, down.sql (на центр. сервере), накатываем на центр. базу новые изменения;
приводим локальную devel sandbox схему в соответствие с центральной, очищаем локальный журнал DDL;
commit завершен.

(Такая схема/последовательность действий вполне поддается автоматизации).

-----------------

Другой вариант -- при обновлении приложения выгрузить данные из "боевой" БД со старой схемой, пересоздать БД с новой схемой, внести "старые" данные в новую схему, преобразуя (если необходимо) их "на лету".
В некоторых случаях (к примеру, редкие, но существенные изменения) такой подход может также оказаться приемлимым.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33783914
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если у меня база 140 гигов?
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33783988
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык проблема всегда как раз в 140-ом:). Ну в 139-ом.
...
Рейтинг: 0 / 0
Теория: синхронизация структуры БД на двух машинах
    #33784633
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-me-II. У каждого разработчика -- свой локальный devel sandbox
Незачем. С одной стороны, девелоперы и в одной песочнице не особо друг другу мешают, с другой - запись, появившуюся на реалке в ключевом справочнике, замучаешься разносить по N игрушкам.

-me-а также test sandbox - БД, на которой проверяются работоспособность/совместимость.
Незачем. После того, как разработчик ее в первый раз сломает и не починит, она не нужна. А если давать всем, непочиненные заведомо будут и постепенно такими станут почти все.

Но самая жопа, естественно, это внесение изменений в центральный репозиторий/схему.

-me-И тут, ИМХО, при команде от разработчика commit changes должно происходить следующее:
А вот тут мы и приходим к игрушке тестеров, отдельной от игрушки программистов.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Теория: синхронизация структуры БД на двух машинах
    #36318427
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Теория: синхронизация структуры БД на двух машинах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]