Answers:
我最近将Ubuntu 15.04升级到16.04,这对我有用:
首先,在sudo mysql中连接
sudo mysql -u root
检查您的数据库中是否存在您的帐户
SELECT User,Host FROM mysql.user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| admin | localhost |
| debian-sys-maint | localhost |
| magento_user | localhost |
| mysql.sys | localhost |
| root | localhost |
删除当前的root @ localhost帐户
mysql> DROP USER 'root'@'localhost';
Query OK, 0 rows affected (0,00 sec)
重新创建您的用户
mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
Query OK, 0 rows affected (0,00 sec)
向您的用户授予权限(不要忘记刷新权限)
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)
退出MySQL并尝试在没有sudo的情况下重新连接。
我希望这会帮助某人:)
%
意味着您可以从任何地方...远程连接?
grant all privileges on *.* to 'root'@'localhost' with grant option;
如果您安装5.7并且不向
root
用户提供密码,它将使用该auth_socket
插件。该插件无关紧要,不需要密码。它只是检查用户是否正在使用UNIX套接字进行连接,然后比较用户名。
取自MySQL 5.7中带有“插件:auth_socket”的更改用户密码
因此为了将其更改plugin
回mysql_native_password
:
用sudo登录:
sudo mysql -u root
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;
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;
来源:stackoverflow.com/a/41537019/1004587
简而言之,关于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
并正确设置密码。
在截至2017年的Ubuntu版本16上的MariaDB(<10.2,请参阅下面的注释)上,就足够了。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用户上,因为其他用户将被手动添加,而不是初始安装/更新的一部分。
mysql_secure_installation
并没有相同的效果。它在哪里存储新密码?
UPDATE
适用于MariaDB <10.2和ALTER
其他版本的两个s 吗?第二个是第UPDATE
一个的替代品,还是我们需要同时输入两者?最后,'mysql_native_password'是逐字键入的内容,还是我们应该将其替换为MySQL的预期根密码?
mysql_native_password
是选项。
如果您已从基本存储库安装了MySQL / MariaDB,则用户无法从其Unix登录名作为MySQL根用户登录MySQL(如果具有sudo访问权限,则不适用)
登录到MySQL root shell:
$ sudo mysql -u root -p
执行以下查询:
use mysql;
update user set plugin='mysql_native_password' where user='root';
flush privileges;
quit;
打开一个新的shell,然后:
$ mysql -u root -p
mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
尝试创建新的mysql帐户,对我来说它已经起作用了(mysql 5.7.12):
以sudo身份登录:
sudo mysql -uroot
创建新用户并授予他特权(无密码):
CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
以新用户身份登录:
mysql -uadmin
我不得不做两件事(感谢@Todor和@Loremhipsum):
update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';
接着:
FLUSH PRIVILEGES;
我不建议删除user root
。
首先尝试此代码,
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;
我一直在修改我创建的一些配置脚本以使用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所发表的文章中投票率最高的答案)通过建议删除用户然后重新创建它们来真正鼓励不良做法。对我来说,这是一个非常彻底的解决方案。最好/最简单的解决方案是使plugin
值无效,清除特权并继续生活。
我遇到了同样的问题,并运行以下命令进行了修复:
mysql_upgrade --force
root
设定与plugin
是非标准设置。在这种情况下,DB升级可能会有所帮助的唯一极端情况是,如果mysql_upgrade
流程本身考虑到了plugin
我怀疑的设置,那是唯一的情况。