Могу ли я изменить таблицу, на которую ссылается внешний ключ mysql, ничего не блокируя? - PullRequest
2 голосов
/ 05 апреля 2011

У нас есть большая миграция схемы, и мы не хотим, чтобы сайт закрывался целую вечность, поэтому мы пытаемся сделать это на лету, не читая блокировку соответствующих таблиц. Записанные таблицы записываются только в определенное время дня, поэтому у нас есть окно, в котором мы можем позволить себе блокировать запись; но в то время как многие из документов mysql утверждают, что ALTER TABLE должны писать только таблицы блокировок, по нашему опыту все, что нетривиально, например добавление индекса, блокирует его.

Итак, мы должны были выполнить миграции вручную. У нас был некоторый успех со следующей процедурой:

  1. CREATE TABLE new_mytable LIKE mytable;
  2. применить миграцию к new_mytable
  3. mysqldump -t mydb mytable > mytable.sql
  4. используйте sed для изменения mytable.sql для вставки в правильные столбцы new_mytable
  5. mysql mydb < mytable.sql
  6. сбросить внешние ключи на mytable - они не копируются CREATE TABLE ... LIKE ...
  7. добавить внешние ключи к new_mytable
  8. RENAME TABLE mytable TO old_mytable, new_mytable TO mytable
  9. выполнить несколько проверок работоспособности
  10. DROP TABLE old_mytable

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

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

1 Ответ

1 голос
/ 12 апреля 2011

Если вы знаете, как изменить сами таблицы.

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

...Alter the tables and change the keys

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
...