我编写了一个安装脚本,用这个SQL命令更改root密码:
UPDATE user SET password='*C563415623144561...' WHERE user='root';
这对Mysql 5.7不起作用: http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-6.html#mysqld-5-7-6-account-management
我的问题是:如何用另一个兼容5.6和5.7版Mysql的命令更改此命令?我想用散列字符串更新密码,而不是使用明确的密码。
答案 0 :(得分:17)
从mysql 5.7开始,这不再是用户表中的密码字段。它现在称为authentication_string。您可以像这样更改或设置密码:
set password for 'jeff'@'localhost' = PASSWORD('mypass'); // this automatically hashes the password
如果您想使用自己的查询,只需将password
更改为authentication_string
,即可使用。
UPDATE user SET authentication_string='*C563415623144561...' WHERE user='root@localhost';
希望得到这个帮助。
答案 1 :(得分:10)
我已使用此命令在Mysql 5.7.22中重置为空密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
答案 2 :(得分:3)
鉴于'SET PASSWORD FOR = PASSWORD('')'在mysql 5.7上已被弃用。如果没有正确完成,您甚至可能在syslog中遇到以下错误。
The plugin 'auth_socket' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.
我建议使用以下命令。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypass';
https://www.percona.com/blog/2016/03/16/change-user-password-in-mysql-5-7-with-plugin-auth_socket/
答案 3 :(得分:0)
首先查看您指定的mysql版本安全策略。
show variables like '%validate_password%';
如果您愿意,可以更改此政策
set variable_name=new_value;
更改相应的用户密码。
MySQL 5.7.5及更早版本:
SET PASSWORD FOR 'user_name' = PASSWORD('new_password');
MySQL 5.7.6及更高版本:
alter user 'user_name' identified by 'new_password';
答案 4 :(得分:0)
对于服务器版本:5.7.25-MySQL社区服务器(GPL)。在下面的查询中使用该密码,因为该密码不再有效,并由authentication_string代替
UPDATE user SET authentication_string = PASSWORD('yourpassword'), password_last_changed = NULL
WHERE user.Host = 'localhost' AND user.User = 'username';
答案 5 :(得分:0)
我不是MySQL的权威,但是基于MySQL当前的5.7文档,当前被接受且最受欢迎的答案中的建议使我感到不可取。 (这很可能是由于时间的流逝-问题和@mdamia的答案都在2015年发布。)
@Tobia的问题所链接的MySQL 5.7.6 (2015-03-09, Milestone 16) release notes说:“ ALTER USER现在是分配密码的首选语句。”
该问题确实询问了是否可以将单个命令同时用于MySQL 5.6和5.7,但是鉴于MySQL> = 5.7.6实现的ALTER USER
语法提供了安全性增强,我将使用较新的语法当可用时。如果仍然必须运行MySQL <5.7.6安装程序,我将在这些情况下限制使用较旧且已弃用/删除的密码更新语法。
@Carlos AlbertoGarcíaGuardia和@Venkat Kotra在他们的答案中建议的ALTER USER
语句在我看来似乎是用于MySQL> = 5.7.6的正确语法。以下是两个示例(根据他们的答案和ALTER USER documentation for MySQL 5.7改编而成)::
ALTER USER '<username>'@'localhost'
IDENTIFIED BY '<new_cleartext_password>';
ALTER USER '<username>'@'localhost'
IDENTIFIED WITH <auth_plugin>
BY '<new_cleartext_password>';
上面的第二个示例包含一个可选的WITH
子句,用于指定一个authentication plugin。指定的插件将写入mysql.user
表的“ plugin”字段。作为MySQL身份验证插件的历史和未来的背景,我发现这些MySQL Server Team博客文章很有帮助:
为回答@Tobia的问题,即如何以散列格式而不是明文形式将新密码传递给MySQL,MySQL ALTER USER
文档指出,这是通过使用AS
代替{{1 }}在BY
语句中:
ALTER USER
使用ALTER USER '<username>'@'localhost'
IDENTIFIED WITH <auth_plugin>
AS '<new_hashed_password_value>';
代替ALTER USER documentation says代替AS
时,假定密码字符串“已采用身份验证插件所需的格式,并按原样存储在mysql中.user表。”如果插件需要散列值,则“必须以适合于该插件的格式对该值进行散列。否则,该值将无法被该插件使用,并且不会进行客户端连接的正确身份验证。” 编号。
当前接受的答案建议使用BY
语句或SET PASSWORD ... PASSWORD()
语句(前者用于以明文形式传递新密码,而后者以哈希格式来传递密码):
UPDATE
或
SET PASSWORD
FOR '<username>'@'localhost' =
PASSWORD('<mypass_in_cleartext>');
相对于当前首选的UPDATE mysql.user
SET authentication_string='<mypass_as_hash>'
WHERE User='<username>';
语句,不赞成和/或不鼓励使用这些语句。
ALTER USER
“自MySQL 5.7.6起不推荐使用,并将在将来的MySQL版本中删除。”
SET PASSWORD ... = PASSWORD(<cleartext>)
语法(即,省略了SET PASSWORD ... = 'auth_string'
加密功能)“,但“ ALTER USER”是更改帐户(包括分配密码)的首选语句”。 the SET PASSWORD documentation 另请参见 Id.:
我们不建议使用SET PASSWORD语法和PASSWORD()函数。现有的ALTER USER语句已修改为涵盖不推荐使用的功能。 PASSWORD()函数最初是作为手动更新mysql.user表的一种方式引入的。通常这是一个坏主意,我们希望将管理用户身份验证属性的任务完全留给使用ALTER USER语句来完成,该语句自动确定应使用哪个身份验证插件,然后相应地调整密码算法。
如手册所述,在日志记录方面,PASSWORD(str)
似乎不如UPDATE
安全。该手册指出ALTER PASSWORD
语句按原样写入日志,对拥有日志读取权限的任何人都可以看到。[1]相反,该手册指出,当MySQL将UPDATE
语句(以及ALTER USER ... IDENTIFIED BY ...
语句)写入日志时,它会重写所包含的密码,因此它们“不会从字面上出现”。[1]
至少在大多数情况下。 SET PASSWORD
和SET PASSWORD
的文档警告说,“在某些情况下” [2]也可以使用可见的密码记录这些语句,[2]尽管并非在所有情况下,{{1}显然都是这样}。
1:请参见Removal and Deprecation in MySQL 5.7(“特别是,mysql.user系统表中引用文字密码的INSERT或UPDATE语句按原样记录,因此应避免使用此类语句。(直接修改授予表无论如何都不鼓励。)”)
2:请参见MySQL 5.7 manual on password logging和MySQL 5.7 SET PASSWORD documentation
免责声明:今天,我只是在阅读MySQL手册时分享我的解释。关于它以哪种格式记录的密码更改语句,我还没有测试过MySQL的行为。
答案 6 :(得分:0)
在具有mysqld 8.0.19版本的Ubuntu 19.10上,以上都不适合我。 https://linuxconfig.org/how-to-reset-root-mysql-mariadb-password-on-ubuntu-20-04-focal-fossa-linux此处给出的说明有效。它用于MariaDB,但是如果不使用MariaDB,则相同。这两个关键点是:在mysqld 8.0+中删除了函数password(),并且由于某些原因,没有使用--skip-grant-tables选项创建mysqld的unix套接字。因此,您必须使用以下修改的说明:
$ sudo systemctl stop mysql
$ sudo mkdir -p /var/run/mysqld
$ sudo chown mysql:mysql /var/run/mysqld
$ sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking &
检查守护程序mysqld是否正在运行:
$ ps aux | grep mysqld
如果正在运行,则启动mysql并更改密码
$ mysql -u root
> FLUSH PRIVILEGES;
> USE mysql;
> ALTER USER 'root'@'localhost' IDENTIFIED BY 'N3w_p@ssw0rD.';
> quit
重要提示:(重新)启动mysqld之前,您需要终止当前进程。仅以正常方式停止它是行不通的。
$ sudo pkill mysqld
$ sudo systemctl start mysql
然后您可以测试:
$ mysql -u root --password='N3w_p@ssw0rD.'
答案 7 :(得分:0)
这是我唯一的方式: mysql Ver 14.14 Distrib 5.7.30
UPDATE user SET authentication_string = PASSWORD('YourPassword'), password_last_changed = NULL
WHERE user.Host = 'localhost' AND user.User = 'YourUsername';