低版本兼容问题解决方法

MySQL 8.0默认认证插件为caching_sha2_password

MySQL 5.7及之前版本认证插件是mysql_native_password

修改配置文件:/etc/my.cnf.d/

添加用户认证登录插件:

default-authentication-plugin=mysql_native_password

查看用户(user)权限

 # 查看MySQL用户user表:
 use mysql;
 ​
 show tables;
 ​
 select * from user\G;
 ​
 # 当前登录用户权限
 SHOW GRANTS;
 ​
 # 查看所有用户及主机
 SELECT host, user FROM mysql.user;
 ​
 # 查看特定用户的权限
 SHOW GRANTS FOR '用户名'@'主机';

host值介绍

host 值就是用来限制“从哪个地址可以登录”的,可以理解为登录许可的“地址白名单”

host 值

含义与限制

适用场景 / 注意事项

localhost

仅限本机连接

通过 Unix Socket 或本地管道连接,不走 TCP/IP 网络。

127.0.0.1

仅限本机连接 (IPv4)

强制走 TCP/IP 协议。注意: localhost127.0.0.1 在 MySQL 中是两个完全不同的账号!

::1

仅限本机连接 (IPv6)

IPv6 的本地回环地址,等同于 IPv4 的 127.0.0.1

%

允许任意主机连接

相当于“全网放行”。⚠️ 生产环境极度危险,严禁对 root 或高权限账号使用!

192.168.1.%

允许指定网段连接

使用 % 作为通配符,匹配 192.168.1.0 ~ 192.168.1.255。注意: 不能用 CIDR(如 /24),且 % 不能跨网段字节。

192.168.1.100

仅允许指定 IP 连接

最安全的远程访问方式,精确到单台机器。

%.example.com

允许指定域名连接

匹配该域名下的所有主机。前提: MySQL 服务器必须能正确解析该域名,否则连接会失败。

创建用户及密码

 示例:
 CREATE USER 用户名@地址 IDENTIFIED BY '密码';
 ​
 # localhost只允许本机登录
 CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';
 ​
 # %代表所有地址都可以登录
 create user '用户'@'%' identified by '密码';
 ​
 # 192.168.8.% 允许192.168.8.x网段的所有主机登录
 create user '用户'@'192.168.8.%' identified by '密码';
 ​
 # 删除用户
 drop user '用户'@'localhost';
 drop user '用户'@'%';
 ​
 # 从 MySQL 的系统权限表中删除用户
 delete from mysql.user where user='用户名' and host='地址';

修改用户名

 # MySQL 5.x时,使用如下语法:
 RENAME USER 用户名 TO 用户名;
 ​
 # MySQL8.x时,使用如下语法:
 rename user '用户名'@'localhost' to '用户名'@'localhost';
 rename user '用户名'@'%' to '用户名'@'%';

修改密码

 # 修改MySQL5.x时,使用如下语法:
 ## root修改自己的密码
 set password = password('密码');
 ​
 # 修改其他用户的密码
 SET PASSWORD FOR '用户'@'%' = PASSWORD ( '12345678' );
 ​
 # MySQL8.x,修改密码
 ALTER USER '用户'@'%' IDENTIFIED BY '密码';
 ALTER USER '用户'@'localhost' IDENTIFIED BY '密码';
 ​
 # 让 MySQL 重新从 mysql 系统库的权限表中读取所有用户权限,并立即生效。
 FLUSH PRIVILEGES;

给用户设置权限

  • all 除了授权之外的所有权限

  • select 查询表内容的权限

  • update 修改表内容权限

  • insert 在表中添加内容的权限

  • delete 删除表中内容的权限

权限范围的四种写法

写法

含义

作用范围

*.*

所有数据库的所有表

全局(管理员级别)

库名.*

指定数据库的所有表

数据库级别(最常用)

库名.表名

指定数据库的指定表

表级别

库名.表名(列名)

指定表的指定列

列级别(高级用法,较少用)

 示例:
 grant 权限列表 on  库.表  to  '用户'@'地址';
 ​
 # 给用户添加insert,update,select权限,并作用到所有库.所有表
 grant insert,update,select on *.* to '用户'@'地址';
 ​
 # 创建一个名为 tomdb 的数据库
 create database tomdb;
 ​
 # 给tomdb数据库及tomdb库里面所有的表除了授权之外的所有权限,其他库无权限
 GRANT ALL ON tomdb.* TO '用户'@'地址';
 ​
 # 给所有数据库及表除了授权之外的所有权限
 GRANT ALL ON *.* TO '用户'@'地址';
 ​
 # 给所有数据库及表所有权限包括授权的权限
 GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;
 ​
 # 给特定网段用户 授权查、修、增权限
 grant select,update,insert ON *.* to '用户'@'192.168.8.%';
 ​
 # 撤销权限
 revoke 权限列表 on  库.表 from '用户'@'地址';
 ​
 # 撤销 用户 的所有权限
 revoke all on *.* from '用户'@'地址';
 ​
 # 刷新权限
 FLUSH PRIVILEGES;
 ​