为了数据库安全,应避免频繁使用 root 用户,而是为不同应用和人员创建具有适当权限的专属用户。
方法对比速览
特性 `CREATE USER` (推荐) `GRANT` (推荐) `INSERT INTO` (不推荐)
易用性 高,语法简单直观 高,创建和授权一步到位 低,需手动处理字段和权限刷新
安全性 高 高 中,容易因遗漏字段或忘记刷新导致错误
功能 只创建用户,不授权 创建用户并同时授权 只创建用户,不授权
方法详解与示例
1. 使用 `CREATE USER` 语句 (最标准的方法)
基本语法:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
参数说明:
`'username'@'host'`:用户标识。
`host` 指定允许连接的主机,是实现安全的关键。
`'localhost'`:只能从数据库服务器本机连接。
`'192.168.1.%'`:允许从 `192.168.1.0/24` 网段连接。
`'%'`:允许从任何主机连接(生产环境慎用)。
`IDENTIFIED BY 'password'`:设置明文密码。MySQL 会自动将其加密后存入 `authentication_string` 字段。
示例 1:创建本地用户
创建用户 test1,只能从本机登录,密码为 test1
CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
特点:
新创建的用户权限极少,只有 `USAGE` 权限,意味着能登录但几乎不能做任何操作。
创建后需要使用 `GRANT` 语句单独授权。
这是 MySQL 官方推荐的创建用户的标准方式。
2. 使用 `GRANT` 语句 (最常用的方法)
基本语法:
GRANT privilege_type ON database.table TO 'username'@'host' IDENTIFIED BY 'password';
参数说明:
`privilege_type`:要授予的权限(如 `SELECT`, `INSERT`, `ALL PRIVILEGES`)。
`ON database.table`:权限作用范围(如 `*.*` 代表所有库所有表,`mydb.*` 代表 `mydb` 库下的所有表)。
其他参数与 `CREATE USER` 相同。
示例 2:创建用户并直接授权
创建用户 test3,允许从本地登录,密码 test3,并授予对所有数据库的查询权限
GRANT SELECT ON *.* TO 'test3'@'localhost' IDENTIFIED BY 'test3';
创建应用用户,允许从内网网段连接,并授予对特定数据库的全部操作权限
GRANT ALL PRIVILEGES ON `app_db`.* TO 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassword!123';
特点:
创建用户和授权一步完成,是最实用、最高效的方法。
如果 `'username'@'host'` 不存在,会自动创建该用户。
在 MySQL 5.7 及以后版本中,此语法已被标记为弃用,但仍然广泛支持。更标准的做法是先 `CREATE USER`,再 `GRANT`。
3. 使用 `INSERT INTO` 语句 (不推荐的方法)
基本语法:
INSERT INTO mysql.user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');
必须执行以下命令使更改生效
FLUSH PRIVILEGES;
示例 3:直接向 user 表插入用户
向系统权限表直接插入用户记录
INSERT INTO mysql.user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('localhost', 'test2', PASSWORD('test2'), '', '', '');
刷新权限,使新用户生效
FLUSH PRIVILEGES;
最佳实践总结
1. 首选方法:使用 `GRANT` 语句,因为它简洁、安全且高效。
2. 标准流程:在要求严格的环境,可采用标准流程:先 `CREATE USER` 创建用户,再用 `GRANT` 授予特定权限。
CREATE USER 'myuser'@'%' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE ON `mydb`.* TO 'myuser'@'%';
3. 避免操作系统表:永远不要使用 `INSERT INTO mysql.user` 的方法创建用户,除非你非常清楚你在做什么。
4. 密码安全:
使用强密码。
在命令行中设置密码时,可以考虑先使用 `SELECT PASSWORD('your_plain_password');` 获取哈希值,然后在语句中使用 `IDENTIFIED BY PASSWORD '*hash_value*'`,以避免在历史记录中留下明文密码。
5. 主机限制:始终指定 `host` 部分,遵循最小权限原则,不要随意使用 `'%'`。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程