导出 mysql.user 表时必须显式指定字段并排除 authentication_string(mysql 8.0+)或 password(5.7 及更早),如 select user, host, account_locked, password_expired from mysql.user;需确保用户有 file 权限且目标路径由 mysql 进程可写。

导出 mysql.user 表时跳过 password 字段
直接用 SELECT ... INTO OUTFILE 从 mysql.user 表导出用户信息时,password 字段(MySQL 5.7 及更早)或 authentication_string 字段(MySQL 8.0+)会一并写入文件,存在敏感信息泄露风险。不能靠导出后再手动删列,得从源头排除。
MySQL 8.0+ 必须用 authentication_string,且不能 SELECT *
MySQL 8.0 废弃了 password 字段,改用 authentication_string;同时默认启用 caching_sha2_password 插件,该字段值是不可逆哈希,但依然属于凭证类敏感数据,必须显式排除。
- 错误写法:
SELECT * FROM mysql.user INTO OUTFILE '/tmp/users.csv'—— 会包含authentication_string - 正确写法:明确列出所需字段,例如
SELECT user, host, account_locked, password_expired FROM mysql.user - 注意:
plugin字段可保留,用于判断认证方式;但authentication_string和password(若旧版本残留)都应跳过
INTO OUTFILE 要求 FILE 权限和服务器路径可写
这条语句不是在你本地执行的,而是在 MySQL 服务端生成文件,所以两个硬性前提缺一不可:
🎯 HR面试评价助手(Word版格式) 生成可直接复制到Word文档的标准格式HR面试评价 【使用方式】 1. 发送口令:HR面试评价 2. 粘贴JD文字 3. 上传简历文档 4. 上传面试记录(可选) 5. 复制生成的评价到Word 【输出特点】 - 纯文本格式,可直接粘贴到Word - 层次清晰,标题加粗...
- 当前登录用户必须有
FILE权限:SHOW GRANTS FOR CURRENT_USER查看,没有就需 DBA 授权GRANT FILE ON *.* TO 'user'@'host' - 目标路径如
/tmp/或/var/lib/mysql-files/必须由 MySQL 进程(通常是mysql用户)可写,且不能是用户家目录或挂载的 NFS 卷(多数发行版默认禁用) - 导出后需通过
scp或 SFTP 手动下载,不能直接访问 Web 或共享目录
更安全的替代方案:用 mysql 客户端 + --skip-column-names --batch
如果没 FILE 权限,或不想在服务端留临时文件,用客户端命令组合更可控:
mysql -u root -p -N -B -e "SELECT user, host, account_locked, password_expired FROM mysql.user WHERE user != 'root' OR host != 'localhost'" mysql > users_safe.tsv
-
-N跳过列名行,-B启用 tab 分隔(比 CSV 更不易被引号/换行破坏),适合后续awk或 Python 处理 - WHERE 条件建议过滤掉高权限账号(如
root@localhost),避免误导出关键账户元信息 - 输出是本地文件,不经过服务端磁盘,也规避了
secure_file_priv限制
真正容易被忽略的是:MySQL 8.0 的 mysql.user 表里还有 password_last_changed、password_lifetime 等衍生字段,它们虽不存哈希值,但可能间接暴露密码策略强度——是否排除,得看你的合规要求,而不是只盯着 authentication_string。










