Вопрос или проблема
Окей, я уперся в стену и у меня закончились идеи.
Master: 8.0.25-0ubuntu0.20.04.1
Slave: 5.7.33-0ubuntu0.16.04.1-log
Получаю ошибку с show slave status\G
:
Last_SQL_Errno: 22
Last_SQL_Error: Error 'Character set '#255' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file' on query. Default database: 'db'. Query: 'BEGIN'
Я мигрирую свой мастер-сервер на новый хост, что означает, что на нем произошло много обновлений. Slave прежний сервер, который использовался раньше, и он не изменился.
Я попробовал
-
reset slave all
и добавил зановоchange master to
-
обновить файлы my.cnf на мастере и слейве, чтобы включить:
[client]
default-character-set=utf8[mysqld]
character-set-server=utf8
collation-server=utf8_unicode_c -
вручную обновить колляцию базы данных на обеих сторонах до utf8
У меня закончились идеи.
На версии 8.0 множество новых колляций. При репликации вы должны использовать подмножество, доступное на 5.7 (в любом направлении).
Пожалуйста, предоставьте SHOW CREATE TABLE
на соответствующей таблице.
Но, я вижу, что это может быть SHOW SLAVE STATUS
? В таком случае, подайте отчет о баге: bugs.mysql.com и надейтесь, что они не скажут вам уйти из-за смешивания 8.0 и версии до 8.0 в репликации.
Ответ или решение
Ошибка, с которой вы столкнулись, связана с несовместимостью кодировочных наборов между различными версиями MySQL на вашем мастере и слейве. Вы используете MySQL 8.0.25 на мастере и MySQL 5.7.33 на слейве, что является проблемой, поскольку MySQL 8.0 имеет расширенный набор кодировок и сопутствующих колляций, которые отсутствуют в MySQL 5.7. Это отличие приводит к ошибке "Character set ‘#255’ is not a compiled character set and is not specified in the ‘/usr/share/mysql/charsets/Index.xml’ file".
Теория
В MySQL 8.0 было представлено множество новых возможностей и улучшений, включая обновлённые и новые наборы символов и колляции. Каждый набор символов имеет свой идентификационный номер (ID), который уникален в пределах версии. Наборы символов и колляции, которые доступны в MySQL 8.0, не обязательно поддерживаются более старыми версиями, такими как MySQL 5.7.
Когда вы пытаетесь реплицировать данные между этими версиями, возникает риск того, что набор символов или колляция, используемая на мастере, не будет распознана на слейве, что и вызвало вашу текущую проблему. Набор символов с ID #255 на мастере не компилирован в системе символов слейва.
Пример
При выполнении репликации данные поступают из мастера в слейв. Если данные или команда, например, BEGIN
, используют набор символов или колляцию, не поддерживаемые на слейве, MySQL выдаст ошибку, как в вашем случае. Ваша проблема усугубляется тем, что обновления на мастере увеличили количество доступных наборов символов и колляций, что не сочетается с более старыми версиями.
Вы указываете, что уже предприняли шаги, чтобы изменить настройки конфигурации my.cnf
, установив character-set-server=utf8
и collation-server=utf8_unicode_ci
. Однако этого, видимо, оказалось недостаточно для решения проблемы, так как ошибка всё ещё возникает.
Применение
-
Одинаковое соответствие версий MySQL: Лучшим решением будет обновление вашего слейва до версии MySQL 8.0, чтобы она соответствовала версии мастера. Это поможет исключить проблемы с несовместимостью наборов символов и колляций. Однако, немногие организации могут легко перейти на новую версию, особенно если это затронет связанную инфраструктуру.
-
Сужение используемых сетов и колляций: Если обновление невозможно, ограничьте использование новых наборов символов и колляций, которые поддерживаются и в MySQL 5.7. Потребуется убедиться, что все таблицы и базы данных используют только те наборы символов, которые существуют и на слейве. Для этого выполните
SHOW CREATE TABLE
для всех таблиц, чтобы определить, какие колляции используются, и при необходимости измените их. -
Отправка отчёта об ошибке: в зависимости от конфигурации репликации и критичности задачи, отправьте отчёт об ошибке на bugs.mysql.com для профессиональной поддержки. Они могут предложить исправление или обходной путь.
-
Тестирование конфигурационных изменений: Введите все изменения в тестовой среде перед применением в производственной среде, чтобы исключить возможные инциденты при непрерывной работе системы.
Резюмируя, необходимо тщательно анализировать и приводить в соответствие все сетевые конфигурации и используемые колляции, чтобы избежать подобных проблем в будущем. Данная ситуация демонстрирует важность внимательной работы с различиями версий и подготовки к обновлению критически значимых систем.