《MySQL基础——用户管理》

一、MySQL 用户的 "藏身之处":user 表解析

MySQL 的所有用户信息都存储在系统数据库mysql的user表中,这是用户管理的 "源头"。

1. 查看用户信息

通过以下 SQL 可查看已存在的用户及核心属性:

sql 复制代码
-- 切换到系统数据库mysql
use mysql;

-- 查看用户的主机、用户名、加密后的密码
select host, user, authentication_string from user;
+-----------+------------------+-------------------------------------------+
| host      | user             | authentication_string                     |
+-----------+------------------+-------------------------------------------+
| localhost | root             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| localhost | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+-----------+------------------+-------------------------------------------+
3 rows in set (0.00 sec)

2. 核心字段含义

字段 说明
host 用户允许登录的主机 / IP,localhost表示仅允许本机登录,%表示允许任意主机登录
user 用户名
authentication_string 用户密码通过password()函数加密后的结果(MySQL 5.7+,旧版本为password字段)
*_priv 权限相关字段(如Select_priv控制查询权限,Drop_priv控制删除权限)

二、用户基础操作:创建、删除与密码修改

1. 创建用户

语法

sql 复制代码
create user '用户名'@'登录主机/IP' identified by '密码';
  • 登录主机 / IP:localhost(本机)、192.168.1.100(指定 IP)、%(任意主机,不推荐,风险高)。
  • 密码限制:MySQL 默认密码策略较严格,简单密码(如123456)会报错,可通过SHOW VARIABLES LIKE 'validate_password%';查看策略,调整方法参考解决密码策略报错。

案例:创建本地登录用户whb:

sql 复制代码
-- 创建用户whb,仅允许本机登录,密码12345678
create user 'whb'@'localhost' identified by '12345678';

-- 验证用户是否创建成功
select user, host, authentication_string from user;
+-----------+------------------+-------------------------------------------+
| host      | user             | authentication_string                     |
+-----------+------------------+-------------------------------------------+
| %         | root             | *A2F7C9D334175DE9AF4DB4F5473E0BD0F5FA9E75 |
| localhost | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | whb              | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 |
+-----------+------------------+-------------------------------------------+
4 rows in set (0.00 sec)

此时可使用whb/12345678从本机登录 MySQL。

2. 删除用户

语法

sql 复制代码
drop user '用户名'@'登录主机/IP';

注意:必须指定host,仅写用户名(如drop user whb;)会默认按'whb'@'%'删除,若用户实际host为localhost,会报错ERROR 1396 (HY000)。

案例:删除用户whb

sql 复制代码
-- 错误示例:未指定host,删除失败
drop user whb;

-- 正确示例:指定host为localhost
drop user 'whb'@'localhost';

-- 验证删除结果
select user, host, authentication_string from user;
sql 复制代码
-- 错误示例执行结果
ERROR 1396 (HY000): Operation DROP USER failed for 'whb'@'%'

-- 正确示例执行结果
Query OK, 0 rows affected (0.00 sec)

-- 验证结果
+-----------+------------------+-------------------------------------------+
| host      | user             | authentication_string                     |
+-----------+------------------+-------------------------------------------+
| %         | root             | *A2F7C9D334175DE9AF4DB4F5473E0BD0F5FA9E75 |
| localhost | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+-----------+------------------+-------------------------------------------+
3 rows in set (0.00 sec)

3. 修改用户密码

普通用户修改自身密码

sql 复制代码
-- 登录普通用户后执行
set password = password('新密码');

root 用户修改其他用户密码

sql 复制代码
set password for '用户名'@'登录主机/IP' = password('新密码');

案例:root 修改whb的密码

sql 复制代码
-- 先重新创建用户whb(用于测试)
create user 'whb'@'localhost' identified by '12345678';

-- root用户将whb的密码改为87654321
set password for 'whb'@'localhost' = password('87654321');

-- 验证密码是否修改成功
select host, user, authentication_string from user where user='whb';

+-----------+------+-------------------------------------------+
| host      | user | authentication_string                     |
+-----------+------+-------------------------------------------+
| localhost | whb  | *5D24C4D94238E65A6407DFAB95AA4EA97CA2B199 |
+-----------+------+-------------------------------------------+
1 row in set (0.00 sec)

(注:密码加密后的字符串已改变,说明修改成功)

三、权限管理:赋予与回收(核心实战)

新创建的用户默认无任何权限,需通过grant赋予权限;若权限分配错误,可通过revoke回收。

1. MySQL 核心权限列表

权限 对应字段 作用范围 说明
SELECT Select_priv 表、视图 允许查询数据
INSERT Insert_priv 允许插入数据
UPDATE Update_priv 允许更新数据
DELETE Delete_priv 允许删除数据
CREATE Create_priv 数据库、表、视图 允许创建数据库 / 表 / 视图
DROP Drop_priv 数据库、表 允许删除数据库 / 表
ALL PRIVILEGES - 任意 赋予所有权限(除GRANT OPTION外)
GRANT OPTION Grant_priv 任意 允许用户将自身权限赋予其他用户

