не може увійти як користувач mysql root із звичайного облікового запису користувача в ubuntu 16.04


203

Я тільки що встановив Ubuntu 16.04 LTS разом з пакетами php, mariadbі nginx. Я біг mysql_secure_installationі змінив корінний пароль.

Тепер, коли я намагаюся увійти до mysqlвикористання кореневого облікового запису під час входу в Ubuntu як звичайний обліковий запис користувача, мені стає відмовлено у доступі.

Коли я входжу за допомогою sudo mysql, mysql навіть не запитує мені пароль. Якщо я запускаю, mysql_secure_installtionя бачу, що старі налаштування ніколи не встановлюються назавжди.

Що я роблю неправильно?

Відповіді:


359

Нещодавно я оновив свій Ubuntu 15.04 до 16.04, і це спрацювало для мене:

  1. Спочатку підключіться до sudo mysql

    sudo mysql -u root
    
  2. Перевірте свої акаунти, наявні у вашому db

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Видаліть поточний акаунт root @ localhost

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Відтворіть свого користувача

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Дайте дозволи своєму користувачеві (не забудьте очистити привілеї)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. Вийдіть з MySQL і спробуйте підключитися без sudo.

Сподіваюся, це комусь допоможе :)


16
Це єдине, що працювало для мене, чи хтось точно знає, що сталося з користувачем root під час встановлення mysql-сервера 16.04?
Руггі

32
Затримайте, чи не %означає, що ви можете підключитися з будь-якого місця ... віддалено?
Стіві Г

9
Ви можете змінити рядок на: CREATE USER 'root' @ 'localhost' IDENTIFIED BY '';
владнев

11
Що стосується безпеки: схема незахищеного root @ localhost mysql є схемою з'єднання хліба та масла, яка є основним місцевим розвитком, але не повинна з’являтися абсолютно ніде більше.
Чарні Кей

5
Звернення дозволу для нового користувача root тут не дає "з дозволом " на root, тому root не може надати, не виконуючи це після цього: dba.stackexchange.com/a/62046/115679 Будь ласка, змініть заяву про дозвіл наgrant all privileges on *.* to 'root'@'localhost' with grant option;
Лорен

132

Якщо ви встановите 5.7 і не надасте користувачеві пароль root, він використовуватиме auth_socketплагін. Цей плагін не хвилює і не потребує пароля. Він просто перевіряє, чи користувач підключається за допомогою сокета UNIX, а потім порівнює ім'я користувача.

Взято із зміни пароля користувача в MySQL 5.7 із "плагіном: auth_socket"

Отже, щоб змінити pluginспинку на mysql_native_password:

  1. Увійти через sudo:

    sudo mysql -u root
    
  2. Змініть pluginі встановіть пароль однією командою:

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

Звичайно, ви також можете скористатись командою, вказаною вище, щоб встановити порожній пароль.

Тільки для запису, (і MariaDB < 10.2користувачів) є також інший спосіб змінити лише pluginбез надання пароля (залишити його порожнім):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;

2
Дякую, чомусь це встановилося автоматично раптово після оновлення apt-get, я думаю ...
Tominator

4
Також мені більше подобається ця відповідь - вона набагато менш руйнівна ;-)
benzkji

3
Для MariaDB <10.2, змінити плагін разом з паролем, ось запит: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;Джерело: stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu

5
Це має бути прийнята відповідь
Гео C.

3
Я хотів би, щоб я міг проголосувати за це двічі.
Джеймс Сміт

21

Словом, на MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

де ви замінюєте NEWPASSWORD потрібним паролем, а все інше дослівно.

Проблема тут полягає в тому, що коли MariaDB або MySQL встановлюються / оновлюються (особливо якщо в якийсь момент корінь встановлений без пароля), тоді в таблиці Користувач пароль фактично порожній (або ігнорується), а вхід в систему залежить від відповідного користувача системи користувачеві MySQL. Ви можете перевірити це наступним чином, перейшовши на системний корінь, а потім введіть:

mysql -uroot -p

