1.MySQL服务器登录方式
1.1本地登录MySQL服务器
mysql -uroot -p'Root@123'

1.2MySQL免交互访问
mysql -h <IP或主机名> -P <端口> -u <用户名> -p <密码> -D <指定数据库> -e "<SQL语句>"
mysql -uroot -p'Root@123' -h localhost -P 3306 -e"SELECT * FROM user.user1;"

2.创建用户
2.1使用CREATE USER语句创建用户
CREATE USER <用户名>@<IP/主机名> IDENTIFIED BY "用户密码";
注意:服务端与客户端都需要关闭防火墙,启动MySQL服务
|-----------------------|--------------|
| localhost | 只允许本地登录 |
| % | 允许任意主机登录(默认) |
| 192.168.189.% | 允许任意指定网段登录 |
| 192.168.189.137(固定IP) | 允许固定IP登录 |
[地址常用选项]
服务端创建用户
-创建jack用户,指定由任意IP登录服务端MySQL
注意:不写默认%
CREATE USER jack@'%' IDENTIFIED BY 'Jack@123';
-创建tom用户,指定由192.168.189网段登录服务端MySQL
CREATE USER tom@'192.168.189.%' IDENTIFIED BY 'Tom@1234';
-创建tony用户,指定由192.168.189.137固定IP登录服务端MySQL
CREATE USER tony@'192.168.189.137' IDENTIFIED BY 'Tony@123';
SELECT user,host FROM mysql.user; -查看已创建用户信息

客户端登录
-使用jack用户登录服务端MySQL
mysql -ujack -p'Jack@123' -h 192.168.189.138
-使用tom用户登录服务端MySQL
mysql -utom -p'Tom@1234' -h 192.168.189.138
-使用tony用户登录服务端MySQL
mysql -utony -p'Tont@1234' -h 192.168.189.138
3.权限操作
3.1权限级别
|--------------|-------------------|-----------------------------|
| 级别 | 权限说明 | 示例 |
| *.* | 任何数据库下的任何数据表 | *.* |
| 数据库名.* | 指定数据库下的任何数据表 | user.* |
| 数据库名.表名 | 指定数据库下的指定表 | user.student |
| 数据库名.表名(字段名) | 指定数据库下的指定表下的指定字段名 | SELECT (id) ON user.stduent |
[权限级别]
3.2授予权限-GRANT
GRANT <权限名> ON <数据库名.表名> TO <用户名@'IP/主机名'>
GRANT ALL ON <数据库名.表名> TO <用户名@'IP/主机名'> -授予所有权限
GRANT <权限名> ON <数据库名.表名> TO <用户名@'IP/主机名'> WITH GRANT OPTION -授予授权权限
注意:<用户>@<IP/主机名>必须与创建时的一致
GRANT SELECT ON *.* TO jack@'%'; -授予jack用户任意库下任意表的查找权限
GRANT SELECT ON mysql.* TO tom@'192.168.189.%'; -授予tom用户mysql库下的所有表的查询权限
GRANT SELECT(user,host) ON mysql.user TO tony@'192.168.189.137'; -授予tony用户mysql库下user表下的user,host字段查找权限
GRANT SELECT ON *.* TO jack@'%' WITH GRANT OPTION; -授予jack授予权限权限
3.3查看权限-SHOW GRANTS
SHOW GRANTS\G -查看当前用户权限
SHOW GRANT FOR <用户名>@<IP/主机名>\G 查看其他用户权限



3.4回收权限-REVOKE
REVOKE <权限名> ON <数据库.表名> FROM <用户名@'IP/主机名'>
REVOKE ALL ON <数据库.表名> FROM <用户名@'IP/主机名'> -回收所有权限
REVOKE GRANT OPTION ON <数据库.表名> FROM <用户名@'IP/主机名'> -回收授予权限权限(需单独回收,不包含在ALL中)


4.权限控制机制(了解)
|--------------------|-----------|
| mysql.user | 用户账户和全局权限 |
| mysql.db | 数据库级别权限 |
| mysql.tables_priv | 表级权限 |
| mysql.columns_priv | 列级权限 |
[MySQL权限表]
jack用户具有全局的SELECT权限

tom用户不具备全局SELECT权限,但具有对mysql库下所有表的SELECT权限


4.1权限验证流程
|-------------------------------------------------------------------------------------------------------------------------|
| 1.检查mysql.user全局表 * 如果 Select_priv = 'Y':拥有所有库所有表的 SELECT 权限,不再检查其他表 * 如果 Select_priv = 'N':继续检查 db 表 |
| 2.检查mysql.db库级别表 * 如果找到对应记录且 Select_priv = 'Y':拥有指定数据库的所有表 SELECT 权限 * 如果没有找到或 Select_priv = 'N':继续检查 tables_priv 表 |
| 3.检查mysql.tables_priv表级别表 * 如果 Table_priv 包含 'Select':拥有该表所有列的 SELECT 权限 * 如果不包含:继续检查 columns_priv 表 |
| 4.检查mysql.colimns_priv表 * 如果 Column_priv 包含 'Select':拥有指定列的 SELECT 权限 * 如果不包含:没有 SELECT 权限 |
[权限验证流程-以SELECT为例]
5.密码管理-ALTER USER
5.1修改当前用户密码
ALTER USER USER() IDENTIFIED BY '新密码'
5.2修改其他用户密码
ALTER USER <用户名>@<IP/主机名> IDENTIFIED BY '新密码'

5.3密码策略级别(了解)略
5.4破解MySQL密码-skip-grant-tables模式
# 1. 停止MySQL服务
sudo systemctl stop mysql
# 2. 以安全模式启动MySQL(跳过权限验证)
sudo mysqld_safe --skip-grant-tables --skip-networking &
# 3. 无需密码登录MySQL
mysql -u root
# 4. 在MySQL命令行中执行以下命令
# MySQL 5.7.6+ 版本:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
# MySQL 5.7.5及以下版本:
UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
# 5. 退出MySQL
EXIT;
# 6. 重启MySQL服务
sudo systemctl restart mysql
6.删除用户-DROP USER
DROP USER <用户名>@<IP/主机名>

7.使用角色管理用户权限
7.1创建角色
CREATE ROLE '角色1','角色2','角色3'

7.2给角色权限
GRANT <权限名> ON <数据库名.表名> TO <'角色'>

7.3将角色分配给用户
GRANT <'角色'> TO <用户名>@<IP/主机名>

7.4设置默认登录角色
SET DEFAULT ROLE <'角色'> TO <用户名>@<IP/主机名>

7.5登录查看当前用户所扮演的角色
SELECT CURRENT_ROLE()

7.6撤销ROLE和权限
7.6.1角色移除用户
REVOKE <'角色名'> FROM <用户名>@<IP/主机名>

7.6.2移除角色权限
REVOKE <权限名> ON <数据库名.数据表名> FROM <'角色名'>

7.6.3删除角色
DROP ROLE <'角色名'>

8.以上操作如果刷新不出来可以使用以下命令
flush privileges; -刷新