не может войти как пользователь 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я вижу, что старые настройки никогда не устанавливаются постоянно.

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

codescope
источник

Ответы:

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.

Надеюсь, это кому-нибудь поможет :)

Loremhipsum
источник
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, так как другие пользователи будут добавлены вручную, а не частью первоначальной установки / обновления.

Gazzer
источник
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';

Vadiaz
источник
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стоимости, сброса привилегий и продолжения жизни.

JakeGould
источник
-1

У меня была та же проблема, и я запустил следующие исправления:

mysql_upgrade --force
klob
источник
К сожалению, это не сработало. Я переустанавливаю Ubuntu.
кодоскоп
1
Я только что сделал свежую установку Ubuntu 16.04 и установил mariad-сервер. После установки я запустил mysql_secure_installation и установил пароль. Пройдя остальные шаги в mysql_secure_installation, я запустил его снова, и похоже, что он не сохраняет изменения. Я все еще не могу войти с моей обычной учетной записи пользователя. Может ли это быть ошибкой?
кодоскоп
Это никогда не поможет. Эта проблема не имеет ничего общего с фактической установкой бинарного файла MariaDB, а с тем, что пользователю rootзадаются pluginнестандартные настройки. Единственный крайний случай, когда обновление БД может помочь в подобном случае, если сам mysql_upgradeпроцесс учитывает pluginнастройки, в которых я сомневаюсь.
JakeGould