【重学 MySQL】九十八、MySQL用户管理全指南:创建、修改、删除

1. 创建用户(CREATE USER)

基础语法

CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  • 参数说明
    • username:用户名(推荐小写,避免大小写敏感问题)。
    • host:允许访问的主机(localhost仅限本地,%表示任意主机,如192.168.1.%匹配网段)。
    • password:强密码(MySQL 8.0默认要求至少8位,包含字母、数字、符号)。

进阶选项

  • 指定认证插件(兼容旧应用):
    CREATE USER 'old_app'@'host' 
    IDENTIFIED WITH mysql_native_password BY 'password';
    
  • 密码过期策略(强制定期修改):
    CREATE USER 'temp_user'@'%' 
    IDENTIFIED BY 'TempP@ss!' 
    PASSWORD EXPIRE INTERVAL 90 DAY; -- 90天后密码失效
    

示例

-- 本地管理员账户
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'Secur3P@ss!';

-- 允许远程访问的开发者账户
CREATE USER 'dev_user'@'192.168.1.%' IDENTIFIED BY 'DevP@ss!';

2. 修改用户(ALTER USER / RENAME USER)

修改账户属性

ALTER USER 'username'@'host' 
IDENTIFIED BY 'new_password', 
HOST 'new_host', 
ATTRIBUTE 'email' = 'user@example.***'; -- 可添加元数据
  • 示例
    ALTER USER 'dev_user'@'192.168.1.%' 
    IDENTIFIED BY 'NewDevP@ss!',
    HOST '10.0.0.%'; -- 修改主机范围
    

重命名用户

RENAME USER 'old_name'@'host' TO 'new_name'@'host';
  • 示例
    RENAME USER 'admin'@'localhost' TO 'superadmin'@'localhost';
    

密码管理

  • 强制修改密码(下次登录时):
    ALTER USER 'username'@'host' PASSWORD EXPIRE;
    
  • 历史密码检查(防止重复使用):
    SET GLOBAL password_history = 6; -- 禁止使用最近6个旧密码
    

3. 删除用户(DROP USER)

基础语法

DROP USER 'username'@'host';
  • 注意:删除用户会自动撤销其所有权限,无需手动执行REVOKE

批量删除示例

-- 删除所有以'test_'开头的用户
DROP USER IF EXISTS 'test_%'@'%';

在MySQL命令行中,使用mysql -h|--host -P|--port -u|--user -p|--password -e的组合可以直接执行SQL语句而无需进入交互式环境,特别适合脚本化操作或快速查询。以下是完整指南及注意事项:

4. mysql 命令结构解析

mysql -h 主机名/IP -P 端口 -u 用户名 -p -e "SQL语句" 数据库名
  • 关键参数
    • -h:主机地址(如192.168.1.100db.example.***),默认localhost
    • -P:端口号(如3307),默认3306必须大写P)。
    • -u:用户名(如admin)。
    • -p:密码提示(执行时按回车输入密码,密码不跟在-p后,避免泄露)。
    • -e:直接执行的SQL语句(需用双引号包裹)。
    • 末尾的数据库名:可选,指定操作的数据库。

完整示例

示例1:查询数据库版本

mysql -h localhost -P 3306 -u root -p -e "SELECT VERSION();" 

执行后系统提示输入密码,成功登录后输出MySQL版本。

示例2:远程查询用户列表

mysql -h 192.168.1.100 -u remote_user -p -e "SELECT user, host FROM mysql.user;" mydb

连接远程主机192.168.1.100mydb数据库,查询用户信息。

示例3:导出查询结果到文件

mysql -u root -p -e "SELECT * FROM employees LIMIT 10;" ***pany_db > employees.csv

***pany_db数据库中employees表的前10条记录导出为CSV文件。

常见问题与解决方案

问题1:连接失败(ERROR 2003)

  • 原因:网络不通、防火墙阻止、MySQL服务未启动。
  • 解决
    • 检查服务状态:sudo systemctl status mysqld(Linux)。
    • 测试端口连通性:tel*** 192.168.1.100 3306
    • 关闭防火墙或开放端口:sudo ufw allow 3306/tcp

问题2:认证失败(ERROR 1045)

  • 原因:用户名/密码错误、用户无远程访问权限、认证插件不兼容。
  • 解决
    • 重置密码(需管理员权限):
      ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';
      
    • 检查用户权限:
      SELECT host, user FROM mysql.user;  -- 确认用户是否有远程访问权限(如'%')
      
    • 兼容旧客户端(MySQL 8.0+):
      ALTER USER '用户名'@'主机' IDENTIFIED WITH mysql_native_password BY '密码';
      

问题3:SQL语句执行错误

  • 原因:语法错误、表/列不存在、权限不足。
  • 解决
    • 在交互式环境中先测试SQL语句。
    • 检查用户权限:SHOW GRANTS FOR '用户名'@'主机';
    • 确保表名/列名正确(注意大小写敏感)。

高级用法

批量执行多条SQL

使用分号分隔多条语句(需在-e中整体包裹):

mysql -u root -p -e "USE mydb; \
SET @start_date = '2023-01-01'; \
SELECT * FROM orders WHERE order_date >= @start_date;"

处理特殊字符

若SQL语句包含双引号或特殊符号,需用单引号包裹整个-e参数:

mysql -u user -p -e 'SELECT * FROM "table_with_quotes";' dbname

静默模式(减少输出)

添加-s--silent参数,减少额外输出(如列标题):

mysql -s -u user -p -e "SELECT id, name FROM users;" dbname

安全建议

  • 避免明文密码:不要在命令中直接写密码(如-p密码),易被历史记录或他人窥见。
  • 使用连接池或配置文件:通过~/.my.***f文件存储凭据(需设置文件权限为600):
    [client]
    user = username
    password = password
    host = localhost
    
  • 限制用户权限:遵循最小权限原则,避免使用ALL PRIVILEGES

通过以上方法,您可以高效、安全地通过命令行执行MySQL操作,适合自动化脚本或快速数据检索场景。

转载请说明出处内容投诉
CSS教程网 » 【重学 MySQL】九十八、MySQL用户管理全指南:创建、修改、删除

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买