Экспериментальный набор скриптов для MySQL миграций

Пакеты Limb3 с точки зрения использования

Модератор: phpBB2 - administrators

Экспериментальный набор скриптов для MySQL миграций

Сообщение pachanga » Ср окт 03, 2007 11:27 am

Я выложил в https://svn.limb-project.com/misc/migration/ набор скриптов, который мы используем у себя в компании для организации некоего подобия миграций для MySQL баз данных.

Зачем это вообще все нужно? Все просто - необходимо хранить в репозитории историю всех изменений схемы БД, чтобы в последствии была возможность применить эти изменения к продукционной БД или, например, синхронизироваться с изменениями других разработчиков.

Как это работает:

0) Во-первых, в проекте в директории init хранятся sql дампы schema.mysql и data.mysql: схема и данные соотв-но. Эти дампы создаются/загружаются при помощи скриптов:

php mysql_dump.php

php mysql_load.php

Несколько замечаний: подразумевается, что скрипты находятся в директории cli проекта, таже подразумевается, что пользователь MySQL имеет полные права доступа на любые действия(это необходимо для создания временных БД, см. ниже)

1) В БД хранится табличка schema_info с единственным полем version. Как говорит, название, это поле представляет из себя уникальную инкрементную версию схемы БД. Это поле представляет из себя stamp, который проставляется автоматически(см.ниже)

2) В директории init/migrate проекта хранятся все миграционные sql файлы формата NNN_some_name.sql, вот NNN - это номер версии schema_info. По сути, миграционный sql - это набор alter, drop и проч. команд

Когда происходит синхронизация миграций, то из БД берется текущая версия schema_info и прогоняются все скрипты от текущей версии до последнего найденного из init/migrate. Соотв-но, если не было новых миграционных скриптов, то ничего не выполняется.

Миграция выполняется командой:

php mysql_migrate.php

После выполнения команды в schema_info вносится версия последней миграции.

Кроме этого можно выполнить тестовый прогон миграции:

php mysql_migrate.php --dry-run

В этот момент будет прогнан весь цикл миграции на временной БД, которая будет создана в начале выполнения скрипта и удалена в конце. Т.е таким образом текущая БД пользователя никак не будет затронута, что позволяет проверить на ошибки новые миграции, как свои так и чужие.

3) Как создается sql файл миграции? Можно вручную, но это скучно, поэтому существует набор скриптов, позволяющий максимально автоматизировать это дело.

Во-первых, когда вы внесли изменения в БД, стоит прогнать команду:

php mysql_diff.php

Во время ее выполнения будут показаны изменения текущей схемы БД по сравнению к той, что хранится в init + все миграции. Эти изменения будут представлены в виде набора alter, drop, create sql команд. Внимание: мы выдрали алгоритм почти "как-есть" из какого-то древнего скрипта, который нашли в интернете, и я скажу честно, выглядит он ужасно, но вроде работает, хотя порой и с мелкими огрехами ;)

После того, как разработчик готов к тому, чтобы создать миграцию он вызывает следующий скрипт:

php mysql_create_migration.php some_name

В этот момент будет создана миграция вида NNN_some_name.sql, где NNN будет текущий time stamp. В этот же момент будет обновлена версия schema_info для текущей БД до NNN. Кроме этого, будет выполнена попытка тестового прогона миграции на временной БД которая будет создана и удалена автоматически. Тестовый прогон делается для того, чтобы обнаружить ошибки миграции как можно раньше.

Если все работает, то можно коммитить ;)

Пример набора скриптов из одного реального проекта:

1189075049_moving_category_id_field_to_profile_table_from_shop.sql
1188825003_table_types_fixes.sql 1189427659_adding_is_approve_field_to_some_tables.sql
1188887493_adding_product_table.sql
1188890836_adding_some_core_tables.sql
1188896360_adding_extra_fields_to_profile_table.sql 1189500443_adding_product2shop_table.sql
1189597253_adding_some_fields_to_profile_table.sql
1189065170_renaming_shop_action_to_promo_action.sql
1189065605_fixing_some_fields_in_promo_action.sql 1190205157_changing_fields_that_stores_image_or_file_ids.sql
1190205613_minor_fix_in_promo_action.sql
1189068460_moving_some_relations_from_shop_to_profile.sql
Последний раз редактировалось pachanga Чт окт 04, 2007 1:19 pm, всего редактировалось 1 раз.
Аватара пользователя
pachanga
LIMB Developer
 
