Управление изменениями схемы mysql с помощью сценариев SQL и транзакций - PullRequest
1 голос
/ 05 августа 2010

Я работаю с несколькими базами данных в приложении PHP / MySQL.У меня есть базы данных для разработки, тестирования, промежуточной и производственной базы данных.

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

Я хотел бы написать сценарии SQL в виде текстовых файлов, которые я могу создавать версии с изменениями PHP, которые сопровождают их в SVN, а затем применять сценарии к каждому экземпляру БД по мере их обновления.

Iхотел бы использовать транзакции, чтобы в случае возникновения ошибок во время выполнения сценария он откатывал все внесенные частичные изменения.Все таблицы InnoDB

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

SET FOREIGN_KEY_CHECKS = 0;
START TRANSACTION;
ALTER TABLE `projects` ADD COLUMN `foo1` varchar(255) NOT NULL after `address2`;
ALTER TABLE `projects` ADD COLUMN `foo2` varchar(255) NOT NULL after `address2`;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

... он все еще фиксирует новый столбец, даже если онКонечно, я не смог добавить первый, потому что я выпустил COMMIT вместо ROLLBACK.

Мне нужно, чтобы он выдал команду отката условно при ошибке.Как я могу сделать это в специальном SQL-скрипте?

Мне известна функция «объявить обработчик выхода» хранимых процедур, но я не хочу хранить это;Я просто хочу запустить его как сценарий adhoc.

Нужно ли в любом случае превращать его в хранимый процесс, чтобы получить условные откаты, или есть другой способ сделать всю транзакцию атомарной в одном режиме?SQL-скрипт?

Любые ссылки на примеры приветствуются - я гуглил, но пока нахожу только сохраненные примеры процессов

Большое спасибо

Ian

EDIT- это никогда не сработает;ALTER TABLE вызывает неявную фиксацию при обнаружении: http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html Спасибо Брайану за напоминание

1 Ответ

2 голосов
/ 05 августа 2010

На днях я узнал, что операторы языка определения данных всегда выполняются в MySQL и приводят к фиксации транзакций при их применении.Я думаю, что вам, вероятно, придется делать это в интерактивном режиме, если вы хотите быть уверены в успехе.

Я не могу найти вопрос на этом сайте, где это обсуждалось (это было всего пару дней назад).

Если вам нужно синхронизировать несколько баз данных, вы можете заняться репликацией.Хотя с репликацией не стоит шутить, это может быть тем, что вам нужно.Смотри http://dev.mysql.com/doc/refman/5.0/en/replication-features.html

...