среда, 16 декабря 2020 г.

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

После очередного обновления в веб-интерфейсе Zabbix появилось сообщение
Неподдерживаемая кодовая страница или тип сравнения для таблиц: < длинный список таблиц >
то же самое на английском
Unsupported charset or collation for tables: < длинный список таблиц >
и в логе
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
Это происходит из-за того, что в базе данных MySQL используется кодировка отличная от utf-8. Исправляется это буквално за несколько минут.

Возвращемся на версию Zabbix до неудачного обновления. В теории это должно сработать и без отката на предыдущую версию.
Для восстановления нормального функционирования нужно остановить Zabbix-server
systemctl stop zabbix-server
После этого нужно сгенерировать скрипт конвертации базы данных, для этого понадобится выполнить 2 запроса к БД.
SELECT CONCAT('ALTER TABLE ',
    table_schema,
    '.',
    table_name,
    ' COLLATE=utf8_bin;') AS cmd
FROM   (SELECT table_schema,
     table_name,
     table_collation
FROM   information_schema.tables t
WHERE  table_schema = 'zabbix'
     AND table_collation != 'utf8_bin') AS tables
ORDER  BY cmd;

SELECT CONCAT('ALTER TABLE ',
    table_schema,
    '.',
    table_name,
    ' MODIFY COLUMN ',
    column_name,
    ' ',
    column_type,
    ' CHARACTER SET utf8 COLLATE utf8_bin',
    defaultval,
    nullable,
    ';') AS cmd
FROM   (SELECT table_schema,
     table_name,
     column_name,
     collation_name,
     character_set_name,
     column_type,
     column_default,
     CASE
       WHEN column_default IS NULL THEN ''
       ELSE CONCAT(' DEFAULT ''', column_default, ''' ')
     END AS defaultval,
     CASE
       WHEN is_nullable = 'NO' THEN ' NOT NULL '
       ELSE ''
     END AS nullable
FROM   information_schema.columns
WHERE  table_schema = 'zabbix'
     AND ( collation_name != 'utf8_bin'
            OR character_set_name != 'utf8' )) AS cols
ORDER  BY cmd;
Текст запросов сохраним в файл /tmp/alter.sql, а результат его выполнения в /tmp/fix.sql. Выполним запросы к базе данных с именем zabbix и получим файл с командами конвертации таблиц.
mysql -hlocalhost -uzabbix -pzabbixpass zabbix < /tmp/alter.sql > /tmp/fix.sql
Имя пользователя, пароль и адрес сервера можно посмотреть в файле zabbix.conf.php.

В результате файл /tmp/fix.sql будет содержать список sql-запросов, но помимо полезного там будет две строки, содержащих заголовок столбца cmd, которые нам не нужны. Поэтому удалим их из файла
ex +g/cmd/d -cwq /tmp/fix.sql
Теперь выполним конвертацию базы данных
mysql -hlocalhost -uzabbix -pzabbixpass zabbix < /tmp/fix.sql
Когда выполнение скрипта будет завершено, на всякий случай укажем кодировку базы данных по умолчанию.
mysql -hlocalhost -uzabbix -pzabbixpass zabbix

MiraDB> ALTER DATABASE `zabbix` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
Всё готово, запускаем Zabbix-server
systemctl start zabbix-server
Проверяем, что всё хорошо, и пробуем снова обновить Zabbix.

Комментариев нет:

Отправить комментарий