Сообщения: 4504
Зарегистрирован: Вс июн 06, 2004 7:29 pm
Откуда: Russia, Penza

Сообщение alex433 » Чт окт 04, 2007 12:42 pm

Интересная схема.
Я для небольших проектов использую dbdesigner, ссылку уже приводил.
Вся работа с базой ведется через dbdesigner:
1. Создал схему накидал табличек.
2. Синхронизация с базой по нажатию одной кнопки (программа сама разруливает что надо сделать alter, create, delete)
3. Схема базы хранится под svn ( то есть тоже есть возможность откатится на любую ревизию)

По самой проге:
Интерфейс простой и понятный, работать удобно и быстро, схему можно загружать на различные типы БД (mysql, pgsql, oracle), но так же присутствует достаточное кол-во глюков, поэтому использую для небольших проектов (до 100) таблиц. Для более серьезных проектов можно рекомендовать sybase powerDesigner.

В свое время по работе использовали еще несколько другую схему:
1. SQL скрипты по модификации базы писались руками и хранились в одной папке в файлах по названию таблиц или процедур. Допустим необходимо внести изменения в таблицу news соответственно добавляем необходимый код в news.sql файл.
В базе в спец табличке хранили номер ревизии.
При накате изменений скрипт проверял номер ревизии и запускал скрипты у которых номер ревизии больше чем тот который в базе.
alex433
LIMB Developer
 
Сообщения: 441
Зарегистрирован: Чт окт 19, 2006 9:24 pm
Откуда: Kiev, Ukraine

Сообщение wIliaM » Вт авг 18, 2009 2:51 pm

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

а во-вторых, хотел бы разместить ссылку на похожий инструмент - http://code.google.com/p/mysql-php-migrations/
из вкусных отличительных черт (сужу только по описанию) - ability to list, migrate up, migrate down, run a specific migration, and migrate to latest database version

сам пока не пробовал. если кто-то сумеет попробовать и оценить - отпишитесь пожалуйста.
Аватара пользователя
wIliaM
LIMB Developer
 
Сообщения: 716
Зарегистрирован: Пт июн 04, 2004 11:23 pm
Откуда: Russia, Penza

Сообщение pachanga » Вт авг 18, 2009 4:09 pm

Я, кстати, в одном из проектов использую более новую и универсальную версию оригинальных скриптов. Руки не доходят обновить...
Аватара пользователя
pachanga
LIMB Developer
 
Сообщения: 4504
Зарегистрирован: Вс июн 06, 2004 7:29 pm
Откуда: Russia, Penza

Сообщение korchasa » Вт авг 18, 2009 5:14 pm

pachanga писал(а):Я, кстати, в одном из проектов использую более новую и универсальную версию оригинальных скриптов. Руки не доходят обновить...

Отлично, а я нашу почти переписал на DBAL. Охренительно кооперируемся, ага :D
Аватара пользователя
korchasa
LIMB Developer
 
Сообщения: 934
Зарегистрирован: Чт май 10, 2007 3:47 am

Сообщение pachanga » Вт авг 18, 2009 6:14 pm

korchasa писал(а):
pachanga писал(а):Я, кстати, в одном из проектов использую более новую и универсальную версию оригинальных скриптов. Руки не доходят обновить...

Отлично, а я нашу почти переписал на DBAL. Охренительно кооперируемся, ага :D


Залил новую версию в https://svn.limb-project.com/misc/migration2

Основное отличие в том, что migration2 не привязана к конкретному проекту и не делает никаких предположений на счет настроек - все передается через командную строку. Не уверен, что все скрипты рабочие, т.к реально в проекте используем только mysql_migrate.php. SQL дифы пишем руками, т.к это самый надежный способ :)
Аватара пользователя
pachanga
LIMB Developer
 
Сообщения: 4504
Зарегистрирован: Вс июн 06, 2004 7:29 pm
Откуда: Russia, Penza

Сообщение pachanga » Вт авг 18, 2009 6:19 pm