Потім введіть або немає пароля, або неправильний пароль. Ви, мабуть, ввійдете. (Можливо, ви навіть зможете увійти в систему з кореня unix просто, # mysqlоскільки пароль не має значення та визначено користувача).

Отже, що відбувається? Добре, якщо ви увійдете як root і виконайте наступне:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

ви помітите auth_socket(що може читати unix_socketна MariaDB). Ці сокети ігнорують паролі та дозволяють відповідному користувачеві Unix без перевірки пароля. Ось чому ви можете увійти в систему за допомогою root, але не з іншим користувачем.

Таким чином, рішення полягає в тому, щоб оновити Користувачів, щоб вони не використовували auth_socket/unix_socketі правильно встановили пароль.

Для MariaDB (<10.2, див. Коментарі нижче), що є версією Ubuntu 16 станом на 2017 рік, цього має бути достатньо. NEWPASSWORD - ваш пароль. mysql_native_passwordВи набираєте дослівно

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(Цілком можливо, що встановлення плагіна на порожній спрацювало б. YMMV. Я цього не пробував. Тому це альтернатива.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Інакше:

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

Тоді

FLUSH PRIVILEGES;

Для запису, рішення, пов’язане з видаленням користувача та відтворенням його за допомогою "%", мене повністю заблокувало з бази даних і може спричинити інші проблеми, якщо ви не отримаєте grantтвердження точно правильно - простіше просто оновити корінь, який у вас уже є.

На мій досвід, проблема трапляється лише з користувачем root, оскільки інші користувачі будуть додані вручну, не є частиною початкової установки / оновлення.


2
Виявив, що це прекрасно працює. Мене здивує, хоча чому зміна пароля root mysql_secure_installationне мала однакового ефекту. Де він зберігає новий пароль?
Mausy5043

Чи можете ви відредагувати свою відповідь і сказати більше про кожну з команд під час руху? Мені не зрозуміло, які застосовні. Це два UPDATEs, які застосовуються до MariaDB <10.2 та ALTERінших версій? А друга UPDATEальтернатива першому чи нам потрібно вводити обидва? Нарешті, чи 'mysql_native_password' щось набирає дослівно, або ми повинні замінити його на наш призначений кореневий пароль для MySQL?
Майкл Шепер

1
@MichaelScheper Настав час назад, тому я не хочу занадто багато редагувати, але ось що я пам’ятаю. (1) Зробіть лише перше ОНОВЛЕННЯ (<10.2 може не бути вимогою). (2) Так, введіть дослівно 'mysql_native_password'. По суті, те, що ви робите, - це сказати mariadb: "Не використовуйте привілеї Unix, використовуйте привілеї до бази даних". Це mysql_native_passwordтакий варіант.
Газері

Чорт я неправильно написав "привілей"!
Газері

1
Схоже, ви також пропустили обмеження часу редагування лише на півтори хвилини! Мене часом це також засмучує. Так чи інакше, дякую!
Майкл Шепер

8

Якщо ви встановили MySQL / MariaDB з базового сховища, користувачі не можуть увійти в MySQL як кореневий користувач MySQL зі своїх логін Unix (не застосовується, якщо вони мають доступ до sudo )

  1. Увійдіть до кореневої оболонки MySQL:

    $ sudo mysql -u root -p
    
  2. Виконайте нижче запити:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Відкрийте нову оболонку, потім:

    $ mysql -u root -p
    

Джерело


Коли я це зробив, я більше не міг подавати mysql як root. Спочатку я повинен був су, а потім міг увійти в mysql як root. Тому я змінив його назад на auth_socket.
до

Єдина команда:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Кріс Стричинський

Якщо ви хочете втратити доступ до свого екземпляра MySQL, тоді ця відповідь - простий спосіб.
Даніла Вершинін

2

Спробуйте створити новий обліковий запис mysql, для мене це спрацювало (mysql 5.7.12):

  1. Увійти як судо:

    sudo mysql -uroot
    
  2. Створіть нового користувача та надайте йому привілеї (без пароля):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Увійти як новий користувач:

    mysql -uadmin
    

2

Мені довелося зробити дві речі (завдяки @Todor та @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

і потім:

FLUSH PRIVILEGES;

Я б не рекомендував скидати користувача root.


1

Спробуйте спочатку цей код,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

і потім,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

потім натисніть Ctrl+Zі введіть: bgщоб запустити процес із переднього плану на задній план, а потім підтвердіть доступ:

mysql -u root -proot
mysql> show grants;

1

Якщо ви просто запустили команду mysql під користувачем root, вам буде наданий доступ без запиту пароля, оскільки автентифікація сокета включена для root @ localhost. .

Єдиний спосіб встановити пароль - це перейти до нативної автентифікації, наприклад:

$ sudo mysql

mysql> ALTER USER 'root' @ 'localhost' ІДЕНТИФІКОВАНО З mysql_native_password BY 'test';


0

Я адаптував деякі сценарії резервування, створені для використання MariaDB, і зіткнувся з цією проблемою. Збираючи разом багато інформації тут, відповідь Gazzer справді нульовий у питанні; все це зводиться до auth_socket/ unix_socketналаштування.

Тож, використовуючи MariaDB 5.5 (під Ubuntu 14.04) та MariaDB 10 під (Ubuntu 16.04), вхід у MySQL та запуск цієї команди очистили речі відразу:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Інші відповіді - включаючи найвищу відповідь на цю посаду від Loremhipsum - дійсно заохочують погані практики, рекомендуючи відмовитись від користувача та потім відтворити їх. Для мене це досить радикальне рішення. Найкраще / найпростіше рішення os звести нанівець pluginзначення, розмити привілеї та продовжувати життя.


-1

У мене була та сама проблема, і виконано таке виправлене:

mysql_upgrade --force

На жаль, це не спрацювало. Я перевстановлюю ubuntu.
кодоскоп

1
Я щойно зробив нову установку ubuntu 16.04 та встановив mariad-сервер. Після встановлення я запустив mysql_secure_installation і встановив пароль. Пройшовши решту кроків у mysql_secure_installation, я запустив його ще раз, і схоже, що це не економить зміни. Я все одно не можу увійти зі свого звичайного облікового запису користувача Чи може це бути помилка?
кодоскоп

Це ніколи не допоможе. Проблема не має нічого спільного з фактичним встановленням двійкового файлу MariaDB, але, скоріше, з користувачем root, встановленим pluginнестандартними налаштуваннями. Єдиний крайній випадок, коли оновлення БД могло б допомогти у такому випадку, якщо сам mysql_upgradeпроцес відповідає тому pluginпараметру, в якому я сумніваюся.
JakeGould
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.