MySQL用户管理实战:从CREATE USER到GRANT权限与密码策略
提到MySQL数据库很多人第一反应是写SQL、优化慢查询、搭主从复制。但真正在生产环境里滚过几圈的人都知道用户管理才是那个最容易忽略、却最容易翻车的地方。权限开太大导致线上数据被误删、密码过期导致凌晨三点应用连接全部断掉、开发提了个工单说帮我建个账号结果你顺手给了个ALL PRIVILEGES——这些问题我都真实遇到过每一个都是血淋淋的教训。这篇文章不讲虚的纯粹分享一下我在日常运维和项目开发里反复用到的MySQL用户管理实操经验。内容覆盖用户创建、密码管理、权限授予与回收、常见报错排查以及我吃了亏之后总结出来的一套最佳实践。不管你是刚接触MySQL的新手还是已经在写存储过程的老手只要你的应用在连数据库这篇文章都能帮你少踩几个坑。1. 搞清楚MySQL的用户模型——账号不是只有用户名而已1.1 用户是用户名主机的组合MySQL里的用户和你在Linux上创建的账号不一样。MySQL中一个完整的用户定义是用户名主机两个部分缺一不可。主机部分用来限制这个账号只能从哪里发起连接比如app_userlocalhost表示只能在本机登录app_user192.168.1.%表示只能从192.168.1.x网段连接。这个设计经常被新手忽略但它真的是一个非常实用的安全机制。我在实际项目中遇到过这样的情况某开发同学为了图省事把所有应用账号都建成了app%%表示任意主机都可以连。结果就是这个账号的密码一旦泄露任何一台能访问数据库端口的机器都能直接登进来连防火墙都救不了你。后来我们规范改成精确到应用服务器的IP段之后即便是有人拿到了密码也没法从外部登录防线至少多了一层。再补充一点容易搞混的applocalhost和app%在MySQL看来是两个不同的用户拥有完全独立的密码和权限。你给其中一个改了密码不影响另一个。所以如果你发现改了密码不生效先查一下是不是改了applocalhost但应用实际连接的是app%。1.2 权限数据存在哪里mysql.user系统表所有用户账号和全局权限信息都存储在系统数据库mysql里的user表中MySQL 8.0后是一张InnoDB表5.7及之前是MyISAM表。此外还有db、tables_priv、columns_priv这几张表分别存储库级、表级和列级的权限。当你执行CREATE USER、GRANT这些语句时MySQL本质上就是在改这些系统表。但注意你永远不应该直接对mysql.user表做 INSERT、UPDATE、DELETE 来管理用户。我见过有人图方便直接UPDATEmysql.user表去改密码结果撞上了权限凭证缓存的问题导致改完密码不生效最后还得靠FLUSH PRIVILEGES来找补。用官方提供的CREATE USER、ALTER USER、DROP USER语句才是正路这些语句会同时处理好权限凭证和权限缓存不会留下各种奇怪的中间状态。2. 用户的创建、修改与删除——每个操作都有讲究2.1 创建用户CREATE USER的完整姿势最简单的创建用户语句CREATE USER app_user192.168.1.% IDENTIFIED BY StrongPass2024;这个语句做了三件事创建账号、绑定允许连接的主机范围、设置初始密码。在MySQL 8.0中默认的认证插件是caching_sha2_password这是一个安全性更高的密码认证方式。但如果你是跟一些比较老的应用对接比如某些老版本的PHP或Java客户端不支持这个插件连接时就会报Authentication plugin caching_sha2_password cannot be loaded的错误。这种情况有两种解决办法第一种在创建用户时指定使用老的兼容认证插件CREATE USER app_user192.168.1.% IDENTIFIED WITH mysql_native_password BY StrongPass2024;第二种对已经创建好的用户修改认证插件ALTER USER app_user192.168.1.% IDENTIFIED WITH mysql_native_password BY StrongPass2024;我的建议是新项目优先用默认的caching_sha2_password如果连接报插件错误再降级兼容而不是一上来就直接用老插件。毕竟安全总是在往前走的能不用老认证方式就不用。另外提一句创建用户时如果用户已经存在会直接报ERROR 1396。所以我在写自动化脚本的时候通常会先判断用户是否存在-- 如果存在则删除仅限测试环境这么干 DROP USER IF EXISTS app_user192.168.1.%; CREATE USER app_user192.168.1.% IDENTIFIED BY StrongPass2024;生产环境不建议这么暴力更稳妥的是用CREATE USER IF NOT EXISTS但要注意这个语句在用户已存在时只是静默跳过并不会更新密码或权限该做的检查还是得做。2.2 修改密码与用户属性ALTER USER是主力日常运维中改密码是我做过最多的操作之一。改密码的标准语句是ALTER USERALTER USER app_user192.168.1.% IDENTIFIED BY NewStrongPass2024;这条语句同时完成两件事更新密码哈希值并清除该账号之前的认证缓存所以不需要额外执行FLUSH PRIVILEGES。MySQL还提供了SET PASSWORD方式SET PASSWORD FOR app_user192.168.1.% NewStrongPass2024;不过SET PASSWORD在MySQL 8.0里已被标记为deprecated官方推荐的方向是统一用ALTER USER。我在新写的脚本里已经全面切到ALTER USER语法更统一也不好踩到弃用警告。除了密码ALTER USER还可以管理密码过期策略。比如强制某些高权限账号90天必须改一次密码ALTER USER dba_userlocalhost PASSWORD EXPIRE INTERVAL 90 DAY;我之前在某个项目的合规审计中就被要求给所有数据库账号设置密码过期策略如果你也有类似需求直接在上面这条语句里改天数就行。2.3 删除用户DROP USER也要小心删除用户同样用官方语句DROP USER app_user192.168.1.%;执行前先确认这个账号没有正在被应用使用。我曾经遇到过的情况是删了某个账号之后第二天业务方找过来问为什么导出任务跑不了了一查才发现那个导出任务用的就是刚被清理的账号。所以删用户之前一定要先在监控平台或者通过SHOW PROCESSLIST看看当前有没有来自该账号的活动连接最好挑低峰期操作并且提前通知业务方。另外删了用户之后它名下的权限记录也会一并清除因为权限挂在用户上不是独立存在的。如果只是想让一个账号暂时不能用用ALTER USER app_user192.168.1.% ACCOUNT LOCK锁定比直接删除更安全随时可以解锁恢复不用重新配置一堆权限。3. 权限体系与GRANT/REVOKE实操3.1 权限层级从全局到单元格MySQL的权限体系是分层的大致可以这么理解全局权限作用于MySQL实例的所有数据库存放在mysql.user表比如SELECT *.*、PROCESS、SUPER。库级权限作用于某个特定数据库存放在mysql.db表比如SELECT db_name.*。表级权限作用于某张表存放在mysql.tables_priv表比如SELECT db_name.table_name。列级权限作用于某张表的某些列存放在mysql.columns_priv表比如SELECT (col1, col2) ON db_name.table_name。例程权限作用于存储过程和函数比如EXECUTE、ALTER ROUTINE。权限的判定遵循叠加原则ALL ON *.*的权限包含了SELECT ON db_name.*的权限。同时MySQL还有一套最小权限足够用的原则意思是给账号的权限越少越好够用就行。这不是教条而是实实在在的安全考量——权限越大出事的波及范围就越大。3.2 GRANT和REVOKE的正确用法给用户授权-- 授予app_user对app_db的增删改查权限 GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO app_user192.168.1.%; -- 授予app_user所有库的只读权限 GRANT SELECT ON *.* TO app_reader192.168.1.%; -- 授予某张表的特定列权限 GRANT SELECT (id, name, age) ON app_db.user_info TO analystlocalhost;收回权限-- 收回INSERT权限 REVOKE INSERT ON app_db.* FROM app_user192.168.1.%; -- 一次性收回所有权限仍然保留账号 REVOKE ALL PRIVILEGES, GRANT OPTION FROM app_user192.168.1.%;这里有个非常普遍的误解执行了GRANT之后到底要不要执行FLUSH PRIVILEGES答案是如果你用的是GRANT、REVOKE、CREATE USER、ALTER USER、DROP USER这些官方语句MySQL会自动重载权限不需要手动刷新。FLUSH PRIVILEGES主要在两种场景下才有必要一是你直接修改了权限系统表但前面说过不建议这么干二是某些版本或者某些主从架构下权限变更没有立即生效时用来强制刷新。还有一个细节WITH GRANT OPTION是授权中比较容易出危险的一个选项。它允许用户把自己拥有的权限再授予给其他用户。如果管理不善低权限用户可以一层层传递授权绕过你的管控。所以默认情况下不要轻易给普通应用账号加WITH GRANT OPTION。我在实际项目里只给 DBA 和专门的管理员账号开这个选项。3.3 查看权限别靠猜直接SHOW GRANTS检查一个用户当前有哪些权限最直接的办法是SHOW GRANTS FOR app_user192.168.1.%;输出会列出这个账号的所有权限条目。如果你不记得用户定义中的主机部分该怎么写也可以先查用户表SELECT user, host, authentication_string FROM mysql.user;查出来的host字段就是你需要在SHOW GRANTS里用的完整主机部分。对于权限排错还有一种情况你明明给app_db授了权业务却说没有权限。这时候要检查是不是权限授在了错误的库名上比如数据库实际叫app-db而你授成了app_db下划线 vs 短横线这种低级错误我见过不止一次。SHOW GRANTS能非常直观地看出问题。4. 高频报错与排查实录4.1 ERROR 1045: Access denied这恐怕是MySQL用户管理中最常见的错误了。完整报错类似ERROR 1045 (28000): Access denied for user app_user192.168.1.10 (using password: YES)排查思路按顺序来确认app_user是否真的存在。用SELECT user, host FROM mysql.user WHERE userapp_user;查一下。确认主机匹配。报错里的192.168.1.10是MySQL根据你客户端的IP匹配到的主机条目。如果建的是app_user192.168.1.%那这个IP在范围内但如果建的是app_userlocalhost远端就连不上。确认密码正确。密码不对也会报1045而且MySQL不会告诉你用户名不存在还是密码错误它统一返回Access denied这是安全设计不要试图从报错里去分辨。排查到这里我一般习惯再做一件事用mysql -u app_user -p -h 127.0.0.1 -P 3306在本地直连测试一下区分是网络问题、账号问题还是应用连接参数问题。实测下来这个操作能省下大量来回沟通的时间。4.2 ERROR 1819: 密码不符合策略ERROR 1819 (HY000): Your password does not satisfy the current policy requirements这个错是密码校验插件validate_password在拦你。MySQL 5.7和8.0默认开启了密码策略要求密码满足一定的长度、大小写、数字和特殊字符组合。查看当前策略SHOW VARIABLES LIKE validate_password%;常见输出项变量名含义常见默认值validate_password.length最小长度8validate_password.number_count数字个数1validate_password.mixed_case_count大小写混合个数1validate_password.special_char_count特殊字符个数1validate_password.policy策略等级MEDIUM如果只是想快速通过校验就按策略要求设置一个复杂密码。如果确实需要在测试环境临时降低策略可以这样操作生产环境强烈不建议SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 4;需要说明的是SET GLOBAL只对本次实例有效重启后失效并且这种放宽会给生产环境带来严重的安全风险。测试环境玩玩可以生产环境务必保持默认或更严格的策略。4.3 授权后依然提示没有权限一种常见情况你给用户授了app_db所有权限但是用户下的表在另一个同名的不同数据库里。可以用SHOW DATABASES确认实际库名。另一种情况MySQL在权限匹配时是先匹配全局权限再看库级、表级如果全局权限里没有就会从库级、表级去查。有时候你会发现SHOW GRANTS里权限确实存在但客户端工具连上后还是提示没权限——这种多半是连错了实例。比如测试环境和生产环境共用同一个账号名和密码但你授权授在了测试库应用连的生产库自然没权限。建议在做权限变更时先SELECT hostname, port;确认当前连的是哪台机器、哪个端口。4.4 忘记密码怎么办最后再说一个运维一定会遇到的场景root密码忘了。处理思路是跳过权限表以安全模式启动实例然后重置密码。简要步骤如下停止MySQL服务。以跳过授权表的方式启动mysqld --skip-grant-tables --skip-networking跳过网络监听避免裸奔在网络上。用root免密登录mysql -u root。先刷新权限让凭证缓存加载FLUSH PRIVILEGES;重置密码ALTER USER rootlocalhost IDENTIFIED BY NewRootPass2024;正常重启MySQL服务。这里要特别提醒--skip-grant-tables状态下数据库是没有鉴权的任何能连上实例的人都可以直接操作所有数据所以启动时必须加上--skip-networking同时千万不要让实例暴露在公网。操作完立刻正常重启回到安全的运行状态。5. 我的最佳实践清单——长期运维总结下来的规矩5.1 权限最小化原则的执行细则前面反复提到最小权限原则这里把我在团队里强制推行的几条细则列出来应用账号只需要SELECT、INSERT、UPDATE、DELETE绝不授予DDL权限CREATE、DROP、ALTER。只读账号只给SELECT连LOCK TABLES都不要给除非有明确需求。备份账号单独建授予SELECT、RELOAD、SHOW DATABASES、PROCESS等备份工具所需的权限不要直接拿root去跑备份。不同应用用不同的账号不要所有应用共享一个账号。否则出了安全事件根本没法定位是哪条链路泄露的。主机部分精确到IP或网段尽量不用%。虽然配置麻烦一点但安全收益非常高。5.2 密码与账号的生命周期管理我这边现在强制要求应用连接数据库不能直接用明文密码写在配置文件里至少要用环境变量或者配置中心管理。涉及账号变更时按变更评审—测试环境验证—生产低峰执行—业务回归四步走不要凭感觉直接在生产环境敲命令。密码过期策略这块前面提到的ALTER USER ... PASSWORD EXPIRE INTERVAL要用起来但也要注意某些老的应用在密码过期后不会自动处理过期状态会导致连接全部失败。所以设置过期策略之前先确认应用侧是否支持处理密码过期比如连接池是否有重连和重认证机制否则半夜告警就等着你。5.3 定期审查账号和权限我的习惯是每季度做一次账号权限审查。具体做两件事找出mysql.user中所有host%的账号逐一确认是否真的需要。找出权限过大的账号比如有ALL PRIVILEGES或WITH GRANT OPTION的确认持账号的人是否还需要这些权限。这个习惯帮我避免过不少麻烦。曾经有一次审查中发现一个离职同事的账号还挂在某台测试机上全局权限是ALL。如果那台机器被攻破整个数据库都不设防了。还好发现得早当场就清了。6. 写在最后的实操感触做MySQL用户管理这几年我最深的体会是数据库权限安全不是靠某一个无敌配置实现的而是靠一套环环相扣的习惯和规范堆出来的。用官方语句管理用户、给最小的够用权限、把主机范围收紧、定期审查账号归属——这些单拎出来都不复杂难的是每一次都坚持这么做。还有一个小技巧分享给看到这里的朋友当你准备给某个表新增一列时如果涉及权限调整记得先SHOW GRANTS确认现在授予的是表级还是库级权限因为表级权限不会自动覆盖新列列权限影响范围之外实际使用中容易踩到明明有权限却读不到新列的坑。用户管理是个看起来基础、做起来细节极多的活。希望这篇内容能帮你把MySQL账号这块的基础打牢少走我当时走过的弯路。如果你有自己独特的踩坑经历欢迎在评论区聊聊。