Ах да, чуть не забыл, все скрипты принимают парамер <dsn>, который должен быть вида 'host;port;user;pass;dbname'. Использование ";" в качестве делимитера не очень хорошая идея, т.к в консоли надо брать парамер <dsn> в кавычки, но так сложилось... Я бы заменил его на ":"
Аватара пользователя
pachanga
LIMB Developer
 
Сообщения: 4504
Зарегистрирован: Вс июн 06, 2004 7:29 pm
Откуда: Russia, Penza

Сообщение korchasa » Вт авг 18, 2009 6:21 pm

pachanga писал(а):Ах да, чуть не забыл, все скрипты принимают парамер <dsn>, который должен быть вида 'host;port;user;pass;dbname'. Использование ";" в качестве делимитера не очень хорошая идея, т.к в консоли надо брать парамер <dsn> в кавычки, но так сложилось... Я бы заменил его на ":"

Тогда уж заменить на тот, который понимает lmbDsn
Аватара пользователя
korchasa
LIMB Developer
 
Сообщения: 934
Зарегистрирован: Чт май 10, 2007 3:47 am

Сообщение pachanga » Вт авг 18, 2009 8:51 pm

korchasa писал(а):
pachanga писал(а):Ах да, чуть не забыл, все скрипты принимают парамер <dsn>, который должен быть вида 'host;port;user;pass;dbname'. Использование ";" в качестве делимитера не очень хорошая идея, т.к в консоли надо брать парамер <dsn> в кавычки, но так сложилось... Я бы заменил его на ":"

Тогда уж заменить на тот, который понимает lmbDsn


Ну там вообще-то фишка в том, что эти скрипты от limb не зависят вообще...
Аватара пользователя
pachanga
LIMB Developer
 
Сообщения: 4504
Зарегистрирован: Вс июн 06, 2004 7:29 pm
Откуда: Russia, Penza

Сообщение idler » Ср ноя 18, 2009 2:17 am

wIliaM писал(а):Оживлю старенькую тему.
во-первых, интересно знать пользуется ли кто-нибудь еще этими инструментами миграции схемы БД.

а во-вторых, хотел бы разместить ссылку на похожий инструмент - http://code.google.com/p/mysql-php-migrations/
из вкусных отличительных черт (сужу только по описанию) - ability to list, migrate up, migrate down, run a specific migration, and migrate to latest database version

сам пока не пробовал. если кто-то сумеет попробовать и оценить - отпишитесь пожалуйста.


Оживлю тему еще раз.

Чего только не попробовал за последние 2 недели, даже два своих достаточно простых велосипеда.

Я не зря процитировал про похожий инструмент. Он не умеет ровным счетом НИЧЕГО! :)

Может только создавать пустышки типа:

Код: Выделить всё
class Migration_2009_11_18_01_26_39 extends MpmMysqliMigration
{

        public function up(ExceptionalMysqli &$mysqli)
        {

        }

        public function down(ExceptionalMysqli &$mysqli)
        {

        }

}

Код для миграций должен писать разработчик.

Еще умеет обновлять таблицу с версионностью
Код: Выделить всё
mysql> select * from mpm_migrations;
+----+---------------------+--------+------------+
| id | timestamp           | active | is_current |
+----+---------------------+--------+------------+
|  1 | 2009-11-18 01:21:15 |      0 |          0 |
|  4 | 2009-11-18 01:25:30 |      0 |          0 |
|  7 | 2009-11-18 01:26:39 |      0 |          0 |
+----+---------------------+--------+------------+
3 rows in set (0,00 sec)


Обновляет в момент создания миграций и в момент их накатывания.
Код: Выделить всё
max@max:~/src/mpm/1/migration$ ./migrate.php help

       __ __         __      __
|\/|  (_ /  \|   __ |__)|__||__) __ |\/|. _  _ _ |_. _  _  _
|  |\/__)\_\/|__    |   |  ||       |  ||(_)| (_||_|(_)| )_)
    /                                    _/
******************************************************************** v2.0.1 ***

The Following Commands Are Available:
    add    - add a new migration
    build  - builds the database
    down   - roll down to a previous migration
    help   - get more specific help about individual commands
    init   - initialize the migrations
    latest - roll up to the latest migration
    list   - list all migrations
    run    - runs a single migration
    status - show the current migration
    up     - roll up to a future migration

