Как изменить MyISAM на InnoDB онлайн без таблицы блокировки - PullRequest
0 голосов
/ 01 апреля 2020

Есть много таблиц, использующих MyISAM. Я должен изменить их двигатель на InnoDB; Но есть следующие трудности:

1 、 Эти таблицы не имеют первичного или уникального ключа, поэтому инструменты pt-ost не могут добавить триггер для его изменения.

2 、 Поскольку они используйте MyISAM, если я использую

«Изменить имя таблицы ENGINE = InnoDB»

или «ADD COLUMN id bigint (10) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id)»,

таблица будет заблокирована на долгое время, поэтому некоторые функции в сети не работают

PS : MySQL версия 5.6.17

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Вам нужен способ преобразования MyISAM в InnoDB без блокировки таблицы на длительный период времени, и у вас нет первичного ключа в таблице?

Учитывая эти ограничения, вот решение:

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

  2. ALTER TABLE на реплике, чтобы преобразовать таблицу в InnoDB. Для реплики это займет некоторое время, но не повлияет на основную, поскольку репликация асинхронна.

  3. После преобразования таблицы репликация должна возобновиться. Пусть репликация наверстывает упущенное, поэтому реплика обновляется по отношению к своей основной.

  4. Переключите все приложения и клиенты, чтобы использовать реплику вместо основной.

Вуаля! Теперь клиенты используют одну и ту же таблицу, но это InnoDB.

Больше не пишите в прежнюю первичную базу данных.

0 голосов
/ 01 апреля 2020

У вас есть несколько вариантов сделать одну и ту же миграцию. Например:

  • Создать новую таблицу как старую.
  • Изменение новой таблицы по мере необходимости.
  • Синхронизация c данных между новой и старой таблицами.
  • Переключение таблиц переименования.
  • Повторная синхронизация c таблицы снова
...