не может войти как пользователь root mysql из учетной записи обычного пользователя в Ubuntu 16.04


203

Я только что установил Ubuntu 16.04 LTS вместе с пакетами php, mariadbи nginx. Я запустил mysql_secure_installationи изменил пароль root.

Теперь, когда я пытаюсь войти в систему с mysqlиспользованием учетной записи root, когда вы вошли в Ubuntu как обычная учетная запись пользователя, я получаю доступ запрещен.

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

Что я делаю неправильно?

Ответы:


359

Я недавно обновил свой Ubuntu 15.04 до 16.04, и это сработало для меня:

  1. Сначала подключитесь в sudo mysql

    sudo mysql -u root
    
  2. Проверьте ваши счета в вашей базе данных

    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 с помощью «plugin: 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
Это должен быть принятый ответ
Geo C.

3
Я хотел бы проголосовать за это дважды.
Джеймс Смит

21

Короче, на MariaDB

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

где вы заменяете NEWPASSWORD на нужный вам пароль, а все остальное дословно.

Проблема здесь в том, что когда MariaDB или MySQL установлены / обновлены (особенно если в какой-то момент root установлен без пароля), тогда в таблице Users пароль фактически пуст (или игнорируется), и вход в систему зависит от пользователя системы, соответствующего пользователю 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

Можете ли вы отредактировать свой ответ и сказать больше о каждой из команд по ходу дела? Я не ясно, какие из них применимы. Это два UPDATEс, которые применяются к MariaDB <10.2 и ALTERдругие версии? И является ли второй UPDATEальтернативой первому, или нам нужно ввести оба? Наконец, «mysql_native_password» - это что-то для дословного ввода, или мы должны заменить его нашим предполагаемым паролем root для MySQL?
Майкл Шепер

1
@MichaelScheper Некоторое время назад я не хочу слишком много редактировать, но вот что я помню. (1) Делайте только первое ОБНОВЛЕНИЕ (<10.2 может и не быть обязательным). (2) Да, введите «mysql_native_password» дословно. По сути, вы говорите mariadb: «Не используйте привилегии Unix, используйте привилегии базы данных». Это mysql_native_passwordтот вариант.
Газзер

Черт, я написал «привилегия» неправильно!
Газзер

1
Похоже, вы пропустили только ограничение по редактированию на 1,5 минуты! Иногда я тоже расстраиваюсь из-за этого. Во всяком случае, спасибо!
Майкл Шепер

8

Если вы установили MySQL / MariaDB из базового репозитория, пользователи не могут войти в MySQL как root-пользователь 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
    

Источник


Когда я сделал это, я больше не мог sudo mysql как root. Сначала я должен был выполнить su, а затем мог войти в 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:

    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, и столкнулся с этой проблемой. Собирая воедино много информации , ответ Газзера в этом вопросе действительно обнуляется ; все сводится к настройке 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, действительно поощряют плохие практики, рекомендуя удалить пользователя, а затем воссоздать его. Для меня это довольно радикальное решение. Лучшее / простое решение для обнуления 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.