相关新闻

基于冠豪猪优化算法的RBF神经网络分类预测Matlab实现

基于冠豪猪优化算法的RBF神经网络分类预测Matlab实现

做机器学习最磨人的事,一半在选模型,另一半在调参数。径向基神经网络(RBFNN)这个名字听起来挺唬人,可真正跑起来你会发现,最核心的中心、宽度、输出权重三个环节全是坑。尤其是当你要拿它做数据分类预测时&…

2026/10/19 5:33:23 阅读更多 →
面向过程编程中的封装:从函数到模块的边界设计

面向过程编程中的封装:从函数到模块的边界设计

1. 被误解最深的"封装":它从来不是面向对象的专利很多人第一次听到"封装"这个词,是在学面向对象编程的时候。老师会告诉你,把数据和方法包在类里面,用private藏起来,只暴露public接口,…

2026/10/19 5:33:23 阅读更多 →
基于内容的图像检索实战:从特征提取到检索排序的完整方案

基于内容的图像检索实战:从特征提取到检索排序的完整方案

简介:这是一份面向图像处理方向学习者与开发者的基于内容的图像检索(CBIR)系统实现代码包,适合具备一定Python基础、希望动手搭建以图搜图原型或完成课程设计的技术人员。资源围绕特征提取、特征量化编码、相似度计算、数据库构建…

