【重学 MySQL】九十八、MySQL用户管理全指南:创建、修改、删除
【重学 MySQL】九十八、MySQL用户管理全指南:创建、修改、删除
- **1. 创建用户(CREATE USER)**
- **基础语法**
- **进阶选项**
- **示例**
- **2. 修改用户(ALTER USER / RENAME USER)**
- **修改账户属性**
- **重命名用户**
- **密码管理**
- **3. 删除用户(DROP USER)**
- **基础语法**
- **批量删除示例**
- **4. mysql 命令结构解析**
- **完整示例**
- **示例1:查询数据库版本**
- **示例2:远程查询用户列表**
- **示例3:导出查询结果到文件**
- **常见问题与解决方案**
- **问题1:连接失败(ERROR 2003)**
- **问题2:认证失败(ERROR 1045)**
- **问题3:SQL语句执行错误**
- **高级用法**
- **批量执行多条SQL**
- **处理特殊字符**
- **静默模式(减少输出)**
- **安全建议**
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.com'; -- 可添加元数据
- 示例:
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.100
或db.example.com
),默认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.100
的mydb
数据库,查询用户信息。
示例3:导出查询结果到文件
mysql -u root -p -e "SELECT * FROM employees LIMIT 10;" company_db > employees.csv
将company_db
数据库中employees
表的前10条记录导出为CSV文件。
常见问题与解决方案
问题1:连接失败(ERROR 2003)
- 原因:网络不通、防火墙阻止、MySQL服务未启动。
- 解决:
- 检查服务状态:
sudo systemctl status mysqld
(Linux)。 - 测试端口连通性:
telnet 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.cnf
文件存储凭据(需设置文件权限为600
):[client] user = username password = password host = localhost
- 限制用户权限:遵循最小权限原则,避免使用
ALL PRIVILEGES
。
通过以上方法,您可以高效、安全地通过命令行执行MySQL操作,适合自动化脚本或快速数据检索场景。