For specific help for an individual command, type:
    ./migrate.php help [command]

*******************************************************************************
max@max:~/src/mpm/1/migration$


В целом сама идея очень даже... вот бы туда sql-генератор прикрутить, чтобы в обе стороны генерил :).

С пакетом из лимба я толком разобраться так и не смог в свое время - два раза пытался.
проблемы с php-5.3 были, конфигурация подключения к БД хард-кодед во всех файлах...

SQL-дифы писать руками конечно самый надежный способ, но лучше их подправлять, если плохо сгенерилось. Сам я в ближайшее время навряд ли займусь доработкой чего-либо, но есть идея получать такой код:

Код: Выделить всё
class Migration_2009_11_18_01_26_39 extends MpmMysqliMigration
{
       protected $sql = array(
              'up'=>array(
                       'alter table x add y int, add z varchar(3)',
                       'alter table q drop index xyz'
               ),
              'down'=>array(
                       'alter table x drop y, drop z',
                       'alter table q add index xyz(xyz_column)'
              )
        );

/* Унести методы в MpmMysqliMigration */
        public function up(ExceptionalMysqli &$mysqli)
        {
            foreach($this->sql['up'] as $query)
            {
               if ($mysqli->query($query) === false)
                 {
                    echo "ERROR: {$query};\n";
                  }else{
                    echo "ok: {$query};\n";
                   }
               }
        }

        public function down(ExceptionalMysqli &$mysqli)
        {
            foreach($this->sql['down'] as $query)
            {
               if ($mysqli->query($query) === false)
                 {
                    echo "ERROR: {$query};\n";
                  }else{
                    echo "ok: {$query};\n";
                   }
               }
        }

}


Когда нибудь попробую скрестить 2 утилиты, если удастся разобраться в mysql_diff.php :)
Аватара пользователя
idler
LIMB Addicted
 
Сообщения: 353
Зарегистрирован: Вт ноя 27, 2007 2:34 pm
Откуда: Russia/Moscow

Re: Экспериментальный набор скриптов для MySQL миграций

Сообщение conf » Чт янв 28, 2010 11:31 am

Ребята, возьмите liquibase и не парьтесь, там это уже 100 лет назад есть.
Опыт - это то, что мы получаем, когда не получаем того, что хотим.
http://www.shelfari.com/shein_alexey/shelf - лучшие книги для программистов.
Аватара пользователя
conf
LIMB Addicted
 
Сообщения: 568
Зарегистрирован: Вт мар 25, 2008 6:41 pm
Откуда: Tashkent, Uzbekistan

Re: Экспериментальный набор скриптов для MySQL миграций

Сообщение wIliaM » Чт янв 28, 2010 11:52 am

conf писал(а):Ребята, возьмите liquibase и не парьтесь, там это уже 100 лет назад есть.

Ну допустим не 100, а сопоставимо с возрастом внутренних инструментов LIMB.
Все равно за ссылку http://www.liquibase.org/ большое спасибо. посмотрел короткое обучающее видео.
коротко - это java-based решение, изменения БД хранит в XML (что нормально, ведь она database independent)

Для себя пока решил, что для текущих задач достаточно инструментов LIMB: они проще с точки зрения использования как на локальных машинах, так и на сервере (т.к. php и plain sql), хотя много чего и не умеют.

на liquibase подробнее посмотрю несколько позже. этой библиотеке наверняка найдется место в моем арсенале :)
Аватара пользователя
wIliaM
LIMB Developer
 
Сообщения: 716
Зарегистрирован: Пт июн 04, 2004 11:23 pm
Откуда: Russia, Penza

Re: Экспериментальный набор скриптов для MySQL миграций

Сообщение idler » Вт май 11, 2010 7:46 am

На прошлом проекте очень нужен был инструмент подобного типа. Java не была установлена на серверах...
Limb migration завести не смог.
Родился еще один велосипед: http://bitbucket.org/idler/mmp
http://habrahabr.ru/blogs/php/90052/ - описание на хабре
Аватара пользователя
idler
LIMB Addicted
 
Сообщения: 353
Зарегистрирован: Вт ноя 27, 2007 2:34 pm
Откуда: Russia/Moscow


Вернуться в Limb3 использование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron