mysqlmysql设置密码永久生效过期怎么解决

12657人阅读
数据库及工具(32)
MySQL的用户密码过期功能详解
作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:
先说明两个术语。
Payment Card Industry,即支付卡行业,PCI行业表示借记卡、信用卡、预付卡、电子钱包、ATM和POS卡及相关的业务。
PCI DSS,即PCI数据安全标准(Payment Card Industry Data Security Standard)是由PCI安全标准委员会制定,旨在使国际上采用一致的数据安全措施。
PCI DSS标准要求用户每隔90天必须更改他们的密码。那么MySQL数据库该怎样适应这个情况?幸运的是,在MySQL版本5.6.6版本起,添加了password_expired功能,它允许设置用户的过期时间。
这个特性已经添加到mysql.user数据表,但是它的默认值是”N”。可以使用ALTER USER语句来修改这个值。
下面是关于如何设置MySQL用户账号的到期日期一个简单例子:
mysql& ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE;
一旦某个用户的这个选项设置为”Y”,那么这个用户还是可以登陆到MySQL服务器,但是在用户未设置新密码之前不能运行任何查询语句,而且会得到如下错误消息提示:
mysql& SHOW DATABASES;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
Keep in mind that this does not affect any current connections the account has open.
当用户设置了新密码后,此用户的所有操作(根据用户自身的权限)会被允许执行:
mysql& SET PASSWORD=PASSWORD('mechipoderranen');
Query OK, 0 rows affected (0.00 sec)
mysql& SHOW DATABASES;
+--------------------+
| Database
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
6 rows in set (0.00 sec)
DBA可以通过cron定时器任务来设置MySQL用户的密码过期时间。
从MySQL 5.7.4版开始,用户的密码过期时间这个特性得以改进,可以通过一个全局变量default_password_lifetime来设置密码过期的策略,此全局变量可以设置一个全局的自动密码过期策略。
用法示例:
可以在MySQL的配置文件中设置一个默认值,这会使得所有MySQL用户的密码过期时间都为90天,MySQL会从启动时开始计算时间。my.cnf配置如下:
default_password_lifetime=90
如果要设置密码永不过期的全局策略,可以这样:(注意这是默认值,配置文件中可以不声明)
default_password_lifetime=0
在MySQL运行时可以使用超级权限修改此配置:
mysql& SET GLOBAL default_password_lifetime = 90;
Query OK, 0 rows affected (0.00 sec)
还可以使用ALTER USER命令为每个具体的用户账户单独设置特定的值,它会自动覆盖密码过期的全局策略。要注意ALTER USER语句的INTERVAL的单位是“天”。
ALTER USER ‘testuser’@‘localhost' PASSWORD EXPIRE INTERVAL 30 DAY;
禁用密码过期:
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER;
让用户使用默认的密码过期全局策略:
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE DEFAULT;
从MySQL 5.7.6版开始,还可以使用ALTER USER语句修改用户的密码:
mysql& ALTER USER USER() IDENTIFIED BY '637h1m27h36r33K';
Query OK, 0 rows affected (0.00 sec)
更多的细节可以参考:
在MySQL 5.7.8版开始用户管理方面添加了锁定/解锁用户账户的新特性, related to user management is locking/unlocking user accounts when CREATE USER, or at a later time running the ALTER USER statement.
下面创建一个带账户锁的用户:
mysql& CREATE USER 'furrywall'@'localhost' IDENTIFIED BY '71m32ch4n6317' ACCOUNT LOCK;
Query OK, 0 rows affected (0.00 sec)
如下所示,新创建的用户在尝试登陆时会得到一个ERROR 3118错误消息提示:
$ mysql -ufurrywall -p
Enter password:
ERROR 3118 (HY000): Access denied for user 'furrywall'@'localhost'. Account is locked.
此时就需要使用ALTER USER … ACCOUNT UNLOCK语句进行解锁了:
mysql&ALTER USER 'furrywall'@'localhost' ACCOUNT UNLOCK;
Query OK, 0 rows affected (0.00 sec)
现在,这个用户已经解锁,可以登陆了:
$ mysql -ufurrywall -p
Enter password:
Welcome to the MySQL monitor.
Your MySQL connection id is 17
Server version: 5.7.8-rc MySQL Community Server (GPL)
Copyright (c) , Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
Type '' or 'h' for help. Type 'c' to clear the current input statement.
还可以这样锁定用户账户:
mysql& ALTER USER 'furrywall'@'localhost' ACCOUNT LOCK;
Query OK, 0 rows affected (0.00 sec)
锁定/解锁用户账户的更多信息可以查阅:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5161322次
积分:48129
积分:48129
排名:第65名
原创:777篇
转载:23篇
译文:24篇
评论:1119条
大家好,我是黑客,专门盗账号的。现在这个人的帐号被我盗了,但看这个人平时的博客空间,一直过着艰苦努力、持之以恒的技术研究生活,勤奋刻苦,积极分享,无私奉献,我被深深的感动了,这是一个纯粹的人,人品这样的高尚,希望大家看到我这条消息后,可以私聊他,多鼓励他,不缺钱的就多给他一些经济上的资助,让他再接再厉!就这样吧,我下线了,眼框湿湿的难受。
(1)(5)(4)(2)(3)(10)(2)(7)(6)(5)(11)(11)(11)(11)(10)(10)(10)(10)(4)(10)(10)(1)(1)(5)(10)(3)(11)(5)(5)(5)(6)(3)(6)(7)(9)(5)(5)(5)(9)(6)(2)(6)(8)(5)(15)(9)(13)(5)(6)(11)(15)(23)(16)(10)(1)(3)(1)(3)(1)(1)(1)(3)(11)(4)(1)(1)(1)(3)(2)(1)(3)(2)(2)(1)(2)(3)(4)(4)(4)(1)(2)(5)(11)(20)(18)(13)(19)(20)(15)(10)(2)(4)(7)(4)(1)(4)(5)(4)(5)(12)(3)(12)(13)(10)(21)(29)(14)(11)(26)(8)(16)(9)(3)主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
傻丫头和高科技产物小心翼翼的初恋
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:1765人阅读
Mysql(144)
1)操作系统
&cat /etc/issue
cat /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
&cat /proc/version
cat /proc/version
Linux version 2.6.32-504.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7
(Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Oct 15 04:27:16 UTC 2014
2)数据库版本
mysql --version
mysql &Ver 14.14 Distrib 5.6.26, for linux-glibc2.5 (x86_64) using &EditLine wrapper
2.问题描述
2.1 发现问题
& 今天监控报突然某套mysql数据库备份失败(mysql架构为一主,一从,从库上部署了mysqldump及meb两种备份),在备份日志中看到如下报错:
Warning: Using a password on the command line interface can be insecure.
mysqldump: Got error: 1862: Your password has expired. To log in you must change it using a client that supports expired passwords. when trying to connect##备份脚本已经用了很长时间了,之前备份一直是正常的。 &
备份脚本中的主要语句类似如下:
mysqldump -uroot -p -h127.0.0.1 --all-databases --events --routines --triggers --single-transaction --default-character-set=utf8 --complete-insert --flush-privileges --hex-blob --dump-slave=2 &database_3307.sql
3. 问题分析
& &从上面的报错我们知道是用户过期了,虽然mysql 5.6已经有了使用户过期的功能,但是只能通过ALTER USER account PASSWORD EXPIRE语句才能使用户过期&,用户是不会自动过期的(比如说用户使用一段时间以后自动过期,5.6暂时没有这个功能)
& 但是公司就我一个dba,其他人也没有数据库的super权限,那么用户为什么过期呢?接下来我们慢慢分析
1) 查看127.0.0.1对应的root用户是否过期
mysql -uroot -p -S /tmp/3306.sock
mysql& select user();
+----------------+
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql& select user,host,password,password_expired from mysql.user where user = 'root';
+------+---------------------+-------------------------------------------+------------------+
| user | host
| password
| password_expired |
+------+---------------------+-------------------------------------------+------------------+
| root | localhost
| *81F5E21ECD4A731AEBFB6AF209E1B | N
| root | all-middle-mysql-10 | *81F5E21ECD4A731AEBFB6AF209E1B | Y
| root | 127.0.0.1
| *81F5E21ECD4A731AEBFB6AF209E1B | Y
| root | ::1
| *81F5E21ECD4A731AEBFB6AF209E1B | Y
+------+---------------------+-------------------------------------------+------------------+
4 rows in set (0.00 sec)
##这里我们我们看到除了'root'@'localhost'用户没有过期以外,其他的三个root用户都已经过期(至于这些用户为什么会过期,这边博客中我就不展开讲了,有兴趣的可以看我的另一篇博客)
2) 尝试使用&'root'@'127.0.0.1' 用户登录数据库
mysql -uroot -h127.0.0.1 -p
Enter password:
Welcome to the MySQL monitor.
Your MySQL connection id is 10
Server version: 5.6.26-log
Copyright (c) , Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
Type '' or '\h' for help. Type '\c' to clear the current input statement.
mysql& select user,host,password,password_expired from mysql.
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
mysql& ##注意我们看到在命令行中使用'root'@'127.0.0.1'能够登录数据库,但是进行任何操作都会提示你先修改密码
3) 手动执行备份脚本
./mysqlbak3306.sh
Warning: Using a password on the command line interface can be insecure.
mysqldump: Got error: 1862: Your password has expired. To log in you must change it using a client that supports expired passwords. when trying to connect##调用备份脚本的时候就报我们在2.1中给出的错误
4) 数据库最近做过的变动
& &因为之前备份脚本是能够正常工作的,但是突然就报错了(并且我确定我没有对'root'@'127.0.0.1'用户进行过过期操作)。那么我们需要考虑的就是在上一次正常备份发生后,和这一次失败备份之间我们对数据库进行过什么操作。经过排查发现最有可能导致问题的就是为数据库设置了&skip_name_resolve = 1参数并重启了数据库。
##其实分析到这,对于mysql登录的原理比较熟悉的朋友应该已经知道问题所在了。是这样的,如果我们不设置skip_name_resolve = 1,那么我们使用'root'@'127.0.0.1'登录时,其实通过反解析以后我们是用'root'@'localhost'登录的数据库(因为/etc/hosts文件中 127.0.0.1 对应的是localhost),上面我们已经看到了,这个用户是没有过期的,所以此时备份能够正常进行。
& 如果我们指定了skip_name_resolve = 1,那么登录时就没有反解析这一步了,那么此时我们就是用'root'@'127.0.0.1'这个用户登录,但是这个用户已经过期,所以备份报错。下面来看一下 设置和不设置skip_name_resolve时使用'root'@'127.0.01'登录的区别
....................................................................................................................................................................................................................................
如果我们不设置skip_name_resolve = 1,那么我们使用'root'@'127.0.01'用户登录上数据库以后应该看到的应该是如下的用户信息:
mysql& select user();
+----------------+
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
&pre name=&code& class=&html&&mysql& select user();
+----------------+
+----------------+
| root@127.0.0.1 |
+----------------+
1 row in set (0.00 sec)
& 如果我们设置了skip_name_resolve = 1后使用'root'@'127.0.0.1'登录数据库后看到的用户信息如下:
mysql& select user();
+----------------+
+----------------+
| root@127.0.0.1 |
+----------------+
1 row in set (0.00 sec)
mysql& select current_user();
+----------------+
| current_user() |
+----------------+
| root@127.0.0.1 |
+----------------+
1 row in set (0.00 sec)
4. 解决方案
& &其实这个问题的解决方案是很简单的,只要重置一下过期用户的密码就行(注意不能使用 update mysql.user方法来重置密码)mysql -uroot -p -h127.0.0.1
Enter password:
Welcome to the MySQL monitor.
Your MySQL connection id is 12
Server version: 5.6.26-log
Copyright (c) , Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
Type '' or '\h' for help. Type '\c' to clear the current input statement.
mysql& select user();
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
mysql& set password for 'root'@'127.0.0.1' = password('root');
Query OK, 0 rows affected (0.05 sec)
##问题解决方法很简单,但是我觉得找到问题的原因往往比仅仅解决问题更重要。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:223921次
积分:4529
积分:4529
排名:第6394名
原创:178篇
转载:135篇
译文:41篇
(8)(9)(6)(3)(5)(12)(7)(10)(3)(4)(3)(1)(10)(5)(18)(4)(11)(7)(12)(11)(25)(4)(18)(2)(8)(12)(6)(5)(5)(6)(9)(9)(8)(12)(3)(6)(67)MySQL的用户密码过期功能详解_数据库技术_Linux公社-Linux系统门户网站
你好,游客
MySQL的用户密码过期功能详解
来源:Linux社区&
作者:chszs
先说明两个术语。
Payment Card Industry,即支付卡行业,PCI行业表示借记卡、信用卡、预付卡、电子钱包、ATM和POS卡及相关的业务。 PCI DSS,即PCI数据安全标准(Payment Card Industry Data Security Standard)是由PCI安全标准委员会制定,旨在使国际上采用一致的数据安全措施。 详见:
PCI DSS标准要求用户每隔90天必须更改他们的密码。那么MySQL数据库该怎样适应这个情况?幸运的是,在MySQL版本5.6.6版本起,添加了password_expired功能,它允许设置用户的过期时间。
这个特性已经添加到mysql.user数据表,但是它的默认值是&N&。可以使用ALTER USER语句来修改这个值。
下面是关于如何设置MySQL用户账号的到期日期一个简单例子:
mysql& ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE;
一旦某个用户的这个选项设置为&Y&,那么这个用户还是可以登陆到MySQL服务器,但是在用户未设置新密码之前不能运行任何查询语句,而且会得到如下错误消息提示:
mysql& SHOW DATABASES;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
Keep in mind that this does not affect any current connections the account has open.
当用户设置了新密码后,此用户的所有操作(根据用户自身的权限)会被允许执行:
mysql& SET PASSWORD=PASSWORD('mechipoderranen');
Query OK, 0 rows affected (0.00 sec)
mysql& SHOW DATABASES;
+--------------------+
| Database
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
6 rows in set (0.00 sec)
DBA可以通过cron定时器任务来设置MySQL用户的密码过期时间。
从MySQL 5.7.4版开始,用户的密码过期时间这个特性得以改进,可以通过一个全局变量default_password_lifetime来设置密码过期的策略,此全局变量可以设置一个全局的自动密码过期策略。
用法示例: 可以在MySQL的配置文件中设置一个默认值,这会使得所有MySQL用户的密码过期时间都为90天,MySQL会从启动时开始计算时间。my.cnf配置如下:
default_password_lifetime=90
如果要设置密码永不过期的全局策略,可以这样:(注意这是默认值,配置文件中可以不声明)
default_password_lifetime=0
在MySQL运行时可以使用超级权限修改此配置:
mysql& SET GLOBAL default_password_lifetime = 90;
Query OK, 0 rows affected (0.00 sec)
还可以使用ALTER USER命令为每个具体的用户账户单独设置特定的值,它会自动覆盖密码过期的全局策略。要注意ALTER USER语句的INTERVAL的单位是&天&。
ALTER USER &testuser&@&localhost' PASSWORD EXPIRE INTERVAL 30 DAY;
禁用密码过期:
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER;
让用户使用默认的密码过期全局策略:
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE DEFAULT;
从MySQL 5.7.6版开始,还可以使用ALTER USER语句修改用户的密码:
mysql& ALTER USER USER() IDENTIFIED BY '637h1m27h36r33K';
Query OK, 0 rows affected (0.00 sec)
更多的细节可以参考:
在MySQL 5.7.8版开始用户管理方面添加了锁定/解锁用户账户的新特性, related to user management is locking/unlocking user accounts when CREATE USER, or at a later time running the ALTER USER statement.
下面创建一个带账户锁的用户:
mysql& CREATE USER 'furrywall'@'localhost' IDENTIFIED BY '71m32ch4n6317' ACCOUNT LOCK;
Query OK, 0 rows affected (0.00 sec)
如下所示,新创建的用户在尝试登陆时会得到一个ERROR 3118错误消息提示:
$ mysql -ufurrywall -p
Enter password:
ERROR 3118 (HY000): Access denied for user 'furrywall'@'localhost'. Account is locked.
此时就需要使用ALTER USER & ACCOUNT UNLOCK语句进行解锁了:
mysql&ALTER USER 'furrywall'@'localhost' ACCOUNT UNLOCK;
Query OK, 0 rows affected (0.00 sec)
现在,这个用户已经解锁,可以登陆了:
$ mysql -ufurrywall -p
Enter password:
Welcome to the MySQL monitor.
Your MySQL connection id is 17
Server version: 5.7.8-rc MySQL Community Server (GPL)
Copyright (c) ,
and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
Type '' or 'h' for help. Type 'c' to clear the current input statement.
还可以这样锁定用户账户:
mysql& ALTER USER 'furrywall'@'localhost' ACCOUNT LOCK;
Query OK, 0 rows affected (0.00 sec)
锁定/解锁用户账户的更多信息可以查阅:
本文永久更新链接地址:
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(38aa76-ua98).
重新安装浏览器,或使用别的浏览器

我要回帖

更多关于 mysql5.5 的文章

 

随机推荐