2. 赋予权限(grant)

语法

sql 复制代码
grant 权限列表 on 库.对象名 to '用户名'@'登录位置' [identified by '密码'];
  • 权限列表:多个权限用逗号分隔(如select, insert),all privileges表示所有权限。
  • 库: 对象名:
    *.*:所有数据库的所有对象 (表、视图等),仅 root 可用
    test.*:test数据库的所有对象
    test.account:test数据库的account表
  • identified by(可选):若用户已存在,可同时修改密码;若用户不存在,自动创建用户并设置密码。

案例:给whb赋予test库查询权限

root 用户操作(终端 A):

sql 复制代码
-- 查看当前数据库
show databases;

-- 切换到test库,查看表
use test;
show tables;

-- 给whb赋予test库所有表的select权限
grant select on test.* to 'whb'@'localhost';

-- 查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bit_index          |
| ccdata_pro         |
| innodb_test        |
| musicserver        |
| myisam_test        |
| mysql              |
| order_sys          |
| performance_schema |
| scott              |
| sys                |
| test               |
| vod_system         |
+--------------------+
13 rows in set (0.00 sec)

-- 查看test库的表
+----------------+
| Tables_in_test |
+----------------+
| account        |
| student        |
| user           |
+----------------+
3 rows in set (0.01 sec)

-- 赋予权限
Query OK, 0 rows affected (0.01 sec)

whb用户验证(终端 B):

sql 复制代码
-- 登录whb用户后,查看数据库(未授权前仅能看到information_schema)
show databases;

-- 授权后再次查看数据库(可看到test库)
show databases;

-- 切换到test库,查看表
use test;
show tables;

-- 执行查询操作(有权限,成功)
select * from account;

-- 尝试删除数据(无权限,失败)
delete from account;

-- 未授权前查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

-- 授权后查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.01 sec)

-- 查看test库的表
+----------------+
| Tables_in_test |
+----------------+
| account        |
| student        |
| user           |
+----------------+
3 rows in set (0.00 sec)

-- 查询account表(成功)
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  2 | 李四   |  321.00 |
|  3 | 王五   | 5432.00 |
|  4 | 赵六   |  543.90 |
|  5 | 赵六   |  543.90 |
+----+--------+---------+
4 rows in set (0.00 sec)

-- 尝试删除数据(失败)
ERROR 1142 (42000): DELETE command denied to user 'whb'@'localhost' for table 'account'

3. 回收权限(revoke)

语法

sql 复制代码
revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';

案例:回收whb的test库所有权限

root 用户操作(终端 A):

sql 复制代码
-- 回收whb对test库所有表的所有权限
revoke all on test.* from 'whb'@'localhost';

whb用户验证(终端 B):

sql 复制代码
-- 查看数据库(test库消失)
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

4. 查看用户权限

通过show grants可查看指定用户的权限:

sql 复制代码
-- 查看whb的权限
show grants for 'whb'@'localhost';

-- 查看root的权限
show grants for 'root'@'%';

-- whb的权限(回收后)
+-------------------------------------------+
| Grants for whb@localhost                  |
+-------------------------------------------+
| GRANT USAGE ON *.* TO 'whb'@'localhost'   |
+-------------------------------------------+
1 row in set (0.00 sec)

-- root的权限
+------------------------------------------------+
| Grants for root@%                              |
+------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+------------------------------------------------+
1 row in set (0.00 sec)

(注:USAGE表示无实际权限,仅保留登录权限)

5. 权限生效问题

若赋予 / 回收权限后未立即生效,执行以下命令刷新权限:

sql 复制代码
flush privileges;

四、用户管理最佳实践

  • 遵循最小权限原则:如开发人员仅赋予select, insert, update权限,避免赋予drop, create等高危权限;
  • 限制登录主机尽量使用localhost或指定 IP(如192.168.1.100),避免使用%(允许任意主机登录);
  • 强密码策略:要求用户密码包含字母、数字、特殊字符,定期更换;
  • 定期审计权限:通过select user, host, * from mysql.user;查看用户权限,回收冗余权限
  • 避免共享账号:为每个开发者 / 运维人员创建独立账号,便于追溯操作日志。
相关推荐
不宕机的小马达6 小时前
【Mysql|第一篇】Mysql的安装与卸载、Navicat工具的使用
数据库·mysql
孔丘闻言6 小时前
python调用mysql
android·python·mysql
a_blue_ice9 小时前
JAVA 面试 MySQL
java·mysql·面试
Java水解12 小时前
【MySQL】数据库基础
后端·mysql
沃夫上校12 小时前
MySQL 中文拼音排序问题
java·mysql
要一起看日出12 小时前
MVCC-多版本并发控制
数据库·mysql·mvcc
Hx__12 小时前
MySQL InnoDB 的 MVCC 机制
数据库·mysql
chat2tomorrow13 小时前
数据采集平台的起源与演进:从ETL到数据复制
大数据·数据库·数据仓库·mysql·低代码·postgresql·etl
依稀i12314 小时前
Spring Boot + MySQL 创建超级管理员
spring boot·mysql