创建用户
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';
命令解释:
username:新建用户名
hostname:可用于登录的远程主机,loaclhost为本地登录,%为任意主机均可登录
password:用于登录的密码
命令执行演示:
mysql> create user 'admin'@'localhost' identified by 'admin';
Query OK, 0 rows affected (0.04 sec)
删除用户
DROP USER 'username'@'hostname';
命令解释:
username:要删除的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则删除失败
命令执行演示:
mysql> drop user 'admin'@'%';
ERROR 1396 (HY000): Operation DROP USER failed for 'admin'@'%'
mysql> drop user 'admin'@'localhost';
Query OK, 0 rows affected (0.03 sec)
用户重命名
RENAME USER 'username'@'hostname' TO 'newname'@'hostname';
命令解释:
username:要重命名的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则删除失败
newname:新用户名
命令执行演示:
mysql> rename user 'jack'@'%' to 'mike'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from user\G
*************************** 1. row ***************************
user: mike
host: %
*************************** 2. row ***************************
……
修改密码
参考官方文档及个人实践,MySQL8总共有3种可行的密码修改方式:
方法1:用mysqladmin命令:
mysqladmin -u username -p password
命令解释:
-u username:要修改的用户名
-p :使用密码验证(如已设置过密码)
password:需要执行修改密码操作
命令执行演示:
[root@localhost ~]# mysqladmin -u root -p password
Enter password: #输入原始密码
New password: #输入新密码
Confirm new password: #输入确认密码
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
方法2:用SET PASSWORD语句:
SET PASSWORD FOR 'username'@'hostname'='password';
FLUSH PRIVILEGES;
命令解释:
username:要修改的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则修改失败
password:新密码
命令执行演示:
mysql> set password for 'guest'@'localhost'='guest';
ERROR 1133 (42000): Can't find any matching row in the user table
mysql> set password for 'guest'@'%'='guest';
Query OK, 0 rows affected (0.03 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
【注意】 网上有文章指出"="后的新密码应被PASSWORD()函数包围,但经过查证官方文档,PASSWORD()函数已在MySQL8中废弃,直接使用如上方式即可进行密码修改。
mysql> set password for 'guest'@'localhost'=PASSWORD('guest');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PASSWORD('guest')' at line 1
踩到的坑:使用此种方式修改密码后必须使用
FLUSH PRIVILEGES;
语句刷新权限,否则无法使用Navicat等工具进行连接访问!
方法3:用ALTER USER语句:
ALTER USER ‘username’@'hostname' IDENTIFIED BY 'passwd';
命令解释:
username:要修改的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则修改失败
password:新密码
命令执行演示:
mysql> alter user 'guest'@'localhost' identified by '1234';
ERROR 1396 (HY000): Operation ALTER USER failed for 'guest'@'localhost'
mysql> alter user 'guest'@'%' identified by '1234';
Query OK, 0 rows affected (0.01 sec)
【注意】 使用此语句修改密码,当前登录用户需要拥有高于或等于被修改用户的权限等级,否则修改失败!
官方手册推荐使用此语句进行密码修改:
其他
网上还有文章指出使用UPDATE
语句对mysql数据库中的user表进行操作,经过实际操作发现,此方法已失效,失效原因如下:
1、MySQL8中user表密码字段已不再是password字段,而是authentication_string字段;
2、MySQL8废弃了PASSWORD()函数,导致直接UPDATE此表中的authentication_string字段会变为明文,从而导致无法登录。
感兴趣的小伙伴可以尝试新建用户操作一波,绝对会登录不上去的……
另外还用文章指出使用GRANT
授权方式进行密码修改,命令示例:grant usage on *.* to 'username'@'localhost' identified by 'newpassword';
,经测试提示失败,目前已不支持在GRANT
语句中携带IDENTIFIED BY
授权
GRANT privileges ON databasename.tablename TO 'username'@'hostname' [WITH GRANT OPTION];
命令解释:
privileges:对库表的操作权限,如SELECT、UPDATE、DELETE等,同时授权多种操作可用逗号连接,所用操作权限使用ALL
databasename:授权指定数据库名,可使用*
代替所有库
tablename:授权指定表名,可使用*
代替所有表
如需授权指定操作权限到所有库的所有表可用
*.*
表示
username:要授权的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则授权失败
[WITH GRANT OPTION]:可选项,如当前登录用户权限是由其他高级权限用户授予,则此时该用户不能对其他用户继续授权,但当使用可选项语句后,该用户即可对其他用户进行传递授权
命令执行演示:
#当前使用root用户登录
mysql> create user 'jack'@'localhost' identified by 'jack';
Query OK, 0 rows affected (0.05 sec)
mysql> grant select,update on mysql.user to 'jack'@'localhost';
Query OK, 0 rows affected (0.04 sec)
#当前使用jack用户登录
#无权授权其他用户
mysql> grant select on mysql.user to 'guest'@'%';
ERROR 1142 (42000): GRANT command denied to user 'jack'@'localhost' for table 'user'
#使用root用户重新登录并改为使用[WITH GRANT OPTION]授权
mysql> grant select,update on mysql.user to 'jack'@'localhost' with grant option;
Query OK, 0 rows affected (0.02 sec)
#退出root用户并使用jack用户重新登录尝试为其他用户授权
#授权成功
mysql> grant select on mysql.user to 'guest'@'%';
Query OK, 0 rows affected (0.03 sec)
撤销授予的权限
REVOKE privileges ON databasename.tablename FROM 'username'@'hostname';
命令解释:
privileges:需撤销的对库表的操作权限,如SELECT、UPDATE、DELETE等,同时撤销多种操作可用逗号连接,所用操作权限使用ALL
databasename:授权指定数据库名,可使用*
代替所有库
tablename:撤销操作权限指定表名,可使用*
代替所有表
username:要撤销操作权限的用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则授权失败
命令执行演示:
mysql> revoke all on *.* from 'guest'@'%';
Query OK, 0 rows affected (0.05 sec)
mysql> revoke insert on mysql.user from jack@'localhost';
Query OK, 0 rows affected (0.03 sec)
需注意MySQL操作权限又区分为全局层级、数据库层级、表层级、列层级、子程序层级。
全局层级例如:GRANT ALL ON *.*
和REVOKE ALL ON *.*
此类
数据库层级例如:GRANT ALL ON databasename.*
和REVOKE ALL ON databasename.*
表层级例如:GRANT ALL ON databasename.tablename
和REVOKE ALL ON databasename.tablename
如上概述,在授权及撤销权限时应做到对应,否则会出现无法撤销对应权限的情况!
查询用户权限方法
方法1:SHOW GRANTS语句
SHOW GRANTS FOR 'username'@'hostname';
命令解释:
username:需查询权限用户名
hostname:可用于登录的远程主机,必须和配置的一致,否则查询失败
命令执行演示:
mysql> show grants for jack@'localhost';
+----------------------------------------------------------------------------------------+
| Grants for jack@localhost |
+----------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `jack`@`localhost` |
| GRANT SELECT, INSERT, UPDATE ON `mysql`.`user` TO `jack`@`localhost` WITH GRANT OPTION |
+----------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
方法2:SELECT语句
SELECT * FROM user WHERE user='username'\G;
命令解释:
第一个user:指代mysql数据库中user表,所以在使用之前应先使用USE mysql
语句切换到mysql数据库
username:需查询权限的用户名
\G:在Linux或DOS终端中使用有效,将查询结果旋转90°纵向展示
命令执行演示:
mysql> use mysql
Database changed
mysql> select * from user where user='jack'\G;
*************************** 1. row ***************************
Host: localhost
User: jack
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: caching_sha2_password
authentication_string: xxx
password_expired: N
password_last_changed: 2019-10-25 20:57:32
password_lifetime: NULL
account_locked: N
Create_role_priv: N
Drop_role_priv: N
Password_reuse_history: NULL
Password_reuse_time: NULL
Password_require_current: NULL
User_attributes: NULL
1 row in set (0.00 sec)
ERROR:
No query specified