Ошибка в Zabbix - Неподдерживаемая кодовая страница

Некоторое время назад столкнулся с ошибкой в web интерфейсе Zabbix после очередного обновления сервера. Текст ошибки в веб интерфейсе - Неподдерживаемая кодовая страница или тип сравнения для таблиц. То же самое было на английском языке в логе - character set name or collation name that is not supported by Zabbix found in 379 column(s) of database "zabbix", only character set "utf8" and collation "utf8_bin" should be used in database.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Выглядела ошибка вот так.

Неподдерживаемая кодовая страница или тип сравнения для таблиц

В принципе, по тексту ошибки все понятно. Таблицы в базе данных почему-то имеют не ту кодировку, которая нужна. Работает при этом все нормально. Операционная система - Centos 8.

character set name or collation name that is not supported by Zabbix found in 379 column(s) of database "zabbix"

Стал решать проблему в лоб. Взял и изменил кодировку у всех таблиц в базе данных Zabbix. На деле это оказалось не такой простой задачей, как виделось изначально. В итоге поступил следующим образом. Вводим в консоли Mysql следующую команду:

SELECT CONCAT(  'ALTER TABLE `', t.`TABLE_SCHEMA` ,  '`.`', t.`TABLE_NAME` ,  '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;' ) AS sqlcode
FROM  `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` =  'zabbix'
ORDER BY 1
LIMIT 0 , 180;

Работа этой команды сформирует на выходе набор из команд для перекодировки каждой таблицы в отдельности. Их нужно все запустить. Если делать все через phpmyadmin, то не возникает проблем. Все команды копируются разом и исполняются. Если будете делать через консоль сервера, то придется как-то обрабатывать вывод, чтобы подать его потом на вход. Надо будет от лишних символов очищать.

Не забудьте сделать бэкап базы данных перед тем, как начнете с ней что-то делать.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

10 комментариев

  1. Кстати, скрипт не все таблицы переделывает, у меня почему то половина осталась со старой кодировкой. :(

    • Скрипт просто формирует вывод, состоящий из команд на смену кодировки для каждой базы. Он сам ничего не делает. Вы вручную потом команды исполняете.

      • Да я понимаю, просто он выдает не все таблицы в базе. проблема была в "LIMIT 90 , 180;" она ограничивала количество выводимых строк.

        Если сделать так:

        SELECT CONCAT(  'ALTER TABLE `', t.`TABLE_SCHEMA` ,  '`.`', t.`TABLE_NAME` ,  '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;' ) AS sqlcode
        FROM  `information_schema`.`TABLES` t
        WHERE 1 AND t.`TABLE_SCHEMA` =  'zabbix'
        ORDER BY 1 into outfile '/var/lib/mysql-files/conv.sql';

        То получится готовый sql файлик, который можно запустить:
        source /var/lib/mysql-files/conv.sql

        все это просто из консоли mysql

        • Оу, я ошибся. Надо было не 90 , 180 ставить, а 0, 180. А так он только с 90-й таблицы подготовил вывод.

          • А зачем там вообще это ограничение?

            • Из другой задачи пришло. Там нужно было разделить на части, так как не удобно было работать с большим списком. Я просто взял готовый вариант.

  2. По документации база должна быть в UTF8/utf8_bin если отличаются, при робновлении будет большой геморрой - неоднократно сталкивался.

  3. utf8mb4 универсальнее. И сейчас по-дефолту в mysql\mariadb. Индексы, конечно, место будут занимать больше, но это плата за универсальность.

    • С этой кодировкой я и получил описанную ошибку. Как раз дефолтные настройки базы стояли.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar