mysql 新建用户
在 MySQL 中新建用户需要 CREATE USER 语句,并根据需要授予相应权限。
基本语法
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
1. 创建新用户
基础创建
-- 创建本地用户(只能从本机连接)
CREATE USER 'john'@'localhost' IDENTIFIED BY 'password123';
-- 创建远程用户(可以从任何主机连接)
CREATE USER 'john'@'%' IDENTIFIED BY 'password123';
-- 创建指定 IP 的用户
CREATE USER 'john'@'192.168.1.100' IDENTIFIED BY 'password123';
-- 创建网段用户
CREATE USER 'john'@'192.168.1.%' IDENTIFIED BY 'password123';
创建用户并同时设置密码(MySQL 8.0+)
-- MySQL 8.0 推荐方式
CREATE USER 'alice'@'localhost' IDENTIFIED WITH mysql_native_password BY 'strong_password';
-- 使用默认认证插件
CREATE USER 'bob'@'localhost' IDENTIFIED BY 'password123';
2. 授予权限
授予所有权限
-- 授予某个数据库的所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'john'@'localhost';
-- 授予所有数据库的所有权限(超级用户)
GRANT ALL PRIVILEGES ON *.* TO 'john'@'localhost';
-- 授予特定数据库的所有表权限
GRANT ALL ON mydb.* TO 'john'@'localhost';
授予特定权限
-- 只读权限(SELECT)
GRANT SELECT ON mydb.* TO 'reader'@'localhost';
-- 查询和插入权限
GRANT SELECT, INSERT ON mydb.* TO 'writer'@'localhost';
-- 查询、插入、更新、删除权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'editor'@'localhost';
-- 创建表和索引权限
GRANT CREATE, ALTER, INDEX ON mydb.* TO 'developer'@'localhost';
授予表级别的权限
-- 只针对特定表的权限
GRANT SELECT, INSERT ON mydb.users TO 'app_user'@'localhost';
GRANT ALL ON mydb.orders TO 'order_manager'@'localhost';
3. 刷新权限
重要:授予权限后必须刷新权限表,使其立即生效
FLUSH PRIVILEGES;
4. 完整示例
示例1:创建一个应用用户
-- 1. 创建用户
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'App@Password123';
-- 2. 授予必要权限
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'localhost';
-- 3. 刷新权限
FLUSH PRIVILEGES;
示例2:创建只读用户
-- 创建只读用户
CREATE USER 'readonly'@'%' IDENTIFIED BY 'Read@Only123';
-- 授予查询权限
GRANT SELECT ON *.* TO 'readonly'@'%';
-- 或者只授予特定数据库
GRANT SELECT ON sales_db.* TO 'readonly'@'%';
FLUSH PRIVILEGES;
示例3:创建管理员用户
-- 创建管理员(所有权限)
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'Admin@12345';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
5. 查看和管理用户
查看所有用户
-- MySQL 5.7+
SELECT user, host FROM mysql.user;
-- MySQL 8.0+
SELECT user, host, plugin FROM mysql.user;
查看用户权限
-- 查看指定用户的权限
SHOW GRANTS FOR 'john'@'localhost';
-- 查看当前用户权限
SHOW GRANTS;
修改用户密码
-- MySQL 5.7 及以前
SET PASSWORD FOR 'john'@'localhost' = PASSWORD('new_password');
-- MySQL 5.7.6+ 和 8.0
ALTER USER 'john'@'localhost' IDENTIFIED BY 'new_password';
-- 修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'new_password';
删除用户
-- 删除用户
DROP USER 'john'@'localhost';
-- 删除用户(如果存在)
DROP USER IF EXISTS 'john'@'localhost';
重命名用户
RENAME USER 'old_name'@'localhost' TO 'new_name'@'localhost';
6. 权限撤销
-- 撤销特定权限
REVOKE INSERT ON mydb.* FROM 'john'@'localhost';
-- 撤销所有权限
REVOKE ALL PRIVILEGES ON *.* FROM 'john'@'localhost';
-- 撤销授权选项
REVOKE GRANT OPTION ON *.* FROM 'john'@'localhost';
7. 最佳实践
密码安全建议
-- 使用强密码(包含大小写、数字、特殊字符)
CREATE USER 'secure'@'localhost' IDENTIFIED BY 'MyP@ssw0rd2024!';
-- 设置密码过期策略
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 设置用户锁定策略(失败重试)
ALTER USER 'app_user'@'localhost' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
最小权限原则
-- 不要随意授予 ALL PRIVILEGES
-- 只授予完成任务所需的最小权限
-- 好的做法
GRANT SELECT, INSERT ON app_db.* TO 'user'@'localhost';
-- 避免的做法
GRANT ALL ON *.* TO 'user'@'localhost';
8. 完整的创建用户脚本模板
-- 创建用户完整脚本
-- 1. 创建用户
CREATE USER IF NOT EXISTS 'newuser'@'localhost' IDENTIFIED BY 'StrongP@ss123';
-- 2. 设置密码策略(可选)
ALTER USER 'newuser'@'localhost'
PASSWORD EXPIRE INTERVAL 90 DAY
FAILED_LOGIN_ATTEMPTS 3;
-- 3. 授予权限
GRANT SELECT, INSERT, UPDATE ON mydatabase.* TO 'newuser'@'localhost';
-- 4. 设置资源限制(可选)
ALTER USER 'newuser'@'localhost'
WITH MAX_QUERIES_PER_HOUR 100
MAX_UPDATES_PER_HOUR 20
MAX_CONNECTIONS_PER_HOUR 10;
-- 5. 刷新权限
FLUSH PRIVILEGES;
-- 6. 验证
SHOW GRANTS FOR 'newuser'@'localhost';
注意事项
- 主机设置:
localhost表示只能本机连接,%表示任意主机 - 权限生效:修改权限后记得执行
FLUSH PRIVILEGES - 安全建议:避免使用弱密码,遵循最小权限原则
- 备份:删除用户前先备份相关权限信息
- MySQL 版本差异:MySQL 8.0 和 5.7 在密码管理上有差异
执行这些操作需要具有 CREATE USER 和 GRANT 权限(通常是 root 用户)。
网站:http://shibowl.top
github:https://github.com/hanbinjxnc
博客园:https://www.cnblogs.com/hool
博客:https://blog.shibowl.top
淘宝店:https://boxunwl.taobao.com/
作者:世博 2019年4月28日----
github:https://github.com/hanbinjxnc
博客园:https://www.cnblogs.com/hool
博客:https://blog.shibowl.top
淘宝店:https://boxunwl.taobao.com/
作者:世博 2019年4月28日----
浙公网安备 33010602011771号