Неможливо скинути кореневий пароль MySQL (MariaDB)


35

Сьогодні я хотів створити базу даних в PMA. Тут було сказано: "Неможливо увійти на сервер MySQL". Я спробував через термінал, така ж проблема, і це тому, що мій пароль неправильний. І я не можу зрозуміти, чому.

Я спробував звичайний метод скинути пароль root (пропустити монтаж таблиць грантів та скинути паспорт), але, здається, це не працює.

Бачиш це:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Відповіді:


56

Я знайшов рішення, яке так само дивно, як і сама проблема.

Перезавантажте MySQL / MariaDB, використовуючи --skip-grant-tables(пошук навчальних посібників в Інтернеті). (зовсім не обов’язково, читайте мої зміни в кінці публікації)

Подивіться на pluginполе в mysql.userтаблицю:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

Мені довелося скинути поле плагіна кожного запису до порожнього рядка.

UPDATE user SET plugin="";   // without WHERE clause

Також переконайтеся, що визначено пароль, оскільки іноді він, здається, стирається (виберіть на user, passwordполях). Якщо ні, оновіть його за допомогою:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

Параметри привілеїв потрібно зберігати явно:

FLUSH PRIVILEGES;

Потім перезапустіть MySQL у звичайному режимі, і ви зможете підключитися до кореневого облікового запису.

Це не обов'язково відключить з'єднання через сокет Unix. Після мого ремонту MySQL у PMA я можу побачити, що з'єднання встановлюється через сокет Unix.

EDIT , кілька місяців пізніше: Зараз у мене звикли часто виникати ці проблеми, я думаю, що під час кожного оновлення MariaDB (або чогось подібного). Тому я краще зрозумів проблему; є плагін UNIX_SOCKET, який дозволяє вам входити в обліковий запис MariaDB, не створюючи пароль, оскільки він використовує облікові дані оболонки, щоб довіряти вам, не вводячи жодного пароля. Насправді цей плагін є плагіном аутентифікації, а не методом зв'язку з SQL-сервером. Таким чином, ви можете сміливо відключити його, якщо ви не використовуєте unix socket як метод входу. Єдине, що я не можу пояснити - це те, чому плагін UNIX_SOCKET регулярно встановлюється для кожного облікового запису бази даних, без жодних дій з моєї сторони.

Це має гарний побічний ефект, що, коли це трапляється, ви можете увійти на SQL-сервер, не перезавантажуючи MariaDB за допомогою --skip-grant-tables: просто увійдіть у кореневий обліковий запис системи, потім просто підключіться mysql -u rootбез пароля, а потім скиньте поле плагіна в спосіб це пояснено вище.

EDIT 2: Підтверджено, це відбувається під час кожного оновлення MariaDB на Ubuntu.


1
Це порушує завдання обслуговування Cron на Ubuntu 16.04 (принаймні), тому що цей сценарій очікує входу без пароля за допомогою плагіна Socket. Докладніше див. На сайті superuser.com/questions/957708/… .
колан

Гаразд, цікаво, але цього більше не відбувається (налаштування моїх застарілих паролів зараз не ламається випадково). Можливо, тепер плагін Unix socket встановлений лише для кореневого користувача? Неможливо перевірити це прямо зараз. Але мені не подобається думка, що ОС вирішує для мене, яку настройку аутентифікації використовувати.
Морган Тувері Квілінг

Ця проблема відмінна, це сталося на Debian 9, не було запитано кореневий пароль, коли я встановив MariaDB, і я навіть не зміг його скинути. Сподіваюся, це не повториться після оновлення. Чи слід замінити MariaDB на MySQL, щоб уникнути подібних проблем?
baptx

Не впевнений, що це все ще відбувається, можливо, це було виправлено зараз (я можу редагувати публікацію, якщо хтось знає). Можливо, це відбувається лише під час встановлення, що було б гарною установкою за замовчуванням.
Морган Тувері Квілінг

1
Я щойно помітив, що якщо ми не використовуємо плагін unix socket для кореневого користувача, він не зможе встановити phpmyadmin пакет на останній Debian : ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Тож найкращим рішенням є продовження використання автентифікації сокета за замовчуванням за допомогою команди sudo mysql -u root, яка, на мою думку, є також більш безпечною та ефективною.
baptx

5

З цієї відповіді http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql намагається автентифікувати root за допомогою плагіна, а не пароля. Потрібно відключити використання плагіна для root.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
Саме це я і написав як відповідь.
Morgan Touverey Quilling

1
Це трохи більш стислий збір із вашим оновленням.
поні

Я навіть не можу отримати команду mysql, тому це не спрацює в моєму випадку, навіть якщо я бачу Could not open mysql.plugin table.в журналі помилок.
Дейв Еверітт

0

Підключіться, як описано раніше:

mysqld_safe --skip-grant-tables

Файл журналу буде показано:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

Перелічений журнал пошуку (у цьому випадку: /usr/local/mysql/data/ab123456.domain.com.err) для правого сокета:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

і використовувати його в mysql-з'єднанні:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

Я просто дістаюсь, $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/varале мене просто відкидають на підказку.
Дейв Еверітт

0

За замовчуванням marriadb використовує плагін автентифікації "unix_socket" для встановлення паролів, це має бути "mysql_native_password", тому

комутація бази даних ..

use mydatabase;

першим див. плагін відьом.

SELECT user, plugin FROM user;

встановіть його на "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

встановити новий пароль ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.