mysql用表存放在 mysql.user
mysql默认的几个用户:
mysql> select User from user; +------------------+ | User | +------------------+ | | mysql.infoschema | | mysql.session | | mysql.sys | | root | +------------------+ 5 rows in set (0.01 sec)
mysql.infoschema 数据库系统用户 用来管理和访问系统自带的information_schema数据库
mysql.session mysql的插件将会使用该用户来访问mysql数据库服务器,客户端不能直接使用该用户进行链接
mysql.sys 用于mysql数据库中对象的定义,使用该用户可避免数据库管理员重命名或者删除root用户时发生的问题,客户端不能直接连接
root 超级用户 管理mysql数据库 该用户拥有所有权限
1、创建MySQL用户
create user 语句创建新用户
首先使用root用户登录
mysql> create user user002 identified by '123456';
密码使用sha1函数加密
mysql> select sha1('123456'); +------------------------------------------+ | sha1('123456') | +------------------------------------------+ | 7c4a8d09ca3762af61e59520943dc26494f8941b | +------------------------------------------+ 1 row in set (0.01 sec)
mysql登录时报错:
C:\Users\Administrator>mysql -uuser002 -p Enter password: ****** ERROR 2026 (HY000): SSL connection error: unknown error number
解决方法: 在登录后添加--skip-ssl
C:\Users\Administrator>mysql -uuser002 -p --skip-ssl WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead. Enter password: ******
此时创建后,没有权限,只能访问如下数据库:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | performance_schema | +--------------------+ 2 rows in set (0.05 sec)
2、重命名MySQL用户
查看rename user 帮助信息
mysql> help rename user; Name: 'RENAME USER' Description: Syntax: RENAME USER old_user TO new_user [, old_user TO new_user] ...
old_user : mysql中已经存在的用户
new_user : 新的mysql用户
实例:将user002 重命名为user003
mysql> rename user user002 to user003; Query OK, 0 rows affected (0.01 sec)
修改后查看当前数据库用户:
mysql> use mysql; Database changed mysql> select user from user; +------------------+ | user | +------------------+ | user003 | | user01 | | mysql.infoschema | | mysql.session | | mysql.sys | | root | +------------------+ 6 rows in set (0.00 sec)
3、删除mysql用户
使用drop user 语句删除
mysql> drop user user003; Query OK, 0 rows affected (0.00 sec)
也可以直接从 mysql.user 表中进行删除
mysql>use mysql; mysql> delete from user where user ='user003';
二、mysql管理用户密码
mysql5.7版本 将密码 password改成 authentication_string 字段
mysql> select host,user,authentication_string from user; +-----------+------------------+------------------------------------------------------------------------+ | host | user | authentication_string | +-----------+------------------+------------------------------------------------------------------------+ | % | user01 | *FF680E568727C9C00FABFEE03D13BA727047CC65 | | localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | +-----------+------------------+------------------------------------------------------------------------+ 5 rows in set (0.00 sec)
1、使用 alter user 修改用户密码
mysql> alter user 'user01'@'%' identified by '123456'; Query OK, 0 rows affected (0.01 sec)
2、(win)my.ini(Linux)my.cnf 配置 default_authentication_plugin参数
[mysqld] default_authentication_plugin=mysql_native_password
修改密码也可以使用如下方式:
mysql> alter user'user01'@'%' identified with mysql_native_password by '123'; Query OK, 0 rows affected (0.01 sec)
3、mysql 丢失root用户密码
首先停止mysql数据库服务
linux:
# systemctl stop mysqld
win:
net stop MYSQL80 (服务名称)
编辑配置文件 /etc/my.cnf 在末尾添加
skip-grant-tables
重启mysql服务
systemctl start mysqld net start MYSQL80
直接登录mySQL
mysql
查询mysql.user 表信息
use mysql; select host,user,authentication_string from user;
清空root用户密码
mysql>update user set authentication_string = '' where user ='root';
刷新权限
mysql>flush privileges;
重新设置root用户的密码
mysql>alter user 'root'@'%' identified by '123456'; mysql>alter user 'root'@'localhost' identified by '123456';
4、密码加载插件
mysql8中提供了2个不同的密码插件:
mysql_native_password
caching_sha2_password
mysql> select user,plugin from user;
+------------------+-----------------------+
| user | plugin |
+------------------+-----------------------+
| user01 | mysql_native_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session | caching_sha2_password |
| mysql.sys | caching_sha2_password |
| root | mysql_native_password |
+------------------+-----------------------+
5 rows in set (0.00 sec)
mysql_native_password 密码插件:使用sha1哈希算法将用户的密码存储在mysql.user 表中
可以在未加密的通道上验证客户端的身份,无需发送实际密码 my.cnf配置中 也是默认使用的密码插件
缺点:存在一定的哈希暴力攻击
caching_sha2_password密码插件:
5、用户密码的复杂度设置
mysql8 提供插件 validate_password 需要手动安装
显示已经安装的插件信息
mysql>show plugins;
安装插件:
mysql> install plugin validate_password soname 'validate_password';
Query OK, 0 rows affected, 1 warning (0.02 sec)
查看默认策略配置:
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | ON |
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set, 1 warning (0.01 sec)
validate_password_check_user_name :设置为ON时,可以将密码设置为当前用户名
validate_password_dictionary_file : 检查密码字典文件的路径名
validate_password_length : 限制密码长度的最小字符数 默认是8个字符
validate_password_mixed_case_count : 限制小写字符和大写字符个数 默认值是1
validate_password_number_count : 限制数字的个数 默认值1
validate_password_policy : 设置密码强度等级 默认是MEDIUM
validate_password_special_char_count :限制特殊字符个数 默认值1
validate_password_policy 密码强度分为3个等级:
LOW : 只检查密码的长度,也可以用数字0表示
MEDIUM: 检查密码的长度、数字、大小写和特殊字符 也可以用数字1表示
STRONG: 检查密码的长度、数字、大小写和特殊字符和字典文件 也可以用数字2表示
修改用户密码:
mysql> alter user 'root'@'localhost' identified by '123456789';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
修改默认的密码强度等级为0 设置为LOW
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.01 sec)
再次修改密码成功
mysql> alter user 'root'@'localhost' identified by '123456789';
Query OK, 0 rows affected (0.00 sec)
用户密码的过期设置与用户锁定:
用户密码过期在mysql.user 表中 用 password_expired 和password_lifetime表示
mysql> select user,host,password_expired,password_lifetime from user;
+------------------+-----------+------------------+-------------------+
| user | host | password_expired | password_lifetime |
+------------------+-----------+------------------+-------------------+
| user01 | % | N | NULL |
| mysql.infoschema | localhost | N | NULL |
| mysql.session | localhost | N | NULL |
| mysql.sys | localhost | N | NULL |
| root | localhost | N | NULL |
+------------------+-----------+------------------+-------------------+
5 rows in set (0.00 sec)
password_expired 为n表示没有启用用户的密码过期设置
启用root用户的密码过期策略,并设定密码过期时间为30天
mysql> alter user 'root'@'localhost' password expire interval 30 day;
Query OK, 0 rows affected (0.00 sec)
密码到期后,没有设置新密码之前不能运行任何查询语句
ERROR 1820(HY000):
you must reset your password using AlTER USER statement before executing this statement
修改root用户密码
alter user 'root'@'localhost' identified by '123456';
在重新查看mysql数据库中用户的 password_expired 和 password_lifetime字段
select user,host,password_expired,password_lifetime from user;
mysql> select user,host,password_expired,password_lifetime from user;
+------------------+-----------+------------------+-------------------+
| user | host | password_expired | password_lifetime |
+------------------+-----------+------------------+-------------------+
| user01 | % | N | NULL |
| mysql.infoschema | localhost | N | NULL |
| mysql.session | localhost | N | NULL |
| mysql.sys | localhost | N | NULL |
| root | localhost | N | 30 |
+------------------+-----------+------------------+-------------------+
5 rows in set (0.00 sec)
mysql增加了一个全局变量default_password_lifetime 设置所有用户的密码过期时间,全局变量
可以设置一个全局的自动密码过期策略 默认是0 表示用户密码永不过期
mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 0 |
+---------------------------+-------+
1 row in set, 1 warning (0.00 sec)
将设置所有用户密码过期时间是90天
mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 0 |
+---------------------------+-------+
1 row in set, 1 warning (0.00 sec)
该参数也可以在配置文件my.cnf中设置
锁定用户可以使用如下语句:
alter user user01 account lock;
用户锁定后,尝试登陆mysql:
C:\Users\Administrator>mysql -u user01 -p -h localhost --skip-ssl
WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.
Enter password: ***
ERROR 3118 (HY000): Access denied for user 'user01'@'localhost'. Account is locked.
解锁用户:
mysql> alter user user01 account unlock;
Query OK, 0 rows affected (0.00 sec)