MySQL 5.7 и phpMyAdmin - не доступно редактирование привилегий

»»»

MySQL 5.7 и phpMyAdmin - не доступно редактирование привилегий

При установке phpMyAdmin на сервер с установленным MySQL Server 5.7 на вкладке "Привилегии" выводится ошибка:

Warning: Your privilege table structure seems to be older than this MySQL version!
Please run the script mysql_fix_privilege_tables that should be included in your MySQL server distribution to solve this problem!

 

На самом деле эта проблема не редкость и с ней очень часто сталкиваются при обновлении версии Mysql сервера.

Проблема возникла при переустановке сервера в ходе которой было решено обновить ряд компонентов.

После переустановки имеем сервер под управлением GNU/Linux Debian 7 Wheezy, Nginx+Аpache2.2.22, PHP 5.4.45, Mysql 5.7.19.

В целом обновление компонентов прошло без особых проблем, оно при установке phpMyAdmin версии 3.4.4 возникла вышеописанная проблема. В версиях 4.x.x phpMyAdmin вроде такой проблемы быть не должно, но для ее работы нужен PHP не ниже 5.5. По ряду соображений от повышения версии PHPпришлось отказаться.

В основном все решения по данной проблеме сводятся собственно к выполнению рекомендации выводимой на экран - выполнение апгрейда таблиц MySQL сервера скриптом mysql_fix_privilege_tables. Но, первое, апгрейд таблиц был произведен при установке сервера MySQL 5.7 скриптом mysql_upgrade, второе, скрипта mysql_fix_privilege_tables нет в составе пакета MySQL 5.6-5.7, его функционал выполняет mysql_upgrade.

Поиск решения завел к изучению исходного кода самого phpMyAdmin, и, было установлено, что проблема с Warning: Your privilege table structure seems to be older than this MySQL version! является проблемной самого phpMyAdmin, а не якобы старой структурой таблиц MySQL. Проблема кроется в том, что разработчики MySQL в версии выше 5.7.6 изменили поле хранения пароля пользоватлей в таблице `mysql.user`. Теперь это поле называется не `password`, а `authentication_string`. И именно phpMyAdmin об это не знает, а не то, что типа устаревший формат таблиц MySQL.

Для решения данной проблемы необходимо в директории phpmyadmin найти библиотеку server_privileges.php, найти следующий код:

if (empty($_REQUEST['adduser']) && (! isset($checkprivs) || ! strlen($checkprivs))) {
    if (! isset($username)) {
        // No username is given --> display the overview
        echo '

' . "n" . PMA_getIcon('b_usrlist.png') . __('User overview') . "n" . '

' . "n"; $sql_query = 'SELECT *,' . " IF(`Password` = _latin1 '', 'N', 'Y') AS 'Password'" . ' `mysql`.`user`'; $sql_query .= (isset($initial) ? PMA_RangeOfUsers($initial) : ''); $sql_query .= ' ORDER BY `User` ASC, `Host` ASC;'; $res = PMA_DBI_try_query($sql_query, null, PMA_DBI_QUERY_STORE);

И заменить его на следующий код:

if (empty($_REQUEST['adduser']) && (! isset($checkprivs) || ! strlen($checkprivs))) {
    if (! isset($username)) {
        // No username is given --> display the overview
        echo '

' . "n" . PMA_getIcon('b_usrlist.png') . __('User overview') . "n" . '

' . "n"; $password_column = 'Password'; if (PMA_MYSQL_INT_VERSION >= 50706) { $password_column = 'authentication_string'; } // $sql_query is for the initial-filtered, // $sql_query_all is for counting the total no. of users $sql_query = $sql_query_all = 'SELECT *,' . " IF(`" . $password_column . "` = _latin1 '', 'N', 'Y') AS 'Password'" . ' `mysql`.`user`'; $sql_query .= (isset($initial) ? PMA_RangeOfUsers($initial) : ''); $sql_query .= ' ORDER BY `User` ASC, `Host` ASC;'; $res = PMA_DBI_try_query($sql_query, null, PMA_DBI_QUERY_STORE);

Проблема решена.

Данное решение применено к phpMyAdmin 3.4.4, но вероятно подойдет для большинства низших версий.

Рейтинг

В этом разделе