|
|
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
Обычно разработка сайта ведется на некоторой тестовой машине (машинах), со своей собственной, тестовой БД, а затем уже, когда происходит очередная выкладка, изменения переносятся на "реальный сервер". Реальный сервер имеет очень похожую конфигурацию: там тоже есть БД, причем структура этой БД должна совпадать со структурой тестовой БД. Довольно хорошо известно, что в общем случае, имея 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 11:21 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
Дмитрий КотеровСпрашивается, новы ли эти мысли, и реализовано ли что-то подобное хотя бы для одной из популярных СУБД? Никаких проблем. В моей реальности это называется "триггер на DDL". Вроде бы еще есть DDL AUDIT, что наверное более правильно, но с ним я не разбирался. Дмитрий КотеровКонечно, прежде всего интересуют PostgreSQL и MySQL. Увы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 11:25 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
только DDL триггеры не очень помогут, например, в ситуации, когда создаем новый справочник, и меняем/добавляем поля в других таблицах - внешние ключи на данный справочник. Т.е. кроме DDL, может возникнуть необходимость хранения и части DML, если изменения накатываются на рабочую базу, и в случае отката DROP COLUMN/TABLE. Не проще ли записывать (разработчикам) все изменения схемы как последовательность SQL патчей , к примеру, можно использовать след. структуру каталогов/файлов: Код: plaintext 1. 2. 3. ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 12:33 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
> Спрашивается, новы ли эти мысли Нет. > реализовано ли что-то подобное хотя бы для одной из популярных СУБД? Нет. И хорошо, что не реализовано. Эта проблема - версионность структуры данных - в общем случае должна решаться на уровне IDE или системы контроля версий, а не на уровне СУБД. > исходники и БД, причем последняя очень плохо поддается версионности А почему, позвольте поинтересоваться? ddl - точно такой же текстовый файл, как и другие исходники. Вы по религиозным соображениям не используете для разработки базы данных cvs или subversion? > (а уж об откате к предыдущей версии вообще и говорить не приходится). Почему? > Хотелось бы хотя бы чуть-чуть приблизить их друг к другу. Так а проблема-то в чем заключается? Как написал guest -me-, создаете новую версию базы данных, создаете update.sql (если необходимо). Все промежуточные версии сохранены, использовать можно любую из них. > ALTER-команды каждый разработчик Что значит "каждый разработчик"? У вас что, целая команда занимается проектированием базы данных? Если так, два варианта: либо пишется огромный продукт, либо работа построена неправильно. Если это действительно большой продукт, Ваш вопрос выглядит очень странно: предполагается, что команда разработчиков баз данных умеет пользоваться средствами коллективной работы. Если же база данных проектируется по остаточному принципу - могу Вам только посочувствовать. Кстати, заодно и оценить качество готового продукта. ;) > не разработчик и CVS, а сама СУБД Извините, это полная чушь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 15:09 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
-me-Т.е. кроме DDL, может возникнуть необходимость хранения и части DML, Безусловно. Но такие DML обычно оформляются набираемыми руками скриптами, так что с ними проще. -me-Не проще ли записывать (разработчикам) все изменения схемы Не проще, поскольку вносит существенную вероятность ошибки. Я вообще очень плохо отношусь к подходу "надо чтобы разработчики постоянно помнили о необходимости выполнения следующего списка тупых действий". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 16:12 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
Теперь по делу. В ситуации, когда разработчики (неважно сколько) руками формируют и выполняют скрипты на тестовой/боевой базе, сбои из-за человеческого фактора имхо практически неминуемы. Не знаю, насколько это критично при обновлении сайта, при "корпоративном" программировании это может вылиться в огромные проблемы. Как можно и нужно бороться с этой проблемой: 1. Использование CASE. Любой из этих инструментов как минимум умеет и готов генерировать те самые скрипты, которые нас интересуют, по крайней мере кроме дополнительных DML. А тот же Designer еще и сам по себе версионность поддерживает. 2. Наличие выделенного тестового стенда. "Игрушка тестеров", отличная от "игрушки разработчиков". У разработчиков может твориться что угодно, но тестовый стенд модифицируется только передаваемыми через VCS скриптами и тестируется именно то, что потом пойдет на боевую БД. Если не столь радикально.... наверное, я бы сделал следующее. Я бы убрал у разработчиков возможность напрямую менять БД (то есть не давал бы им пароль на схему приложения). Вместо этого я бы дал им инструмент (хранимку, приложение итп), который выполнял бы передаваемые ему скрипты и фиксировал их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 16:23 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
softwarer, я охотно верю, что Вы обладаете навыками эксплуатации баз данных. Готов поверить, что Вы и Oracle знаете на хорошем уровне. Но с проектированием у Вас (и с теоретической подготовкой, и с практической) - жуткие проблемы. Ничего личного, просто констатирую факт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 16:33 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
softwarer2. Наличие выделенного тестового стенда. "Игрушка тестеров", отличная от "игрушки разработчиков". У разработчиков может твориться что угодно, но тестовый стенд модифицируется только передаваемыми через VCS скриптами и тестируется именно то, что потом пойдет на боевую БД. ИМХО жизненная необходимость. В тестовый стенд заливаются реальные данные и на них пытаемся провести изменения. Узнаем много интересного: новое ограничение уникальности/ внешний ключ не совместим с реальными данными. Вырабатываем решение по данным. В этом основное отличие БД от программы - данные важнее. Механическое воспроизведение DDL из лога вряд ли полезно. С тем же ограничением уникальности: добавили, подумали, изменили. Конечный результат OK, а промежуточный - см. выше. Версию так или иначе должен зафиксировать разработчик. А дифф получить CASEом, типа в ERWin complete compare. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 20:09 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
ModelRМеханическое воспроизведение DDL из лога вряд ли полезно. Имхо вопрос в другом: нужно иметь гарантию, что на тестовом стенде и на реалке пройдут одинаковые действия. Практически, чтобы гарантировать это, необходим прогон одного и того же скрипта изменений. ModelRА дифф получить CASEом, типа в ERWin complete compare. Уже упоминалось, что это не всегда возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 13:13 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
-me-только DDL триггеры не очень помогут, например, в ситуации, когда создаем новый справочник, и меняем/добавляем поля в других таблицах - внешние ключи на данный справочник. Т.е. кроме DDL, может возникнуть необходимость хранения и части DML, если изменения накатываются на рабочую базу, и в случае отката DROP COLUMN/TABLE. Не проще ли записывать (разработчикам) все изменения схемы как последовательность SQL патчей , к примеру, можно использовать след. структуру каталогов/файлов: Код: plaintext 1. 2. 3. ?? Именно так и делается, однако кто должен генерировать up.sql и down.sql, если структуру БД меняютс сразу несколько разработчиков? В этом и заключается тема данного топика. Традиционно их пишет сам разработчик, либо вручную, либо же настроив свою IDE работы с БД на автоматическое логирование запросов. Однако данный метод, мне кажется, плох тем, что разработчиков и IDE много, а sql-скрипт - один. И гарантии, что каждое действие будет корректно залогировано, нет. Вот вариант с "прокси запросов" для базы, который принимает запрос на изменение от разработчика, накатывает его на базу и тут же гарантировано логирует, уже гораздо лучше. Но - это, по сути, то же самое, что триггер на DDL. С внешними ключами и уникальностью, действительно, проблемы, но - их можно решить, разрешив или даже заставив разработчикам вставлять команды на корректировку внешних ключей/уникальных полей при выполнении соответствующих alter-ов. Т.е. если система видит, что alter сужает домен, она заставляет выполнить update/delete перед этим. На вопрос, почему проблема с версионностью базы, ответ простой: недостаточно просто пересоздать БД с нуля, нужно еще максимально сохранить данные, которые в ней имеются. Т.е. даже если мы в каждый момент времени имеем дампы структуры базы для любой версии, это нам ничего не дает - мы не можем автоматически перейти от одной версии к другой, сохранив данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 14:20 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
Гм, мне вот интересно, что значит "много разработчиков"? 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 завершен. (Такая схема/последовательность действий вполне поддается автоматизации). ----------------- Другой вариант -- при обновлении приложения выгрузить данные из "боевой" БД со старой схемой, пересоздать БД с новой схемой, внести "старые" данные в новую схему, преобразуя (если необходимо) их "на лету". В некоторых случаях (к примеру, редкие, но существенные изменения) такой подход может также оказаться приемлимым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 16:02 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
А если у меня база 140 гигов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 16:24 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
Дык проблема всегда как раз в 140-ом:). Ну в 139-ом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 16:43 |
|
||
|
Теория: синхронизация структуры БД на двух машинах
|
|||
|---|---|---|---|
|
#18+
-me-II. У каждого разработчика -- свой локальный devel sandbox Незачем. С одной стороны, девелоперы и в одной песочнице не особо друг другу мешают, с другой - запись, появившуюся на реалке в ключевом справочнике, замучаешься разносить по N игрушкам. -me-а также test sandbox - БД, на которой проверяются работоспособность/совместимость. Незачем. После того, как разработчик ее в первый раз сломает и не починит, она не нужна. А если давать всем, непочиненные заведомо будут и постепенно такими станут почти все. Но самая жопа, естественно, это внесение изменений в центральный репозиторий/схему. -me-И тут, ИМХО, при команде от разработчика commit changes должно происходить следующее: А вот тут мы и приходим к игрушке тестеров, отдельной от игрушки программистов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 23:40 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33783988&tid=1542982]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
185ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 524ms |

| 0 / 0 |