2026/10/19 5:32:22 阅读更多 →

最新新闻

Dify工作流实现双模型分栏流式对比:从原理到实践

Dify工作流实现双模型分栏流式对比:从原理到实践

最开始我对比两个模型的回答质量,用的还是最笨的办法:开两个浏览器标签页,把同一个问题分别粘进去,再左右来回切。遇到长回答还得自己对对齐位置,效率低到让人怀疑人生。直到我把这套动作搬进 Dify,用可视化…

2026/10/19 6:51:01 阅读更多 →
击剑赛事编排引擎:离线优先、规则可配置的本地化工具

击剑赛事编排引擎:离线优先、规则可配置的本地化工具

简介:Engarde816是一款面向击剑赛事组织者、裁判团队及体育信息化管理者的专业编排软件,专为解决中小型至大型击剑比赛中的分组抽签、赛制设定(单/双败淘汰、循环赛)、对阵生成、实时成绩追踪与多场地日程协同等核心难题而设计。资…

2026/10/19 6:51:01 阅读更多 →
TaskExplorer 完整指南:跨平台深度进程监控工具

TaskExplorer 完整指南:跨平台深度进程监控工具

TaskExplorer 完整指南:跨平台深度进程监控工具 【免费下载链接】TaskExplorer Power full Task Manager for Windows and Linux 项目地址: https://gitcode.com/GitHub_Trending/ta/TaskExplorer TaskExplorer 是一款功能强大的跨平台任务管理器&#xff0c…

