|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Разрабатываем проект с базой данных Oracle. Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий. Предложите варианты и идеи. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 16:04 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Andrey3kПредложите варианты и идеи. Как и в 100500 предыдущих топиков на эту темя я предлагаю оторвать у шаловливых ручек право на изменение БД непосредственно, а в СКВ заносить скрипт изменения, который они генерят и, соответственно, изменения в образцово-показательном скрипте создания БД с нуля. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 16:13 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Andrey3kРазрабатываем проект с базой данных Oracle. Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий. Предложите варианты и идеи. Гуглите по кейворду версионирование бд. Как пример liquibase. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 16:24 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
ora601Гуглите по кейворду версионирование бд. Как пример liquibase.необычная фамилия ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 16:38 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Andrey3kРазрабатываем проект с базой данных Oracle. Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий. Предложите варианты и идеи. По пробовать запустить аудит, создается таблица в базе (так же будет занимать место в бд) с этой табличкой можно будет делать все что хочешь, например отчет в виде html ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 07:15 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
>> Как пример liquibase. грустный пример ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 19:03 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Всем привет! давно хотелось сделать нечто, что позволяло бы удобно работать с историей изменений объектов бд. Разные Flyway, Liquibase не устраивали по разным причинам Например, хранение версий в названиях файлов, приводит к конфликтам при слиянии веток. Не поддерживается нотация sqlplus. если интересно, то интерактиный пример можно найти здесь ... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2017, 22:14 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
не каждая компиляция процедуры нужна для фиксации ее версии, потому аудит отдельно, версии отдельно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 14:43 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Shtock>> Как пример liquibase. грустный примерПочему? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 16:15 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
>> Почему? ну вот сморю на главную страницу liquibase и читаю первые два пункта Supports code branching and merging Supports multiple developers далее у них же читаю http://www.liquibase.org/documentation/changeset.html Each changeSet tag is uniquely identified by the combination of the “id” tag, the “author” tag, and the changelog file classpath name. The id tag is only used as an identifier, it does not direct the order that changes are run and does not even have to be an integer. If you do not know or do not wish to save the actual author, simply use a placeholder value such as “UNKNOWN”. Из-за этих ID, когда несколько разработчиков работают на разных ветках, приходится выдумывать правила, чтобы избегать конфликтов при мерджах. И самое главное зачем вообще нужны эти идентификаторы? Зачем нужно помещать автора в теги, если автор итак уже есть в системе контроля версий? As Liquibase executes the databaseChangeLog, it reads the changeSets in order and, for each one, checks the “databasechangelog” table to see if the combination of id/author/filepath has been run. If it has been run, the changeSet will be skipped unless there is a true “runAlways” tag. After all the changes in the changeSet are run, Liquibase will insert a new row with the id/author/filepath along with an MD5Sum of the changeSet (see below) in the “databasechangelog”. Возможность пропускать скрипты, которые были уже применеы к базе - это достатчно сомнительное удовольствие. Эта возможность точно не для боевой базы. Так как сложно себе представить, что на базу накатывают версию и не зают, что накатывают, а тул сам пропускает некие скрипты. М.б. еще имеет смысл хранить в базе номер версии, но не более. Причем такой подход заставляет передавать каждый раз все скрипты за всю историю существования базы. Попробуй ему не дать скрипт, который был применен год назад. Тул не даст накатить изменения. Зачем это? Почему я не могу передать только изменения и номер версии к которой они применимы? Непонятно. Liquibase attempts to execute each changeSet in a transaction that is committed at the end, or rolled back if there is an error. Some databases will auto-commit statements which interferes with this transaction setup and could lead to an unexpected database state. Therefore, it is usually best to have just one change per changeSet unless there is a group of non-auto-committing changes that you want applied as a transaction such as inserting data. Весь этот абзац про то, что нужно как-то группировать изменения для того, чтобы избежать проблем в случае ошибок, в реальности не работает. Если вы на боевую базу выкатываете релиз, который валится при установке, то как вы не группируйте изменения, но уже поздно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2017, 21:30 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Rudyshin SergeyИз-за этих ID, когда несколько разработчиков работают на разных ветках, приходится выдумывать правила, чтобы избегать конфликтов при мерджах.В любой более-менее адекватной команде разработки всегда существуют определенные правила и стандарты, в том числе и правила наименования. Rudyshin SergeyИ самое главное зачем вообще нужны эти идентификаторы?Этот вопрос скорее всего означает то, что вы еще не пробовали использовать этот инструмент. Считайте, что каждый changeset - это некоторое атомарное изменение БД, т.е. транзакция. ID changeset-а необходим этом для того, чтобы отслеживать, накатывался ли он на данную БД или нет (+ привязка некоторых доп параметров, типа даты (последнего) выполнения). Для каждого примененного changeset-а в БД хранится его md5 для отслеживания того, не изменился ли changeset при следующем накате. Rudyshin SergeyЗачем нужно помещать автора в теги, если автор итак уже есть в системе контроля версий? Хотите остаться анонимным - никто не заставляет писать реально существующую где-либо учетную запись - пишите что-нибудь типа anonymous или defaultuser. А так этот атрибут, например, позволяет одним запросом получить список changeset-ов, созданных тем или иным юзверем, при условии, что они были применены к БД. Rudyshin SergeyВозможность пропускать скрипты, которые были уже применеы к базе - это достатчно сомнительное удовольствие. Эта возможность точно не для боевой базы. Так как сложно себе представить, что на базу накатывают версию и не зают, что накатывают, а тул сам пропускает некие скрипты. Опять налицо непонимание. Распишу подробнее. По умолчанию changeset накатывается на БД один раз (для удобства отнесем такие к первому типу). Но можно изменить это поведение, выставив например свойство runAlways=true (пусть это будет второй тип) или runOnChange=true (а это третий). Вот пример, как этим можно пользоваться: Необходимо накатить изменение, а именно - добавить поле в таблицу - для этого однозначно нужно использовать changeset первого типа с SQL alter table ... Этот changeset выполнится однократно первый раз и будет скипаться при последующих накатах патча на эту БД. Далее, необходимо изменить логику работу ХП с изменяемой нами таблицей (перенакатить измененный код) - тут можно использовать changeset-ы либо второго, либо третьего типа. При выставленном свойстве runOnChange=true он всегда выполнится первый раз и все последующие разы, если его текст (код ХП) изменился. При выставленном свойстве runAlways=true changeset будет выполняться при каждом накате вне зависимости от того, были ли в нем какие-либо изменения. P.S.Выделенное жирным - не более, чем демагогия , уж простите. Rudyshin SergeyПричем такой подход заставляет передавать каждый раз все скрипты за всю историю существования базы. Подразумевает, но не обязывает. Вы всегда можете начать патчить БД c помощью liquibase не с начального состояния, но для этого нужно будет выполнить разовую синхронизацию метаданных на prod, test и dev-окружениях. Rudyshin SergeyLiquibase attempts to execute each changeSet in a transaction that is committed at the end, or rolled back if there is an error. Some databases will auto-commit statements which interferes with this transaction setup and could lead to an unexpected database state. Therefore, it is usually best to have just one change per changeSet unless there is a group of non-auto-committing changes that you want applied as a transaction such as inserting data. Весь этот абзац про то, что нужно как-то группировать изменения для того, чтобы избежать проблем в случае ошибок, в реальности не работает. Если вы на боевую базу выкатываете релиз, который валится при установке, то как вы не группируйте изменения, но уже поздно.Вам никто и не говорит, что в случае ошибки этот tool сам за вас все исправит. И никакой другой инструмент не застрахует вас от ошибок. Если в процессе наката вылезла ошибка (не хватило прав, места или что-то в этом роде), то после устранения причины проблемы вы просто повторно запускаете накат патча и он продолжит с того места, на котором он упал (при этом не забываем рекомендации по атомарности changeset-ов). Ошибки же другого рода должны отлавливаться на test-контуре, на который все изменения накатываются посредством того же самого патча. Также есть возможность определения rollback-сценариев, но на практике мы их не используем. Таким образом, правильно построенные патчи, при условии, что все изменения метаданных БД производятся только через пачти и никто не лазит в БД своими шаловливыми ручками с DDL-командами напрямую, дают гарантию целостности. При многократном накате патча (или патчей - логически вы можете делить их как захотите) на одну и ту же БД накатываются только те changeset-ы, необходимость которых вы явно выставите с помощью перечисленных мною выше атрибутов. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:41 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKad, sql оборачивать в xml... очень все трудно. Мы в один файл.sql все пишем и из него накатываем. А этот ваш ликвибейз, там ант, мавен и прочее нужно. Очень муторно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 12:57 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
ДемагогAmKad, sql оборачивать в xml... очень все трудно. Мы в один файл.sql все пишем и из него накатываем. А этот ваш ликвибейз, там ант, мавен и прочее нужно. Очень муторно.Ликви берет и SQL Код: plsql 1. 2. 3.
без пролем... Но AmKad очень все красиво описал... респект... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 13:10 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Владимир СА, спасибо, буду знать! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 14:00 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
> В любой более-менее адекватной команде разработки всегда существуют определенные правила и стандарты, в том числе и правила наименования. мой тезис в том, что можно обойтись без идентифиторов в данном случае, и ни в коем случае не в том, что не должно быть вообще никаких правил >Хотите остаться анонимным - никто не заставляет писать реально существующую где-либо учетную запись - пишите что-нибудь типа anonymous или defaultuser. А так этот атрибут, например, позволяет одним запросом получить список changeset-ов, созданных тем или иным юзверем, при условии, что они были применены к БД. Git позволяет гараздо больше. На мой взгляд историю изменений лучше оставить специализированному тулу. >Далее, необходимо изменить логику работу ХП с изменяемой нами таблицей (перенакатить измененный код) - тут можно использовать changeset-ы либо второго, либо третьего типа. А теперь представьте, что процедура вызвается в нескольких changeset-ах. Вы накатываете базу с "нуля". В поставке последняя версия процедуры. Положим v0.42. Вначале накатывается changeset v0.1, который вызывает версию процедуры v0.42. Хотя когда-то changeset v0.1 вызывал процедуру версии v0.1 Это кажется неправильным. Решением в данном случае будет хранить все версии процедуры в отдельных файлах. Что кажется, как минимум избыточным. > Если в процессе наката вылезла ошибка (не хватило прав, места или что-то в этом роде), то после устранения причины проблемы вы просто повторно запускаете накат патча и он продолжит с того места Если в процессе наката на боевой базе возникла ошибка, то может что-то в консерватории подправить? Не должно быть никаких ошибок на боевой базе. Все должно быть оттестировано до. Более того, на мой взгляд скрипты не должны быть Idempotent. А наоборот должны быть https://en.wikipedia.org/wiki/Fail-fast Не должны скрипты проверять, что они уже выполнились, так как это повышает вероятность ошибок. Особенно при работе на ветках разными разработчиками. Эта idempotence - это по сути "exception when others then null; end;" "exception when then others null; end;" - тоже работает некоторое время ... > Также есть возможность определения rollback-сценариев, но на практике мы их не используем. вот именно, еще одно бесполезная фича > Таким образом, правильно построенные патчи, при условии, что все изменения метаданных БД производятся только через пачти и никто не лазит в БД своими шаловливыми ручками с DDL-командами напрямую, дают гарантию целостности Согласен и предлагаю рассмотреть пример, в котором не используются ни идентификаторы, ни liqubase но тем не менее позволяет делать все тоже самое Разработчик Иван на бранче JIRA-001 создал файл JIRA-001.sql и добавил его вызов в patch.sql Код: html 1. 2. 3. 4. 5.
Разработчик Петр на бранче JIRA-002 Код: html 1. 2. 3. 4. 5.
У каждого разработчика есть образ виртуальной машины, который соответствет версии боевой базы. Каждый из них проверили работоспособность своих скриптов. Отдали руководителю на интеграцию. Изменения были смерджины и протестированы Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9.
Какие проблемы есть у Ивана и Петра, и почему они должны начать использовать liqubase? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2017, 20:46 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Rudyshin Sergeyмой тезис в том, что можно обойтись без идентифиторов в данном случаеЯ показал, для чего нужны идентификаторы. Если Вы по-прежнему настаиваете на том, что они не нужны, то Ваш тезис в том, что в БД не должна трекаться информация о примененных changeset-ах. Rudyshin SergeyGit позволяет гараздо больше. На мой взгляд историю изменений лучше оставить специализированному тулу.Само собой, все changeset-ы (а соответственно и sql-скрипты) хранятся в системе контроля версий, поэтому и нет необходимости хранить все версии recreatable-объектов (view, procedure, function, package, type и т.д) в отдельных файлах. Достаточно хранить только актуальную, а все предыдущие при необходимости можно будет поднять по СКВ. Rudyshin SergeyА теперь представьте, что процедура вызвается в нескольких changeset-ах. Вы накатываете базу с "нуля". В поставке последняя версия процедуры. Положим v0.42. Вначале накатывается changeset v0.1, который вызывает версию процедуры v0.42. Хотя когда-то changeset v0.1 вызывал процедуру версии v0.1 Это кажется неправильным. Решением в данном случае будет хранить все версии процедуры в отдельных файлах. Что кажется, как минимум избыточным.Не понял примера - можно понять по-разному. Соответственно не понимаю необходимости "хранить все версии процедуры в отдельных файлах". Rudyshin SergeyНе должно быть никаких ошибок на боевой базе. Все должно быть оттестировано до.Конечно, но всегда есть человеческий фактор. Например, недооценили объем индекса на реальных данных. На тесте индекс создался, а на проде создание индекса упало, так как под него не был выделен достаточный объем. Rudyshin SergeyБолее того, на мой взгляд скрипты не должны быть IdempotentТеперь мы должны пойти и дать по пальцам разработчику, добавившему команду "alter table move tablespace" только потому, что она, видите ли, Idempotent. И обязать всех вместо "create or replace" писать либо "create", либо "replace". И явную перекомпиляцию хранимого кода ввиду изменения зависимостей запускать запретим. Если же хотите, чтобы каждый changeset накатывался только один раз, то пожалуйста, liquibase дает Вам возможность управлять этим свойством. Об этом я писал в своем предыдущем посте. Rudyshin SergeyНе должны скрипты проверять, что они уже выполнились, так как это повышает вероятность ошибок.Мои скрипты ни о каких проверках и не знают, за меня это делает liquibase. Rudyshin SergeyЭта idempotence - это по сути "exception when others then null; end;"Скорее всего Вы не поняли возможность управления свойствами runAlways и runOnChange. И вообще об отсутствии таковых. Об этом было в моем предыдущем посте. Liquibase не глотает ошибок. Rudyshin Sergeyвот именно, еще одно бесполезная фичаТут ничего не могу сказать, так как ни разу еще не задумывался о необходимости ее использования. Допускаю, что можно найти сценарии, где это могло бы пригодиться. Rudyshin SergeyКакие проблемы есть у Ивана и Петра, и почему они должны начать использовать liqubase?Совсем не обязательно у этих парней будут проблемы, но: 1) Данный патч не имеет возможности "повторного наката". При попытке повторного наката свалитесь на каждом "неповторяемом" statement-е. Возможность повторного наката - это не просто сферический конь в вакууме. Это не только возможность накатить версию базы с V10 на V11 (где V11 - актуальная), но и возможность накатить с помощью этого же patchset-а состояния других баз с любых других версий (с V0 на V11, с V5 на V11 и т.д.). 2) Если по какой-то причине (оборвалась связь с БД, нехватка места, выключили свет) выполнится только @JIRA-002.sql, а @JIRA-001.sql нет, то после устранения причины проблемы для продолжения наката Вам необходимо будет править файл patch.sql, комментируя вызов @JIRA-002.sql. В случае с liquibase он сам отследит выполненные changeset-ы и продолжит накат с того места, где был обрыв/падение. Никакой правки в файлах патча не требуется. 3) Если после наката патча кто-то шаловливыми ручками поправит "неповторяемый" changeset, то при попытке последующего (пере-)наката на эту же БД liquibase ругнется, и выдаст соотв-е сообщение и не начнет накат. 4) В liquibase я могу единожды выполнить настройку, которая будет запускать при каждом накате на dev и test-контурах unit-тесты, и игнорировать их запуск на проде. (Это частный пример того, что на уровне каждого changeset-а я могу выставить свойство context и управлять необходимостью его запуска на том или ином контуре). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 13:31 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Andrey3kРазрабатываем проект с базой данных Oracle. Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий. Предложите варианты и идеи. ты вполне можешь генерировать структуру базы данных в текстовом виде (через DBMS_METADATA) и складировать ее в текстовые файлы, которые отправлять в SVN или GIT отдельно можно настроить экспорт DBA_AUDIT_STATEMENTS, в пределах объектов - там будет видно, кто "создавал" или "заменял" объект за прошлый день - эти данные можно как коммент к комитту прикреплять. аналогично можно выгружать в текстовый вид и данные статичных справочников это если в варианте постфактум. а так да, нужно привинтить систему контроля изменений версий "до", но нормальных решений в свободном доступе практически нет, упомянутые liquebase и подобные отражения подходов из известной книжки refactoring databases категорически не совместимы с базовой идеей VCS систем, особенно если у тебя бренчи, бекмержи и подобное. очень неплох Oracle ODF/XDF тулчейн из OEBS, но это для избранных, отдельно он ИМНИП не поставляется ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 17:17 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKadСамо собой, все changeset-ы (а соответственно и sql-скрипты) хранятся в системе контроля версий, поэтому и нет необходимости хранить все версии recreatable-объектов (view, procedure, function, package, type и т.д) в отдельных файлах. Достаточно хранить только актуальную, а все предыдущие при необходимости можно будет поднять по СКВ. Садись, два. Почему два? Ок. У тебя есть сприпт миграции, jira-002412.sql. Который делает UPDATE, используя вызов функции из специфической редакции пакета PKG_MYSUPERPUPERLOGIC. Скажем версии v223 А у тебя в дистрибутиве поставляется версия последняя пакета, допустим v301. Но скрипт миграции требует именно v223 - там допустим определенный набор параметров функции или поведение, которое сильно изменено в 301, или вообще убрано. Т.е. чтоб правильно сделать миграции - тебе нужно в обязательном порядке в патче возить с собой все версии этого пакета, и накатывать их в строго заданной последовательности - именно чтоб миграции удовлетворить. Правда ситуация становится совсем веселой, когда в v223 обнаруживается несовместимый с жизнью баг (который новую версию Oracle отправляет в ORA-0600, и который был зачинен только в 301-й). А так да, идея что все recreatable объекты надо поставлять только последней версии - она очень привлекательна, в теории. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 17:23 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Andrey3kРазрабатываем проект с базой данных Oracle. Как можно хранить историю изменений базы данных ? Например изменили структуру таблиц и процедуры, нужно это дело сохранить в системе контроля версий. Предложите варианты и идеи. история изменений и так в архивлогах есть https://docs.oracle.com/database/121/SUTIL/GUID-E0DDC97C-7364-4BED-AF2A-E0B486F0E22F.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 17:52 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchСадись, два. Почему два? Ок. У тебя есть сприпт миграции, jira-002412.sql. Который делает UPDATE, используя вызов функции из специфической редакции пакета PKG_MYSUPERPUPERLOGIC. Скажем версии v223 А у тебя в дистрибутиве поставляется версия последняя пакета, допустим v301. Но скрипт миграции требует именно v223 - там допустим определенный набор параметров функции или поведение, которое сильно изменено в 301, или вообще убрано. Т.е. чтоб правильно сделать миграции - тебе нужно в обязательном порядке в патче возить с собой все версии этого пакета, и накатывать их в строго заданной последовательности - именно чтоб миграции удовлетворить. Правда ситуация становится совсем веселой, когда в v223 обнаруживается несовместимый с жизнью баг (который новую версию Oracle отправляет в ORA-0600, и который был зачинен только в 301-й). А так да, идея что все recreatable объекты надо поставлять только последней версии - она очень привлекательна, в теории.И? Никто не мешает тебе возить с собой все необходимые версии пакетов, а также выкатывать и запускать их в нужном порядке. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 17:59 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKadИ? Никто не мешает тебе возить с собой все необходимые версии пакетов, а также выкатывать и запускать их в нужном порядке. ты только что утверждал, что нужно возить только самые последние версии, остальные дескать сидят в VCS. а так - кто определит зависимости нужных версий? пакет-то может быть вовсе не standalone, и быть завязан на еще 100500 объектов из схемы, их тоже следовательно нужно возить строго нужных версий, а как это трекать, какую версию в какой момент времени применять? ты походу или теоретик, или просто поговорить хочешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:05 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKad...Возможность повторного наката - это не просто сферический конь в вакууме. Это не только возможность накатить версию базы с V10 на V11 (где V11 - актуальная), но и возможность накатить с помощью этого же patchset-а состояния других баз с любых других версий (с V0 на V11, с V5 на V11 и т.д.).... это именно конь в вакууме... на практике этим никто не заморачивается... чтобы повторно накатить, просто восстанавливается система с бэкапа и это можно делать не раз, но только на тесте и только потом на прод а уж накат с любой версии на любую - это вообще нереальная фигня тот же оракл не поддерживает прямой апгрейд скажем с 8-й версии на 11-ю ну т.е. можно конечно тратить время на то, чтоб пытаться делать патчи реентерабельными да еще и суперуниверсальными, типа, с любой версии на любую, но этой херней занимаются только конченные чудаки. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:18 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchAmKadИ? Никто не мешает тебе возить с собой все необходимые версии пакетов, а также выкатывать и запускать их в нужном порядке. ты только что утверждал, что нужно возить только самые последние версии, остальные дескать сидят в VCS. Если ты посмотришь внимательнее, то это мой был ответ Rudyshin Sergey о том, что liquibase не берет на себя обязанность хранения всех версий объектов и вполне нормально, что этим занимается СКВ. Если в процессе наката патча необходимо использовать несколько версий - то с этим, как я уже сказал, проблем нет. dbpatchа так - кто определит зависимости нужных версий? пакет-то может быть вовсе не standalone, и быть завязан на еще 100500 объектов из схемы, их тоже следовательно нужно возить строго нужных версий, а как это трекать, какую версию в какой момент времени применять?А это уже выходит за рамки обсуждения того, какую систему патчей использовать: liquibase или голые .sql файлы. Liquibase определением зависимостей не занимается. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:18 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKaddbpatchпропущено... ты только что утверждал, что нужно возить только самые последние версии, остальные дескать сидят в VCS. Если ты посмотришь внимательнее, то это мой был ответ Rudyshin Sergey о том, что liquibase не берет на себя обязанность хранения всех версий объектов Как раз наоборот - в их идеологии ты обязан вносить каждое изменение объекта в свой отдельный пронумерованный файл, и возить это потом с собой. Ну понятное дело, что если ты в течении дня сделал over 9000 изменений пакета, то тебе не нужно делать 9000 файлов, но то что ушло в деплой - уже всё, статик файл, менять нельзя, ибо зависимости. AmKadи вполне нормально, что этим занимается СКВ. Если в процессе наката патча необходимо использовать несколько версий - то с этим, как я уже сказал, проблем нет. VCS (GIT, SVN, etc) вообще не имеет смысла в случае подхода liquebase - потому что у тебя статик файл - после релиза содержание файла уже не меняется никогда. т.е. ликвибейз берет на себя функцию VCS. И ладно бы брал привычным способом - так там ни blame толком не сделать, а в случе backmerge можно вообще застрелиться. AmKadLiquibase определением зависимостей не занимается. как раз занимается, это ты просто не осилил его документацию и примеры, ну и книжку прамодкумара. садись два, еще раз. зачем лезть в спор, если матчасть не освоена? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:24 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
казинакэто именно конь в вакууме... на практике этим никто не заморачивается... чтобы повторно накатить, просто восстанавливается система с бэкапа Восстановиться из бакапа - это значит похерить данные текущей бд. А когда эта реальна работающая БД у одного из типовых заказчиков и данные терять не хочется? автора уж накат с любой версии на любую - это вообще нереальная фигняНу вообще-то я не говорил "на любую". Я говорил "с любой". Хотя можно заморочиться и "на любую". авторну т.е. можно конечно тратить время на то, чтоб пытаться делать патчи реентерабельными да еще и суперуниверсальными, типа, с любой версии на любую, но этой херней занимаются только конченные чудаки.Представь себе, по трудоемкости и сложности это не сильно отличается от последовательного добавления sql-статементов в .sql-файлы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:30 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKadавторну т.е. можно конечно тратить время на то, чтоб пытаться делать патчи реентерабельными да еще и суперуниверсальными, типа, с любой версии на любую, но этой херней занимаются только конченные чудаки.Представь себе, по трудоемкости и сложности это не сильно отличается от последовательного добавления sql-статементов в .sql-файлы. это только в теории. в теории можно рассказать про то, что миграции должны делаться только автономными файлами и не иметь внешних зависимостей команда даже примет это громогласным ура! но в один прекрасный день в файл миграции или зависимость на юзерский пакет вкомиттят, или под DECLARE поселят пару мегабайт глючной копипасты. а реентерабельность - очень прикольно звучит в случае рефакторинга вида "разделение структуры таблицы на две отдельные таблицы", или даже простейшего "партицирование таблицы". хотя да, реентерабельно индексы строить или констрейны прикручивать, ту да, это как два пальца - пищем PL/SQL обертки и вперед. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:37 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatch, Вы какие инструменты используете/советуете? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:49 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchVCS (GIT, SVN, etc) вообще не имеет смысла в случае подхода liquebase - потому что у тебя статик файл - после релиза содержание файла уже не меняется никогда. т.е. ликвибейз берет на себя функцию VCS.Неправда. dbpatchну и книжку прамодкумара.NoSql? Нет, не читал. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 18:57 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchэто только в теории. в теории можно рассказать про то, что миграции должны делаться только автономными файлами и не иметь внешних зависимостей Не знаю, что ты понимаешь под внешними зависимостями. dbpatchно в один прекрасный день в файл миграции или зависимость на юзерский пакет вкомиттят, или под DECLARE поселят пару мегабайт глючной копипасты.Причем тут система наката патчей? dbpatchа реентерабельность - очень прикольно звучит в случае рефакторинга вида "разделение структуры таблицы на две отдельные таблицы", или даже простейшего "партицирование таблицы". хотя да, реентерабельно индексы строить или констрейны прикручивать, ту да, это как два пальца - пищем PL/SQL обертки и вперед.Если ты используешь "реентерабельность" при накате констрайнтов и репартиционировании - то и флаг тебе в руки. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 19:10 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
svn_oradbpatch, Вы какие инструменты используете/советуете? как я говорил выше - единственно правильным является Oracle XDF/ODF фреймфорк. подход ликвибейза - он настолько неудобен, что пользовать им могут разве идейные мазохисты. а по факту рабочим вариантом является следующее: реентерабильные .SQL файлы, в т.е. CREATE PROCEDURE, VIEW, PACKAGE и прочее хранится просто как именованыне .SQL файлы, где именем файла является имя объекта, без нумераций. несколько объектов в один файл не допустимо, ну кроме случая PACKAGE и его BODY. эти файлы генерятся прямо из базы данных специальной PL/SQL процедурой, программисту не нужно копипастить. отдельно эти все файлы разбиты по каталогам, по подсистемам, так искать проще (не всегда в имени объекта префиксом зашито имя подсистемы/модуля). это все делается чтоб воспринимать код базы данных как любой иной (Java, C++, PHP) код и пользоваться blame, merge привычным способом CREATE TABLE и CREATE INDEX, ALTER TABLE - в настоящее время делаются через специальные PL/SQL вызовы, суть которых в том, чтоб проверить - если есть индекс, и его структура как в вызове - то ничего не делать, иначе перестроить и т.п. эти вызовы сидят в .sql файле с именем таблицы, т.е. хранится только последнее актуальное состояние таблицы (реентерабельность -же!). эти файлы тоже генерятся. т.е. цель - обеспечить реентерабельность патча (логика или пересоздать, или скипнуть) прошита изначально. а вот миграции данных - это да, боль еще та. если они тривиальные и без зависимостей - то они делаются реентерабельными, за этим следит специально обученный человек релизер. если скрипты миграции не реентерабельны, или требуют строго специфической версии базы данных на которую они накатываются - то они из патча выносятся в отдельно выполняемые вручную файлы, которые подшивают в release notes/steps (бывают pre и post разновидности) типо если вот хотите обновиться - берете эти файлы и выполняете вручную (если упали - то разбор полетов отдельно, вплоть до flashbask restore) слава богу, что примерно 99% всех миграций - они тривиальны и реентерабельны, особенно в случае пострелизных быстрых багфиксов. со статичным справочниками тот-же подход - их наполнение прошивается в специальные PL/SQL вызовы, кладется в .SQL файлы и работает по принципу - или добавь, или обнови, или ничего не делай, если запись уже на месте. файлы, естественно, тоже генерятся из базы, а вот PL/SQL код наполнения лежит, естественно, в отдельных .SQL файлах, они гарантированно выполняются первыми (есть еще понятие стадий и проходов, это отдельная тема) при каждом патче все .sql файлы применяются или целиком, если накатываем на пустую схему - за исключением реентерабельных миграций, которые сидят в отдельных каталогах, или же накатываются только те файлы, которые изменились от последнего релиза, если схема не пустая - хотя можно и все целиком накатить (реэнтерабельно же все), но когда у тебя объектов более 1000, то процедура накатки всех файлов в которых реально и не было изменений начинает занимать порой десятки минут, это неудобно. тулы все самописные (bash и sqlplus), готовых нормальных не нашлось ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 19:14 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKaddbpatchэто только в теории. в теории можно рассказать про то, что миграции должны делаться только автономными файлами и не иметь внешних зависимостей Не знаю, что ты понимаешь под внешними зависимостями. господи, ты стоишь на .SQL файле, в нем некий код. этот код или вызывает некий иной PL/SQL код, который лежит в других .SQL файлах этого же патча (внешняя зависимость по отношению к текущему файлу), или нет - он полностью автономен, и вызвает только то, что в Oracle изначально доступно. на остальные твои "флаг" в руки отвечать лениво и бессмысленно, ты просто не в теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 19:17 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchCREATE TABLE и CREATE INDEX, ALTER TABLE - в настоящее время делаются через специальные PL/SQL вызовы, суть которых в том, чтоб проверить - если есть индекс, и его структура как в вызове - то ничего не делать, иначе перестроить и т.п. эти вызовы сидят в .sql файле с именем таблицы, т.е. хранится только последнее актуальное состояние таблицы (реентерабельность -же!). эти файлы тоже генерятся. Попытался представить себе сигнатуру и тело pl/sql обертки для создания индекса. Ты проверяешь только набор и порядок полей? Уникальность/неуникальность? Или еще такие параметры tablespace, pctfree, next и т.д.? А при добавлении поля. Проверяешь размерность, null/not null, lob store as, storage in row ... и т.д.? Или еще лучше - добавление check-constraint-а? Проверяешь там текст? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 19:33 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchт.е. цель - обеспечить реентерабельность патча (логика или пересоздать, или скипнуть) Не реентерабельность, а идемпотентность. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 19:50 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKaddbpatchCREATE TABLE и CREATE INDEX, ALTER TABLE - в настоящее время делаются через специальные PL/SQL вызовы, суть которых в том, чтоб проверить - если есть индекс, и его структура как в вызове - то ничего не делать, иначе перестроить и т.п. эти вызовы сидят в .sql файле с именем таблицы, т.е. хранится только последнее актуальное состояние таблицы (реентерабельность -же!). эти файлы тоже генерятся. Попытался представить себе сигнатуру и тело pl/sql обертки для создания индекса. Ты проверяешь только набор и порядок полей? Уникальность/неуникальность? Или еще такие параметры tablespace, pctfree, next и т.д.? А при добавлении поля. Проверяешь размерность, null/not null, lob store as, storage in row ... и т.д.? Или еще лучше - добавление check-constraint-а? Проверяешь там текст? параметры аж три штуки имя таблицы, имя индекса column expression (там могут быть FBI, DESC и прочее). уникальность не уникальность - это имя процедуры - .idx() или .uk(), .pk() тонкости вида чем отличается UNIQUE INDEX от UNIQUE CONSTRAINT в рамках проекта задавили, чтоб не смущать сильно сумлевающихся - всем ходить в констрейн. локальность или не локальность индекса определяется автоматом из набора колонок. глобально партицированные индексы ни разу не понадобились, было решено что это все от лукавого. параметры сториджа берутся по дефолту от тейблспейса, а сам тейблспейс от юзера. практически никому не нужны эти тонкие материи, а кому сильно надо - тот сам потом руками сделает MOVE/REBUILD, как считает нужным. единственное место, где есть деление тейблспейсов - это партицирование по периодам (годам), с целью пометки оных тейблспейсов как R/O. но это делается отдельным фреймворком datalifecycle management, патч с ним перпендикулярен - в случае новой таблицы патч создает только изначальную партицию, остальные по датам добавляет уже другой пакет/набор джоб. один раз кто-то заикался, что давайте сделаем отдельный тейблспейс для индексов, типо при ресторе и даже при бекапе можно будет его скипнуть. какое-то время с этим мучались, но недостатки превысили бенефиты - при ресторе ребилд индексов занял неприемлимое по SLA время, а пару раз вообще не прошел, потому что TEMP не хватило, потому вкинувшего идею хранить индексы отдельно и не бекапить/ресторить - публично перед строем сильно поругали. на этом эпопея отдельного тейблспейса для индексов была выкинута - в современных SAN и SSD условиях это полная бессмыслица даже для перфоманса. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 19:55 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatch, сложилось ощущение, что AmKad работал с ликвибейзом и понимает, о чем пишет. Твои доводы ПРОТИВ, не совсем понятны. Ты скорее философ. А спорить с философом, себе дороже. Вы живете в своем мире. Всегда можно беседу в ключе: - Воду можно перенести в ведре - А если в нем будет дырка? - Надо взять ведро без дырки - А если температура окружающей среды будет выше температуры плавления материала, из которого сделано ведро? и т.д ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 19:55 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Lary Denisdbpatch, сложилось ощущение, что AmKad работал с ликвибейзом и понимает, о чем пишет. Твои доводы ПРОТИВ, не совсем понятны. нет, ты просто не можешь понять, как можно иначе. вот AmKad что-то уже начал понимать, видно у него не полный ликвибейз головного мозга (или он просто не совсем его понимает, это мы уже выяснили ранее). Lary Denis Ты скорее философ. А спорить с философом, себе дороже. Вы живете в своем мире. Вообще-то я сугубо практик, причем прожженный и циничный. И стадию ликвибейза уже давно прошел и выкинул, как архаичный атавизм и искревление сознания вида досадного затмения (и даже не могу сказать, зачем вообще так делали, скорее просто было так принято). А если ты что-то не осознал из сказанного мной выше - ну... ок, просто твой взгляд на мир ограничен теми рамками, в которых ты эффективен и выход за оные, переход на следующий уровень - тебя пугает, это нормально для 95% популяции людей, вне зависимости от их специализации. В средние века вон таких как я "философов" за подобные откровения на кострах жгли, ибо зачем думать-то, проще не думать и сразу объявить ересью :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 20:04 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatch, ты (Вы) с легкой руки вешаешь (те) ярлыки на людей. "этот не понял", "ты боишься", "ты не хочешь думать". Приятно поговорить не только с философом, но и с психологом и телепатом. Сталкиваясь с Liquibase в своей практике, не испытал дискомфорта. А скорее, как педант, остался очень им доволен. А вот раз у тебя (Вас) такое негативное мнение о нем, быть может ты (Вы) его не понял (ли)? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 20:12 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchА при добавлении поля. Проверяешь размерность, null/not null, lob store as, storage in row ... и т.д.? Размерность, тип (если колонка пуста, то тип меняется автоматом), null/not null - да, еще DEFAULT значение. Все параметры сториджа не проверяются - см. выше про сториджи, не патча это дело ковыряться с физикой, кому надо - сам потом поправит после патча. Даже параметры партицирования не прописываются - проще отдельными PL/SQL вызовами сделать отдельную миграцию пустой таблицы в партицированную, если сильно нужно. Смысл патча не только в реентерабельности, но и в гарантированном времени выполнения - это важно для пострелизных фиксов, которые выполняются по SLA не в выходные, а по требованию, т.е. должны занимать минуты, а не часы, т.е. не делать никаких неожиданных массированных миграций и ребилдов (делать только руками, если явно попросят). dbpatchИли еще лучше - добавление check-constraint-а? Проверяешь там текст? да, просто проверяется текст. если trim()-ed версии не совпадают - то пересоздается. отдельно - в настоящее время не шатко валко прорабатывается вопрос вообще избавиться от PL/SQL вызовов, и хранить только plain text вида CREATE TABLE, ALTER TABLE, CREATE INDEX уже отдельно по BNF его парсить и выдавать нужные ALTER TABLE ADD/MODIFY COLUMN, но, как говорится, "это тема моей будущей докторской диссертации". да и через bash/sqlplus такой парсинг уже не сделать, нужно применять более тяжелые вещества средства хотя потенциально эта идея интересна - можно сразу сторидж параметры прописывать, и прочие хитрости. если таблицы нет - то ее даже не надо целиком парсить - просто создать точно так, как в файле как написано. а вот реентерабельной логикой только сравнивать наборы и типы колонок если таблица уже в базе данных, скипая всю хитрую часть в части сториджа и прочих партицирований (см. выше про гарантированное время применения) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 20:24 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Lary DenisСталкиваясь с Liquibase в своей практике, не испытал дискомфорта. А скорее, как педант, остался очень им доволен. Это явление не ново. Вот тут описано: https://ru.wikipedia.org/wiki/Луддиты И гордиться подобным я бы не стал. Lary DenisА вот раз у тебя (Вас) такое негативное мнение о нем, быть может ты (Вы) его не понял (ли)? Я описал явно выше, почему он не приемлем. В нем практически невозможно делать blame (вернее ОЧЕНЬ затруднено) и совсем невозможно делать backmerge/merge - эти процедуры занимают часы, иногда дни, особенно для больших проектов, при этом качество результата практически всегда низкое и негарантированное. Но если для тебя слова backmerge и blame пустой звук (это нормально для большинства проектов, которые делаются для одного заказчика и актуальна только самая последняя версия), то подход с 0000123412.sql очень даже работоспособен, тут даже спорить не нужно. Яб конечно еще спросил, как вы делаете rollback.sql-ы, но думаю не стоит, ибо столько иронии в ответ ты, пожалуй, можешь и не выдержать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 20:30 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Нахлобучdbpatchт.е. цель - обеспечить реентерабельность патча (логика или пересоздать, или скипнуть) Не реентерабельность, а идемпотентность. да да, потентность. результаты не всегда неизменны, смысл реентерабельности патча в схеме "накатывали патч, упали, руками подчинили, накатили еще раз". причем руками починили часто не только базу, но и сам патч, потому про идемпотенцию :) я бы не стал говорить, это сильно сильное слово. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2017, 20:33 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchрезультаты не всегда неизменныТогда совсем грусть-тоска. dbpatchсмысл реентерабельности патча в схеме "накатывали патч, упали, руками подчинили, накатили еще раз".И даже это поведение -- ни разу не про реентерабельность. dbpatchпричем руками починили часто не только базу, но и сам патч, потому про идемпотенцию :) я бы не стал говорить, это сильно сильное слово.Всё тлен. Патчи должны быть оттестированы и накатываться без правок и "починок" базы. Я, конечно, понимаю, что Oracle не умеет транзакционный DDL, но это не повод. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 10:17 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Нахлобучdbpatchсмысл реентерабельности патча в схеме "накатывали патч, упали, руками подчинили, накатили еще раз".И даже это поведение -- ни разу не про реентерабельность. Ты прав, термин неудачный и в данном топике был вброшен не мной. Я сам называю это свойство способностью к перезапуску (restartable), перезапускаемость. реентерабельность это ЕМНИП скорее из мира POSIX, способность функции к повторому запуску при прерывании на обработку сигнала Нахлобучdbpatchпричем руками починили часто не только базу, но и сам патч, потому про идемпотенцию :) я бы не стал говорить, это сильно сильное слово.Всё тлен. Патчи должны быть оттестированы и накатываться без правок и "починок" базы. Я, конечно, понимаю, что Oracle не умеет транзакционный DDL, но это не повод. причины бывают разные. наиболее типовая - это просто закончилось место (в датафайлах, в TEMP или в UNDO). или патч занимает внезапно неожиданно большое время на миграциях. или падучая на констрейнах. протестировать на полной копии продукционных данных не всегда получается, в виду объема оных. а так да, правило - перед релизом тестируем патч на восстановленной из бекапа копии прода - никто не отменял, но много людей его в реальности соблюдает? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 11:16 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchпараметры аж три штуки имя таблицы, имя индекса column expression (там могут быть FBI, DESC и прочее). уникальность не уникальность - это имя процедуры - .idx() или .uk(), .pk() тонкости вида чем отличается UNIQUE INDEX от UNIQUE CONSTRAINT в рамках проекта задавили, чтоб не смущать сильно сумлевающихся - всем ходить в констрейн. локальность или не локальность индекса определяется автоматом из набора колонок. глобально партицированные индексы ни разу не понадобились, было решено что это все от лукавого. параметры сториджа берутся по дефолту от тейблспейса, а сам тейблспейс от юзера. практически никому не нужны эти тонкие материи, а кому сильно надо - тот сам потом руками сделает MOVE/REBUILD, как считает нужным. единственное место, где есть деление тейблспейсов - это партицирование по периодам (годам), с целью пометки оных тейблспейсов как R/O. но это делается отдельным фреймворком datalifecycle management, патч с ним перпендикулярен - в случае новой таблицы патч создает только изначальную партицию, остальные по датам добавляет уже другой пакет/набор джоб. один раз кто-то заикался, что давайте сделаем отдельный тейблспейс для индексов, типо при ресторе и даже при бекапе можно будет его скипнуть. какое-то время с этим мучались, но недостатки превысили бенефиты - при ресторе ребилд индексов занял неприемлимое по SLA время, а пару раз вообще не прошел, потому что TEMP не хватило, потому вкинувшего идею хранить индексы отдельно и не бекапить/ресторить - публично перед строем сильно поругали. на этом эпопея отдельного тейблспейса для индексов была выкинута - в современных SAN и SSD условиях это полная бессмыслица даже для перфоманса.Ну и зачем такой недовелосипед (не знаю как назвать по-другому) с попыткой учесть множество ньюансов? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 11:27 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchодин раз кто-то заикался, что давайте сделаем отдельный тейблспейс для индексов, типо при ресторе и даже при бекапе можно будет его скипнуть. Overkill ©SY За саму идею ребилда индексов при ресторе надо было сразу по рукам давать. Индексы зачастую выносятся в отдельный столкосмос для размещения файлов этого столкосмос на другой дисковой полке / луне. И, иногда, для возможности прогнозировать рост датафайлов по данным. Экономить на индексах в бакапе при выпячивании X@# (*xdf) своего OEBSа, как-то странновато выглядит. Механизм проверки хешей предыдущих изменений в системах наката патчей очень неплохо позволяет избежать вынужденного backmerge при накате велосипедистами только имеющихся на руках изменений на некую старую версию о которой известен только номер. з.ы. использовал liquibase на проекте с кучей зависимостей, изменением структуры и датафиксами. Проблем при накате с древней версии на свежую было минимум. В основном, не связанных с liquibase как таковым. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 11:47 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
envЭкономить на индексах в бакапе при выпячивании X@# (*xdf) своего OEBSа, как-то странновато выглядит. нет никакого OEBS, я его привел как пример грамотно реализованной системы патчей (и генерации и деплоя). envМеханизм проверки хешей предыдущих изменений в системах наката патчей очень неплохо позволяет избежать вынужденного backmerge при накате велосипедистами только имеющихся на руках изменений на некую старую версию о которой известен только номер. Про каких велосепедистов ты говоришь? О своем, о наболевшем? и да, ты походу путаешь backmerge и rollback. backmerge - это когда некая фича или багфикс, реализованная в версии 3.2 срочным порядком добавляется в предыдущую версию, к примеру, 2.9, с учетом того, что между ними полгода-год изменений и много рефакторингов уже прошло. разрешение конфликтов, 3-way merge, и прочий подобный .... гарантирован. a rollback это банальный откат на предыдующую версию. envз.ы. использовал liquibase на проекте с кучей зависимостей, изменением структуры и датафиксами. Проблем при накате с древней версии на свежую было минимум. В основном, не связанных с liquibase как таковым. никто и не утверждает, что liquibase создает проблемы при деплое. если говорить с позиции наиболее обобщенного решения - то для деплоя лучше и не придумаешь. у него проблемы с merge/blame/backmerge - собственно работе с системой контроля версий исходных кодов. он с любой VCS просто идеологически несовместим, ибо перпендикулярен ей, реализуя собственное понимание версий исходного кода: вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql - и никакой тебе черепашки, прыгай сам по этим файлам как хочешь, пытаясь выяснить, кто, почему и когда изменил/внес вот эту строку. неужели это не очевидно? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 12:47 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKadНу и зачем такой недовелосипед (не знаю как назвать по-другому) с попыткой учесть множество ньюансов? понятное дело, чтоб вносить сумятицу и непонимание всякие в умы читателей по диагонали, зачем-же еще? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 12:49 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchон с любой VCS просто идеологически несовместим, ибо перпендикулярен ей, реализуя собственное понимание версий исходного кода: вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql - и никакой тебе черепашки, прыгай сам по этим файлам как хочешь, пытаясь выяснить, кто, почему и когда изменил/внес вот эту строку. неужели это не очевидно?Ты не прав. Кто внушил тебе такой бред? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:01 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchAmKadНу и зачем такой недовелосипед (не знаю как назвать по-другому) с попыткой учесть множество ньюансов?понятное дело, чтоб вносить сумятицу и непонимание всякие в умы читателей по диагонали, зачем-же еще?На практике так ведь и получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:04 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKaddbpatchон с любой VCS просто идеологически несовместим, ибо перпендикулярен ей, реализуя собственное понимание версий исходного кода: вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql - и никакой тебе черепашки, прыгай сам по этим файлам как хочешь, пытаясь выяснить, кто, почему и когда изменил/внес вот эту строку. неужели это не очевидно?Ты не прав. Кто внушил тебе такой бред? ну и в чем именно я не прав? попробуй развернуть свою ээээ.... мысль, а то все телепаты ушли в отпуск, и догадаться что ты там подразумеваешь в виде отличий "такой бред" от "не такой бред", "бред, но не такой" никак не есть возможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:17 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchну и в чем именно я не прав? попробуй развернуть свою ээээ.... мысль, а то все телепаты ушли в отпуск, и догадаться что ты там подразумеваешь в виде отличий "такой бред" от "не такой бред", "бред, но не такой" никак не есть возможно.Ты говоришь, что liquibase несовместим с VCS и вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql. Я говорю тебе, что ты не прав. Какие тут еще нужны пояснения? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:21 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKaddbpatchну и в чем именно я не прав? попробуй развернуть свою ээээ.... мысль, а то все телепаты ушли в отпуск, и догадаться что ты там подразумеваешь в виде отличий "такой бред" от "не такой бред", "бред, но не такой" никак не есть возможно.Ты говоришь, что liquibase несовместим с VCS и вместо package.sql ревизий 1, 322, 2251 он предлагает иметь sql000001.sql, sql000322.sql и sql002251.sql. Я говорю тебе, что ты не прав. Какие тут еще нужны пояснения? в чем именно я не прав? как именно он предлагает хранить версии пакетов, просветишь нас тут всех, нет? с ссылкой на документацию оного, мне аж интересно стало. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:23 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchкак именно он предлагает хранить версии пакетов, просветишь нас тут всех, нет? с ссылкой на документацию оного, мне аж интересно стало.Давай сначала определимся, какой сценарий использования версий пакетов мы обсуждаем: 1) История версий нужна для отслеживания изменений (функционал VCS, например для просмотра diff). 2) В процессе наката требуется скомпилить и запустить несколько разных версий одного пакета. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:33 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Ну или могу сформулировать вопрос по-другому: в рассаматриваемом кейсе тебе реально нужно компилить и запускать несколько версий одного пакета, либо достаточно работать с последней версией пакета, но иметь историю его изменений в VCS? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:36 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKaddbpatchкак именно он предлагает хранить версии пакетов, просветишь нас тут всех, нет? с ссылкой на документацию оного, мне аж интересно стало.Давай сначала определимся, какой сценарий использования версий пакетов мы обсуждаем: 1) История версий нужна для отслеживания изменений (функционал VCS, например для просмотра diff). 2) В процессе наката требуется скомпилить и запустить несколько разных версий одного пакета. даже не пытайся подвести меня под AlwaysRun и хранить пакет всегда в одном файле. это в принципе нарушает концепцию ChangeSet, подобное откровение откровенно не интересно, по той простой причине, что я не хочу каждый раз накатывать over 9000 пакетов. я прекрасно понимаю, что ты не осилил ни документацию и концепции liquebase, ни книгу Прамодкумара, и твои попытки сохранить лицо ничего, кроме улыбки, сейчас не вызывают. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 13:40 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchдаже не пытайся подвести меня под AlwaysRun и хранить пакет всегда в одном файле.Ну вот, а делал вид, что не понимаешь. dbpatchчто я не хочу каждый раз накатывать over 9000 пакетовТолько сейчас все еще делаешь вид, как будто не знаешь про свойство runOnChange. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 14:28 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKaddbpatchдаже не пытайся подвести меня под AlwaysRun и хранить пакет всегда в одном файле.Ну вот, а делал вид, что не понимаешь. Цитирую еще раз: я прекрасно понимаю, что ты не осилил ни документацию и концепции liquebase, ни книгу Прамодкумара уже в третий раз. ну ок, ты молодец, купил BMW X5 и возишь в нем картошку, и думаешь, что это круто. хвалю. на этом закончим? AmKaddbpatchчто я не хочу каждый раз накатывать over 9000 пакетовТолько сейчас все еще делаешь вид, как будто не знаешь про свойство runOnChange. в общем случае оно не совместимо с понятием миграций данных (каждая миграция может требовать свою версию пакета и их зависимостей), и опять и снова - с концепией ChangeSet. мы что, играем в infinite loop? это все уже обсуждалось на предыдущей странице. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 14:39 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
dbpatchliquebaseСпециально коверкаешь? dbpatchна этом закончим?Да, пожалуй хватит. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2017, 14:47 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
И все таки, liqubase и подобные тулы от лукавого Хотя и должен признать, что _иногда_ удобно пропускать выполненные скрипты, но только нужно иметь в виду, что Эти тулы не имеют смысла для боевой базы. Их можно применять для тестовых сред, но нужно быть готовым восстановиться из бэкапа в случае ошибок в changeset'е. И что мешает в таком случае наладить удобное восстановление базы из бэкапа и накатывать весь дистрибутив? Тем более, что установка полноценного дистрибутива, это тест максимально приближенный к установке на боевую базу. Тулы не предназначены для работы с хранимым кодом. И в случае вызовов этого кода из changeset'ов появляется куча возможностей выстрелить себе в ногу. С этими тулами вы естественно лишаетесь sqlplus со всеми его плюшками. > 1) Данный патч не имеет возможности "повторного наката". только при условии, что патч не идемпотентный но и в случае liqubase, если внутри changeset-а возникла ошибка, то его поворотно уже не накатишь пример со стартовой страницы http://www.liquibase.org/index.html Код: html 1. 2. 3.
Если во время выполнения второго statment'а возникнет ошибка, то changeset становится невалидным. А хранить каждый statment в отдельном changeset-е очень неудобно. > 3) Если после наката патча кто-то шаловливыми ручками поправит "неповторяемый" changeset, то ... Приведу более реальный пример. На этапе разработки в changeset'е выполнили "drop table a;". На этапе тестирвания поняли, что это была ошибка. И естественно меняют "неизменяемый" changeset. > 4) В liquibase я могу единожды выполнить настройку, которая будет запускать при каждом накате на dev и test-контурах unit-тесты, и игнорировать их запуск на проде тоже самое можно сделать в sqlplus > И обязать всех вместо "create or replace" писать либо "create", либо "replace" согласен, что процедуры и подобные объекты, можно делать в виде идемпотентных скриптов, но только при условии, что каждый храниться в "нормальном" файле и конфликты мерджа решаются через СКВ если же помещать идемпотентные скрипты, в changeset'ы, то можно потерять изменения пример, в котором процедура из JIRA-002 будет перетерта версией из JIRA-001 Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2017, 23:20 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
выше 20091159 привел пример с Иваном и Петром и хочу ответить какие у них есть проблемы 1) проблема с файлом patch.sql этот файл есть на обеих ветках с большой вероятностью при слиянии будут конфликты причем конфликты ненужные, не отлавливающие реальных проблем в примере Иван и Петр изменили первую строку и соответственно будет конфликт, хотя им не важно чей патч применится первым а если предположить, что на проекте сотня файлов и десяток разработчиков, то становится совсем плохо 2) могла бы быть проблема с потерей изменений например JIRA-002.sql изменил состав столбцов индекса I1 JIRA-001.sql изменил уникальность I1 после выполнения patch.sql изменения JIRA-002.sql потеряны 3) недоступна история изменений таблиц, индексов и т.п. чтобы решить проблему 1) нужно генерировать patch.sql автоматически для этого нужно знать порядок, в котором применить файлы, а этого можно добиться, указав внутри файлов зависимости от других файлов чтобы решить проблему 2) необходимо поддерживать два вида патчей первый - обычный, который переводит из версии N в версию N+1 второй - "полный", который делает установку с "нуля", т.е из 0 в N+1, и в котором есть только команды типа create, insert, grant (либо исключения должны быть обоснованы, типа "create or replace functon". Хотя если написать "create &REPLACE. functon" и устанавливать эту переменную перед деплоем, то даже это ограничение можно снять ) и нет команд drop, alter, rename, revoke, delete, update и т.п. в таком случае после слияния веток, БД сообщит об ошибке при попытке создать вторую версию I1 или же во время слияния возникнет конфликт (если правильно организовать хранение объектов в файлах) Чтобы это заработало, нужно организовать автоматический накат и сравнение баз в обоих режимах (естественно на неком вспомогательном сервере, например на CI) Чтобы решить проблему 3) достаточно каждый объект создавать одним DDL и разумно организовать разбиение по файлам. Например, создание таблицы - отдельный файл, констрейнты - отдельный файл, индексы - отдельный файл. Такое разбиение, помимо истории изменений, дает возможность повторного использования кода. Например, в релизе меняется тип секционирования таблицы. Можно сделать патч вида JIRA-001.sql: Код: sql 1. 2. 3. 4. 5. 6.
в случае же оформления через changeset'ы, пришлось бы продублировать все команды по созданию таблицы, индексов и т.п. Не говоря про то, что если кто-то на соседнем бранче добавил новую колонку, то c changeset'ами возникнут проблемы. учитывая, что на мой взгляд эти проблемы не решаются существующим тулами, то сделал скрипт (150 строк на bash), который позволяет формировать патчи в двух форматах с учетом зависимостей между скриптами https://github.com/SergeyRudyshin/gtbuild сделал шаблон для использования этого скрипта в применении к бд Оракл https://github.com/SergeyRudyshin/gtbuild_ora_template и сделал пример, в котором можно в виртуальной машине посмотреть как оно все вместе работает в бд Оракл https://github.com/SergeyRudyshin/gtbuild_ora_walkthrough если кого-то заинтересует, буду рад ответить на вопросы ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2017, 13:50 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Rudyshin Sergeyсогласен, что процедуры и подобные объекты, можно делать в виде идемпотентных скриптов, но только при условии, что каждый храниться в "нормальном" файле и конфликты мерджа решаются через СКВ если же помещать идемпотентные скрипты, в changeset'ы, то можно потерять изменения пример, в котором процедура из JIRA-002 будет перетерта версией из JIRA-001 Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9.
Камрад, ну не хочешь понять ты как работать с liquibase. Сhangeset-ы умеют дружить с файлами. Сhangeset - это логический объект, а файл - физический. У меня весь хранимый код хранится по файлам - отдельный .sql-файл для каждого объекта (исключения пакеты: там один файл на спеку, второй - на тело), да и вообще для каждого типа объектов - свой каталог. Это что касается физики хранения. А теперь на каждый из этих файлов натравлено по changeset-у (с выставленным либо runAlways или runOnChange). То есть при накате changeset выполняет (pl/)sql-код из файла, на который ссылается. Это что касается логики вызова. При необходимости изменить код какого-либо объекта меняется содержимое соответствующего файла (а не добавляются новые). Это значит, что не будет описанного тобой сценария с перезатиранием объекта, а всю историю изменений объекта ты всегда можешь увидеть по СКВ. Если же при накате тебе нужно управлять несколькими версиями объекта (пишу об этом уже N-ый раз), то тут нужно будет создать несколько файлов (и желательно для каждого отдельный changeset) - для каждой необходимой версии. Ну и описать логику управления этими версиями - а эта задача возникает вне зависимости того, каким средством ты накатываешь. Rudyshin Sergey2) могла бы быть проблема с потерей изменений например JIRA-002.sql изменил состав столбцов индекса I1 JIRA-001.sql изменил уникальность I1 после выполнения patch.sql изменения JIRA-002.sql потеряныЭта проблема вне контекста выбора системы патчей. На наших проектах мы всегда выбираем ответственного за модель данных и все изменения ее структуры идут через него. А также стараемся избегать ситуаций, когда двое и более разработчиков одновременно работают над одним и тем же объектом. Все остальные аргументы про слияние веток игнорирую - они вне контекста выбора системы патчей. Rudyshin Sergeyв случае же оформления через changeset'ы, пришлось бы продублировать все команды по созданию таблицы, индексов и т.п.Повторяю, changeset - логический объект, файл - физический. Связь можно выстраивать любую. Скрипт генерации таблицы (или даже всей схемы целиком) можно бить на .sql-файлы как угодно. И конечно же можно вызывать один и тот же .sql-файл в разных changeset-ах. Нет такой проблемы, все дело в непонимании принципа работы liquibase. Rudyshin Sergeyучитывая, что на мой взгляд эти проблемы не решаются существующим тулами, то сделал скрипт (150 строк на bash), который позволяет формировать патчи в двух форматах с учетом зависимостей между скриптами https://github.com/SergeyRudyshin/gtbuild сделал шаблон для использования этого скрипта в применении к бд Оракл https://github.com/SergeyRudyshin/gtbuild_ora_template и сделал пример, в котором можно в виртуальной машине посмотреть как оно все вместе работает в бд Оракл https://github.com/SergeyRudyshin/gtbuild_ora_walkthrough если кого-то заинтересует, буду рад ответить на вопросыИзвини, но мне это пока неинтересно. Ты и liquibase забраковал, до конца с ним не разобравшись, а полез изобретать собственный велосипед. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2017, 20:52 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKadИзвини, но мне это пока неинтересно. Ты и liquibase забраковал, до конца с ним не разобравшись, а полез изобретать собственный велосипед. а с чего ты решил(а) что тебя кто-то собрался заинтересовывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2017, 00:00 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
спросим девчушкуAmKadИзвини, но мне это пока неинтересно. Ты и liquibase забраковал, до конца с ним не разобравшись, а полез изобретать собственный велосипед.а с чего ты решил(а) что тебя кто-то собрался заинтересовывать?Можешь выкинуть первое предложение, основной посыл - во втором. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2017, 00:09 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
> все дело в непонимании принципа работы liquibase скорее в непонимании, зачем для того, чтобы иметь таблицу DATABASECHANGELOG, тянуть в свой проект зависимость в 100 тыс строк! Код: powershell 1. 2.
из всех "фич", которые декларируется, возможно Diff был бы интересен http://www.liquibase.org/documentation/diff.html но на странице есть оговорка Код: html 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2017, 22:30 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Rudyshin Sergeyскорее в непонимании, зачем для того, чтобы иметь таблицу DATABASECHANGELOG, тянуть в свой проект зависимость в 100 тыс строк!Управление таблицей DATABASECHANGELOG - это все, что ты смог найти? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2017, 00:24 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
AmKadспросим девчушкупропущено... а с чего ты решил(а) что тебя кто-то собрался заинтересовывать? Можешь выкинуть первое предложение, основной посыл - во втором. Ты постарайся не говорить, что (можно) делать другим, и глядишь - другие перестанут тебе говорить, куда тебе прям сейчас стоит пройти (с) :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2017, 11:22 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Rudyshin Sergey> все дело в непонимании принципа работы liquibase скорее в непонимании, зачем для того, чтобы иметь таблицу DATABASECHANGELOG, тянуть в свой проект зависимость в 100 тыс строк! Отбрасывая в сторону вопрос пагубности/православности концепции миграций ActiveRecord в Java (и практически полного отсуствия штатной реализации оной в известных ORM) - есть ли пример чего-то более продвинутого в части API встроенных рефакторингов ? И да, зачем в проект тянуть исходник? Что мешает просто линковать готовый .jar? Если бы Oracle RDBMS EE поставлялась в open-source, вы бы ее тоже каждый раз пересобирали? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2017, 17:38 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
> есть ли пример чего-то более продвинутого в части API встроенных рефакторингов ? А какие есть примеры не продвинутых встроенных рефакторингов? Не совсем понимаю о чем речь. > И да, зачем в проект тянуть исходник? мой комментарий был о сложности проекта. Естественно, можно и нужно использовать готовый jar. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2017, 21:52 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
> единственно правильным является Oracle XDF/ODF фреймфорк почитал документацию https://docs.oracle.com/cd/E26401_01/doc.122/e22961/T302934T609784.htm и насколько понял, XDF это XML файл, в котором сохраняются метаданные главного объекта и его зависимостей. Есть утилита XDFGEN, которая генерирует эти файлы. И есть xdfcmp, которая умеет сравнивать XDF файлы с базой и "накатывать" их. Если мое понимание верно и подход заключается в том, чтобы оперировать XML файлами полученными автоматически, а именно хранить их в системе контроля версий и передавать эти файлы для установки и т.д. то на мой взгляд, это как минимум неудобно Правильным, как раз скорее является подход, которого Оракл придерживается с начала времен, и я сильно сомневаюсь, что они используют XDF или Liquibase как пример смотрю на файл @?/rdbms/admin/catalog.sql и его зависимости По истории изменений видно, что файл был создан почти 30 лет назад и до сих пор меняется Код: html 1. 2. 3.
если смотреть на сами скрипты, то видно, что они меняются вручную, а не генерируются (по крайней мере с первого взгляда). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2017, 00:09 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
Rudyshin SergeyПравильным, как раз скорее является подход, которого Оракл придерживается с начала времен, и я сильно сомневаюсь, что они используют XDF или Liquibase как пример смотрю на файл @?/rdbms/admin/catalog.sql и его зависимости По истории изменений видно, что файл был создан почти 30 лет назад и до сих пор меняется Код: html 1. 2. 3.
если смотреть на сами скрипты, то видно, что они меняются вручную, а не генерируются (по крайней мере с первого взгляда).И у оракла бывают проблемы. На днях ставил Oracle 11.2 XE на свою виндовую локальную тачку. По завершению инсталлер говорит что все ОК - а на деле базы-то и нет. Решал по аналогии 14769174 . Я уж не говорю про проблемы при обращении к v$-вьюхам, например к v$session. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2017, 19:14 |
|
СУБД. История изменений
|
|||
---|---|---|---|
#18+
> И у оракла бывают проблемы и не мало. Например, одна из тех, с которыми приходилось сталкиваться: catalog.sql отрабатывает с ошибкой если переменная SQLBLANKLINES установлена в ON. > На днях ставил Oracle 11.2 XE на свою виндовую локальную тачку. По завершению инсталлер говорит что все ОК - а на деле базы-то и нет. Решал по аналогии 14769174 Возможно это действительно так. Но никогда нет полной уверенности, пока установка делается вручную. Некоторое время назад познакомился с утилитой https://www.packer.io, которая нарезает образы для VM из дистрибутивов. вот тут https://github.com/boxcutter/windows можно найти конфигурации, которые создают образы Windows. Нам бы в FAQ добавить что-то подобное, чтобы запустив одну команду создавался бы образ VM с установленным Ораклом под винду... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2017, 21:47 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1881669]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
53ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
103ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 221ms |
0 / 0 |