(MySQL 5.7.19 AWS RDS), как изменить набор символов столбца таблицы без блокировки - PullRequest
0 голосов
/ 28 августа 2018

Я хочу изменить набор символов таблицы с 'utf8' на 'utf8mb4'
но каждый столбец имеет собственную настройку набора символов (utf8)
поэтому мне нужно изменить набор символов столбца на «Таблица по умолчанию», но проблема с блокировкой
помогите мне изменить набор символов столбца без блокировки таблицы

в таблице более 100 000 000 строк

1 Ответ

0 голосов
/ 29 августа 2018

«Набор символов» - это кодировка символов в байтах.
«Сортировка» - это как сортировать символы.

INDEX на VARCHAR сортируется по его сопоставлению, поэтому изменение сопоставления столбца требует перестройки индекса - нетривиальная операция.

Разница между utf8 и utf8mb4 относительно невелика, но я не думаю, что MySQL (следовательно, RDS) сделал особый случай этого.

ALTER TABLE t CONVERT TO utf8mb4; звучит как операция, которую вы желаете. Это требует ALGORITHM=COPY, так что это «блокировка».

Посмотрите на pt-online-schema-change и gh-ost как способ изменения таблицы, даже когда ей нужно "скопировать". Это по существу неблокирующие. Однако я не знаю, можно ли их использовать с RDS. Кроме того, из-за JOINs и других случаев, когда одна таблица может быть согласована с другой, эти инструменты могут оказаться непрактичными.

Другой подход ... Добавить еще один столбец (столбцы); измените код, чтобы использовать как старый, так и новый столбец (столбцы). Тем временем постепенно копируйте старые значения в новый столбец (столбцы); когда это закончится, измените свой код снова - на этот раз, чтобы использовать новый столбец (столбцы) вместо старого. Позже, подумайте о том, чтобы отбросить мертвые столбцы.

В последних версиях MySQL произошли значительные изменения в скорости ALTER, поэтому обязательно изучите, из какой версии получена RDS. В 5.6 ADD COLUMN можно использовать ALGORITHM=INPLACE; в 8,0 ALGORITHM=INSTANT. Я думаю, что любой из них не является "блокировкой" для ваших целей (DROP COLUMN недешево; проблемы с JOIN и индексами перестройки все еще обсуждаются.)

Если вы попробуете один из этих методов, я настоятельно рекомендую вам создать таблицу с минимум миллионами строк и попробовать все шаги (изменить, добавить, воссоздать индекс, изменить столбец и т. Д.), Чтобы проверить, какие части «достаточно быстро» и / или «не блокируется».

...