После обновления MySQL с версии 5.6 до 5.7 я не могу войти в систему как root:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
В журнале я нашел следующее:
2016-10-26T10:23:01.845088Z 0 [Warning] User entry 'root'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845112Z 0 [Warning] User entry 'mysql.sys'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845127Z 0 [Warning] User entry 'debian-sys-maint'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845142Z 0 [Warning] User entry 'phpmyadmin'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845155Z 0 [Warning] Some of the user accounts with SUPER privileges were disabled because of empty mysql.user.plugin value. If you are upgrading from MySQL 5.6 to MySQL 5.7 it means we were not able to substitute for empty plugin column. Probably because of pre 4.1 password hash. If your account is disabled you will need to:
2016-10-26T10:23:01.845183Z 0 [Warning] 1. Stop the server and restart it with --skip-grant-tables.
2016-10-26T10:23:01.845192Z 0 [Warning] 2. Run mysql_upgrade.
2016-10-26T10:23:01.845200Z 0 [Warning] 3. Restart the server with the parameters you normally use.
2016-10-26T10:23:01.845207Z 0 [Warning] For complete instructions on how to upgrade MySQL to a new version please see the 'Upgrading MySQL' section from the MySQL manual
2016-10-26T10:23:01.853461Z 0 [Note] Event Scheduler: Loaded 0 events
2016-10-26T10:23:01.853962Z 0 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.7.16-0ubuntu0.16.04.1' socket: '/var/run/mysqld/mysqld.sock' port: 3306 (Ubuntu)
2016-10-26T10:23:02.138961Z 2 [Note] Access denied for user 'root'@'localhost' (using password: NO)
Поэтому я сделал, как было предложено: остановил сервер:
> service mysql stop
Запустил его с пропущенными таблицами грантов:
> sudo mysqld_safe --skip-grant-tables
Когда mysqld_safe запущен с параметром --skip-grant-tables, я могу войти в систему как root, но только до тех пор, пока не закрою терминал, на котором он запущен (он не работает как демон, а останавливается при закрытии терминала).
Затем я запустил mysql_upgrade, как было предложено (в другом терминале)
> sudo mysql_upgrade
И это улучшило мои столы.
Я закрыл терминал, где работал mysqld_safe, остановил сервер mysql (service mysql stop). Мне пришлось убить все экземпляры mysql, потому что в противном случае я получал полный журнал следующих ошибок:
2016-10-26T10:40:54.073975Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
2016-10-26T10:40:54.074060Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
Затем я снова запустил MySQL:
> service mysql start
и получил тот же результат, что и выше (Отказано в доступе для пользователя 'root'@'localhost' (использование пароля: НЕТ))
Как это исправить? Я уже несколько часов с этим борюсь, и любая помощь будет оценена по достоинству!
решение1
У меня была такая же проблема, когда я обновил Ubuntu с 14.04 до 16.04. Мне было лень следовать вашему совету (экспортировать базы данных и начать заново), поэтому я в итоге сделал это, чтобы исправить проблему!
Остановите mysql и запустите его без прав доступа
> sudo service stop mysql
> sudo mkdir /var/run/mysqld # needed to launch mysql in ubuntu from command line...may not apply to other distros
> sudo chown mysql:mysql /var/run/mysqld # same reason as above
> sudo mysqld_safe --skip-grant-tables
Затем в другом окне терминала:
> mysql -uroot
> select User, host, authentication_string,plugin from mysql.user; #see what users don't have a password (authentication_string and plugin are empty)
> update mysql.user set authentication_string=PASSWORD('woot') where user='user';
> update mysql.user set plugin='mysql_native_password' where user='user';
> FLUSH PRIVILEGES;
> exit;
Наконец, мне просто нужно было завершить работу временного экземпляра MySQL (mysqld_safe) и перезапустить его... На первом терминале
> ^\ #to tell the mysqld_safe process to quit itself
> sudo service mysqld start
решение2
Проблема заключалась в том, что значение плагина mysql.user было пустым для всех пользователей, включая debian-sys-maint, поэтому я даже не мог перенастроить пакет. Предполагалось, что это можно исправить, запустив mysql_upgrade, но по какой-то причине этого не произошло.
Поэтому я сделал дамп всех баз данных, полностью удалил сервер MySQL, а затем переустановил его и снова импортировал свои базы данных.
Сделайте дамп всех своих баз данных:
> mysqldump -u root -p --databases db1 db2 > alldb.sql
Это было довольно глупо с моей стороны, но я сделал дамп всех баз данных с помощью --all-databases. Он включал таблицу mysql.user, где все пользователи имели пустое значение "plugin", поэтому я столкнулся с той же проблемой после первого перезапуска службы mysql. Поэтому впоследствии я сделал дамп только для своих баз данных.
Дамп будет помещен в папку, из которой вы запустили команду.
Удалить MySQL и его настройки:
> sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.7 mysql-client-core-5.7
> sudo rm -rf /etc/mysql /var/lib/mysql
> sudo apt-get autoremove
> sudo apt-get autoclean
Установить MySQL:
> sudo apt-get install mysql-server
Импортируйте базы данных обратно:
> mysql -u root -p < alldb.sql