2026/10/19 6:51:01 阅读更多 →
DeepSeek-V4-Flash-Vision-Exp-MLX生产部署指南:OpenAI兼容API与本地服务搭建

DeepSeek-V4-Flash-Vision-Exp-MLX生产部署指南:OpenAI兼容API与本地服务搭建

【免费下载链接】DeepSeek-V4-Flash-Vision-Exp-MLX 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/DeepSeek-V4-Flash-Vision-Exp-MLX 点击查看 免费下载 DeepSeek-V4-Flash-Vision-Exp-MLX 是 DeepSeek V4 系列的实验性多模态模型(支持…

2026/10/19 6:51:01 阅读更多 →
VideoMamba开发者指南:如何将它作为Backbone无缝替换ViT接入你的视频项目

VideoMamba开发者指南:如何将它作为Backbone无缝替换ViT接入你的视频项目

【免费下载链接】VideoMamba 项目地址: https://ai.gitcode.com/OpenGVLab/VideoMamba 点击查看 免费下载 VideoMamba 是一个基于双向状态空间模型(Bidirectional SSM)的轻量级视频理解模型,由 OpenGVLab 开发,核心定…

2026/10/19 6:51:01 阅读更多 →
LTX-2 在 ComfyUI 中如何落地:ComfyUI-LTXVideo 节点安装、首跑与显存配置指南

LTX-2 在 ComfyUI 中如何落地:ComfyUI-LTXVideo 节点安装、首跑与显存配置指南

LTX-2 在 ComfyUI 中如何落地:ComfyUI-LTXVideo 节点安装、首跑与显存配置指南 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo 本文面向刚接触 AI 视频生成的读者&am…

2026/10/19 6:50:01 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →