MySQL, як виправити доступ у користуванні "root" @ "localhost"


123

Перш ніж я щось накручую, коли я входжу за допомогою $ mysql -u root -pта показую бази даних:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

Тоді я спробував створити нового користувача і помітив, що щось не так з ПРИВИЛЕГАМИ.

Тож я видалив нових користувачів, і, мабуть, випадково видалив 'root' та 'Admin'.

Потім я намагаюся створити "root" ще раз, але отримую помилку в доступі, відхилену при наданні всіх привілеїв.

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Якщо я знову ввійду в MySQL за допомогою $ mysql -u root -pта показую бази даних,

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

Усі інші бази даних пішли.

Як зараз виправити MySQL?

Я не можу знайти базу даних «mysql», не можу створити базу даних, створити користувача, все, що я намагаюся зробити, отримає помилку.

ПОМИЛКА 1045 (28000): Заборонено доступ користувача 'root' @ 'localhost' (з використанням пароля: ТАК).

Чи слід перевстановити MySQL за допомогою MacPorts? Якщо я переустановлююсь, я втрачу базу даних game_data, правда?


Спробуйте отримати доступ до сервера з 'root'@'127.0.0.1', що відрізняється від 'root' @ 'localhost'. Потім видайте команду створити користувачеві 'root' @ 'localhost' та надайте йому всі привілеї.
Джіммі

Також див. Як мати MySQL право кореневого користувача? на Super User. Він намагається уникнути скидання паролів.
jww

У мене просто було пробіл між -pпаролем. Я знаю, що це нерозумно, але може комусь допомогти.
Vinay Wadhwa

Відповіді:


132

Виконайте наведені нижче дії.

  1. Запустіть екземпляр або демон сервера MySQL за допомогою --skip-grant-tablesпараметра (налаштування безпеки).

    $ mysqld --skip-grant-tables
    
  2. Виконайте ці твердження.

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

Якщо ви зіткнулися з невідомим полем Помилка пароля вище:

update user set authentication_string=password('my_password') where user='root';
  1. Нарешті, перезавантажте екземпляр / демон без --skip-grant-tablesопції.

    $ /etc/init.d/mysql restart
    

Тепер ви маєте можливість мати з'єднання зі своїм новим паролем.

$ mysql -u root -p

Введіть пароль: my_password

Виправлення помилки "Неможливо заблокувати ibdata1" для MySQL

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart

1
"$ mysqld --skip-grant-Table" та "InnoDB: Не вдається заблокувати.

дивіться моє оновлення вище
Йогус

Я виявив, що зупинка mysql перед видачею 1-ої команди зупиняє помилку блокування від служби mysql stop
Frank Tzanabetis,

7
Мабуть, стовпець "пароль" більше не існує ... його було замінено на "authentication_string". Отже, рядок оновлення пароля тепер: UPDATE SET SET authentication_string = PASSWORD ('my_password'), де USER = 'root';
jdmcnair

1
Дякую! І зараз мені цікаво: що могло це спричинити? У Windows?
Ілля Андрієнко

64

Ніщо з перерахованого вище не було для мене корисним. Я виявив, що потрібно очистити метод плагіна. У 5.6 я міг зробити:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;

У 5.7 я виявив, що мені потрібно:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='mysql_native_password' where User='root';
[mysql] flush privileges;

Згідно з документами, з плагіном, встановленим в порожній рядок, він повинен був фактично встановити за замовчуванням mysql_native_password, але може заплутатися порожній хеш пароля. Для більш детального нюансу ви можете прочитати документацію тут: https://dev.mysql.com/doc/refman/5.7/uk/native-authentication-plugin.html


5
Це вирішило це для мене. Коли я подивився на статус демона mysql, побачив це попередження: "[Попередження] 'користувач' запис 'root @ localhost' вказано як пароль, так і плагін для автентифікації. Пароль буде проігноровано." Встановлення плагіна на "" дозволило мені знову увійти. Дякую, @Mario Flores
SpacePope

Мій плагін був порожнім. Найсмішніше, що вона автоматично змінюється на порожню. Зауважте, що я говорю про встановлення на моєму персональному комп’ютері, де я використовую dist-модернізацію, так що це може бути причиною зриву root-користувача.
Друг Кіма

2
set plugin='mysql_native_password'зробив це для мене, дякую! Для довідки: dev.mysql.com/doc/refman/5.7/en/…
Koen.

Чому це все ще залишається проблемою для встановлення встановлених пакетів у 2018 році?
mckenzm

1
ubuntu 18, і спрацювало
Рахал Канішка

8

Також переконайтеся, що необхідний запис у таблиці userмає порожнє pluginполе (може бути, наприклад, "unix_socket").

Оскільки версія 5.5.7 mysql підтримує різні розширення для автентифікації https://dev.mysql.com/doc/refman/5.6/uk/authentication-plugins.html

Отже, якщо у вас є не порожнє pluginполе, тоді пароль буде ігноровано, і в журналі журналу помилок mysql буде попереджено (для мене це /var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.


1
Для когось іншого, хто працює над цим, під час запуску mysql-сервера 5.7.15, це фактично блокує вашого користувача, якщо ви не надаєте плагін. Можливо , то , що ви шукаєте це pluginз mysql_native_password.
Джонатан Кантрелл

8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

Ви можете побачити щось подібне;

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

Забезпечення розгортання сервера MySQL.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

Якщо ви бачите, це говорить

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

Перегляньте останні 10 хвилин цього відео , воно вчить, як ви це робите.


Хоча це може відповісти на запитання, ви повинні дати більш детальний опис пов’язаного змісту та пояснити, як він пов’язаний із запитанням. Це допоможе гарантувати, що ця відповідь залишається корисною у випадку, якщо пов’язана сторінка буде видалена або перейде в режим офлайн. Докладнішу інформацію див. У цій статті Meta Stack Exchange .
bwDraco

Це я бачив такий випадок використання, я встановлюю mysql на RHEL7 в AWS з Ansible, і я отримую таку ж поведінку після перенастроювання та перезавантаження БД. Чи знаєте ви, чому це відбувається в першу чергу, це блокування доступу Ansible до локального mysqld і налаштування його. Це лише для тестування.
einarc

Мабуть, це залежить від того, як ви ініціалізуєте сервер, подивіться на крок 4 тут: dev.mysql.com/doc/refman/5.7/en/…
einarc

3

Спробуй це:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;

6
Чи можете ви описати, що --no-defaults --forceроблять перемикачі? В іншому випадку це копія VLQ вищезазначеної, прийнятої відповіді.
Канадський Люк,

@CanadianLuke без значень за замовчуванням пропускає будь-які файли конфігурації, які вони в іншому випадку включатимуть, примусово продовжує роботу, навіть якщо будь-яка з виданих команд SQL не працює. Якщо ви сумніваєтесь, перевірте інструкцію
девкаліон

3
Це потрібно відредагувати у відповідь
канадський Люк,

2
Я отримуюERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Джонатан


3

У моєму випадку у мене була пошкоджена база даних, після перезавантаження mysql на Debian кореневий логін був без пароля. Рішення було таким:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';

У деяких інших відповідях також згадується плагін native_password, але це так, як ви можете це зробити без складних роздумів. Ось як це мається на увазі змінити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.