达梦8数据库端口修改全攻略:五种方法详解与实战避坑指南
1. 项目概述为什么需要修改达梦8数据库端口在数据库的日常运维和项目部署中修改默认监听端口是一个再常见不过的操作。达梦数据库DM8默认使用5236端口这个端口号就像你家门牌号告诉客户端“我在这里”。但在实际生产环境中这个“门牌号”常常需要更换。原因有很多最常见的就是端口冲突比如你的服务器上同时运行着多个服务恰好另一个应用也占用了5236端口数据库服务就会启动失败。另一个重要原因是安全策略遵循“最小暴露原则”修改默认端口可以避免被自动化扫描工具轻易识别和攻击算是一道基础的安全加固措施。此外在一些复杂的网络架构中比如需要通过防火墙或负载均衡器如Nginx进行端口转发时也需要将数据库端口调整为规划好的特定端口。最近在做一个国产化项目需要将Java应用、Nginx、Redis和达梦8数据库一起打包成一个ARM架构的容器镜像。在构建镜像和编排服务时就必须明确指定数据库的监听端口不能依赖默认值否则容器内的服务无法互通。这让我重新系统地梳理了一遍在达梦8中修改端口的所有可行方法。我发现很多开发者只知道通过配置文件修改一旦遇到服务无法启动或客户端连不上的情况就束手无策。其实根据不同的场景和需求至少有五种主流方法可以完成这个任务每种方法都有其适用的时机和需要注意的“坑”。接下来我就结合自己的实操经验把这五种方法掰开揉碎了讲清楚让你不仅能改端口更能明白为什么要这么改以及改了之后如何验证和排查问题。2. 核心需求与场景深度解析修改数据库端口听起来只是一个数字的变化但其背后关联着数据库系统的多个层次。理解这些才能在选择方法时做出最佳决策。2.1 安全合规与网络规划驱动首要驱动力来自安全。默认端口是公开信息使用默认端口相当于在网络安全的大门上贴了个“此处进入”的标签。修改端口是安全基线配置的基本要求虽然不能完全阻止定向攻击但能有效防范大规模的自动化扫描和爆破。其次是内部网络规划。在中大型企业不同环境开发、测试、生产的数据库端口可能有一套编码规则例如开发环境用5236测试环境用6236生产环境用7236便于管理和识别。2.2 规避冲突与适配复杂部署这是最直接的痛点。除了其他数据库实例如另一个DM8或MySQL可能冲突外一些应用程序也会占用大端口。我曾遇到过因为一个遗留的中间件服务占用了5236端口导致新部署的达梦数据库一直报错“Windows Sockets error: 通常每个套接字地址只允许使用一次”排查了半天才发现是端口冲突。在容器化部署场景下端口映射是关键。比如在Docker中你可能需要将容器内的5236端口映射到宿主机的另一个端口如33306这时就需要明确知晓并配置容器内的数据库监听端口。2.3 客户端连接与工具适配端口修改后所有客户端连接字符串都必须同步更新。这包括JDBC连接Java应用的url需要从jdbc:dm://192.168.1.100:5236改为新的端口。管理工具如DM管理工具、dts迁移工具以及第三方工具如DbVisualizer、DBeaver或Navicat需使用达梦驱动在新建连接时都必须指定新端口。命令行工具disql达梦的交互式工具、dmrman备份恢复工具等在连接时都需要通过-p参数指定端口。如果只改了服务端客户端没改就会遇到“不能建立到远程计算机的连接”的错误让人误以为是网络或服务问题。3. 五种修改端口方法详解与实操对比下面进入核心部分。我将这五种方法分为三大类通过配置文件修改静态、通过管理工具修改图形化、通过SQL命令修改动态有限制。每种方法我都会给出详细步骤、原理和适用场景。3.1 方法一直接修改数据库配置文件dm.ini这是最根本、最彻底的方法修改的是数据库实例的“基因”。达梦数据库的核心参数都存储在dm.ini文件中。操作步骤定位文件首先找到你的达梦数据库实例的数据目录/dm/data/DAMENG/是默认路径具体取决于安装和初始化时的设置。dm.ini文件就在这个数据目录下。备份文件修改前务必备份这是一个好习惯。cp dm.ini dm.ini.bak。编辑参数使用vi或nano等编辑器打开dm.ini找到PORT_NUM这个参数。如果找不到可以在文件末尾添加。PORT_NUM 5237 #将端口号修改为你需要的例如5237重启数据库服务修改配置文件不会立即生效必须重启数据库实例。Linuxsystemctl restart DmServiceDMSERVER(服务名可能不同)。Windows在“达梦数据库服务管理”中重启对应服务。验证重启后使用netstat -anp | grep 5237Linux或netstat -ano | findstr 5237Windows查看新端口是否处于监听状态。原理与注意事项注意dm.ini中的PORT_NUM参数是静态参数。静态参数必须重启数据库才能生效与之相对的是动态参数可以通过SQL在线修改。端口号属于静态参数这是由数据库监听器的启动机制决定的。实操心得权限问题修改dm.ini需要文件系统的写权限通常需要dmdba用户或root权限。多实例环境如果你的服务器上部署了多个达梦实例每个实例都有自己独立的数据目录和dm.ini文件修改时务必确认当前操作的是目标实例的目录。配置未生效检查是否修改了正确的dm.ini。有时通过符号链接访问要确认最终的文件路径。重启服务后查看数据库日志/dm/data/DAMENG/dmserver.log搜索LISTEN ON [IP]:[PORT]字样确认监听地址。3.2 方法二通过DM管理工具图形化界面修改对于不习惯命令行的用户达梦数据库自带的管理工具manager提供了图形化修改方式。操作步骤连接数据库使用DM管理工具以SYSDBA用户连接到需要修改端口的数据库实例此时还是用旧端口连接。打开管理界面在左侧对象导航栏右键点击你的数据库实例名选择“管理服务器”。修改配置在弹出的“服务器配置”窗口中切换到“端口”或“连接”标签页不同版本可能略有不同直接修改“端口号”字段的值。保存并重启点击“确定”或“应用”保存配置。重要工具通常会提示“此参数为静态参数需要重启服务器后生效”。你必须手动重启数据库服务修改才会生效。原理与注意事项这个方法本质上是对方法一的图形化封装。管理工具在后台执行的就是更新dm.ini文件中PORT_NUM参数的值。所以它同样需要重启才能生效。实操心得连接前提你必须先用旧端口成功连接到数据库才能进行修改。如果旧端口因为冲突已经无法连接此方法不可用。防呆提示图形化工具的好处是有明确的提示避免新手修改了不知道要重启。版本差异不同小版本的DM管理工具界面布局可能微调但核心功能位置相似。3.3 方法三使用dminit初始化时指定端口如果你正在部署一个全新的数据库实例那么在初始化阶段就指定端口是最佳实践一劳永逸。操作步骤dminit是达梦数据库的初始化工具通常在/dm8/bin目录下。cd /dm8/bin ./dminit PATH/dm/data DB_NAMEDAMENG INSTANCE_NAMEDMSERVER PORT_NUM5237这条命令会在/dm/data/DAMENG目录下初始化一个全新的数据库并直接将监听端口设置为5237。后续使用dm_service_installer创建服务时就会基于这个端口。原理与注意事项dminit工具在创建数据文件、控制文件、日志文件的同时会生成初始的dm.ini文件并将命令行参数PORT_NUM的值写入该文件。因此这个方法仅适用于新建实例对已存在的实例无效。实操心得参数组合dminit参数非常多如页大小PAGE_SIZE、大小写敏感CASE_SENSITIVE等建议在初始化时一并规划好避免后期难以调整。路径与权限确保PATH指定的目录有足够的磁盘空间并且执行用户如dmdba有该目录的读写权限。服务注册初始化完成后记得使用dm_service_installer脚本将数据库注册为系统服务并确保服务配置中引用了正确的数据目录。3.4 方法四通过SQL命令修改系统参数SP_SET_PARA_VALUE这是一个有趣的方法它让你感觉像是在“在线”修改端口但实际上有严格限制。操作步骤使用disql工具连接到数据库。执行以下SQL命令SP_SET_PARA_VALUE(2, PORT_NUM, 5237);这里第一个参数2代表静态参数1代表动态参数3代表会话参数。执行成功后系统会提示参数值已修改但必须重启数据库服务才能生效。原理与注意事项SP_SET_PARA_VALUE是一个系统存储过程用于修改数据库参数。它确实可以修改dm.ini文件中的PORT_NUM值。但是端口号被定义为“静态参数”这是数据库内核的设计决定的。监听器在数据库启动时绑定网络端口运行时无法解除绑定并重新绑定到另一个端口。因此SQL命令只是将新值持久化到了配置文件中仍需重启来触发监听器使用新配置重新初始化。实操心得权限要求执行此存储过程需要SYSDBA或DBA权限。验证修改执行后可以立即查询参数值以确认SELECT * FROM V$PARAMETER WHERE NAME PORT_NUM;。你会发现VALUE字段已经变成了新值但FILE_VALUE字段可能还是旧值直到重启后才会同步。适用场景这个方法适合在需要编写自动化运维脚本时使用。脚本可以先通过SQL修改配置然后再调用服务重启命令实现一键修改端口。3.5 方法五修改达梦数据库服务脚本中的端口参数这种方法主要针对Linux系统通过修改服务启动脚本里的参数来影响端口。它并不直接修改数据库配置而是修改了启动数据库时的命令行参数。操作步骤找到服务脚本达梦数据库的服务脚本通常位于/etc/init.d/或/usr/lib/systemd/system/下例如DmServiceDMSERVER。分析启动命令打开服务脚本找到实际启动dmserver程序的命令。在systemd服务文件.service中关注ExecStart行在SysVinit脚本中关注start()函数里的命令。修改参数启动命令通常类似/dm8/bin/dmserver /dm/data/DAMENG/dm.ini -noconsole你可以通过添加-p参数来指定端口/dm8/bin/dmserver /dm/data/DAMENG/dm.ini -p 5237 -noconsole注意-p参数会覆盖dm.ini文件中的PORT_NUM设置。重载并重启服务systemctl daemon-reload # 对于systemd systemctl restart DmServiceDMSERVER原理与注意事项dmserver可执行文件在启动时会先读取dm.ini中的配置然后命令行参数拥有更高的优先级会覆盖配置文件中的相同设置。这种方法提供了一种“外部覆盖”的机制。实操心得优先级最高命令行参数-p的优先级高于dm.ini中的PORT_NUM。即使dm.ini里写的是5236用-p 5237启动实际监听的就是5237。临时性调整这种方法非常适合做临时测试或调试。比如你想临时换一个端口启动实例而不想动原始的配置文件。容易遗忘这也是一个“坑”。如果只在服务脚本里加了-p参数而dm.ini里还是旧端口那么某天你直接通过dmserver命令指定dm.ini文件启动时又会监听回旧端口造成配置不一致的混乱。因此长期变更建议还是直接修改dm.ini。4. 修改端口后的全链路验证与客户端配置修改服务端端口只是成功了一半确保所有客户端都能正确连接上才是闭环。4.1 服务端状态验证修改并重启服务后第一件事是验证端口是否真的在监听。Linux:netstat -tlnp | grep dmserver # 或使用ss命令更高效 ss -tlnp | grep :5237Windows:netstat -ano | findstr :5237查看输出中是否有LISTENING状态并且进程名是dmserver。4.2 客户端连接测试使用disql命令行测试./disql SYSDBA/SYSDBAlocalhost:5237如果连接成功会进入SQL提示符。这是最直接的测试。使用DM管理工具测试新建一个连接配置输入主机、新端口、用户名和密码点击测试连接。应用程序测试修改你的应用配置如Spring Boot的application.yml中的datasource.url重启应用观察是否能正常启动并访问数据库。4.3 常见客户端连接失败排查如果连接失败按以下顺序排查防火墙这是最常见的原因。检查服务器防火墙firewalld, iptables和云服务商的安全组规则是否放行了新端口如5237的入站流量。# CentOS 7/8 使用firewalld firewall-cmd --zonepublic --add-port5237/tcp --permanent firewall-cmd --reload监听地址检查dm.ini中LISTENER_ADDR参数。如果是0.0.0.0表示监听所有IP如果是127.0.0.1或localhost则只能本地连接。远程连接需要将其改为服务器内网IP或0.0.0.0。客户端驱动确保客户端使用的达梦JDBC驱动或ODBC驱动版本与数据库服务器版本兼容。过旧的驱动可能支持不好。连接字符串格式确认连接字符串的格式正确。达梦的格式是主机:端口冒号是英文冒号不要有多余空格。5. 高级场景与深度避坑指南掌握了基本方法后我们再看几个复杂场景和容易踩坑的地方。5.1 场景容器化部署中的端口配置在Docker中部署达梦8端口配置涉及两方面容器内端口和容器外映射。# Dockerfile 片段示例 FROM dm8_single:latest # 假设基础镜像内达梦默认配置端口是5236 # 我们可以在启动脚本中使用命令行参数覆盖 CMD [/dm8/bin/dmserver, /dm8/data/DAMENG/dm.ini, -p, 5237, -noconsole]在docker run或docker-compose.yml中进行端口映射# docker-compose.yml 片段 services: dm8: build: . ports: - 33306:5237 # 将宿主机的33306端口映射到容器内的5237端口避坑点务必保持一致性。Dockerfile里用-p指定了容器内端口为5237那么docker-compose.yml中映射的容器端口也必须是5237。客户端连接时连接的是宿主机IP和33306端口。5.2 场景与Nginx、Redis等服务的端口协同在开头的热词中提到了“Java的jar包、达梦8数据库、Nginx、Redis一起打包成一个ARM镜像”。在这种微服务或一体包场景下端口规划尤为重要。规划原则为每个服务分配固定且不冲突的端口号并形成文档。例如Nginx用80/443Redis用6379达梦用5237Java应用用8080。连接配置在Java应用的配置文件如application.properties中数据库连接URL应指向容器网络内可达的地址和端口。在Docker Compose定义的同一网络中可以使用服务名作为主机名。spring.datasource.urljdbc:dm://dm8:5237/DAMENG?useUnicodetruecharacterEncodingutf-8这里的dm8就是在docker-compose.yml中定义的达梦数据库服务名。5.3 深度避坑端口修改后的遗留问题备份与恢复工具dmrman备份恢复管理工具和dexp/dimp逻辑导出导入工具在连接数据库时也需要指定端口。修改端口后原有的备份脚本或定时任务必须更新连接参数。作业与代理达梦数据库的作业系统DBMS_JOB或代理如果配置了数据库连接也需要更新端口信息。监控系统如果使用了Zabbix、Prometheus等监控数据库其数据采集器的配置也需要更新端口。旧端口残留修改dm.ini后请检查是否还有其他配置文件如dm_svc.conf硬编码了旧端口。dm_svc.conf是客户端网络服务配置文件如果里面配置了某个服务名对应的端口会覆盖连接字符串中的端口。通常建议连接字符串直接写死主机:端口避免受此文件影响。5.4 性能与安全考量端口范围建议使用1024以上的端口。小于1024的端口是知名端口通常需要root权限才能监听。安全组与防火墙修改端口后应立即在防火墙规则中移除对旧端口5236的开放只开放新端口。这是安全加固的关键一步。连接池配置应用端的数据库连接池如HikariCP, Druid在数据库重启后所有旧连接都会失效。连接池应该有重试或自动回收机制。在重启数据库后最好也重启一下应用让连接池重新建立健康的新连接。修改达梦数据库端口是一个系统性操作牵一发而动全身。理解每种方法的原理和适用场景并在操作前后做好验证和客户端同步就能平稳地完成这个任务。在实际生产中我推荐将端口配置作为基础设施代码IaC的一部分在实例初始化dminit或容器构建阶段就确定下来并确保所有相关的部署脚本和配置文件都引用这个定义好的端口变量从而实现配置的单一来源和一致性管理。

相关新闻

AI工程化时代,专业数据标注公司的核心价值与护城河

AI工程化时代,专业数据标注公司的核心价值与护城河

如果你以为大模型时代到来,数据标注公司就该被淘汰了,那可能低估了AI落地的复杂性。最近和几位做AI产品落地的朋友聊天,他们都在抱怨同一个问题:模型效果在测试集上很漂亮,一到真实业务场景就“翻车”。问题往往不是出…

2026/10/9 13:29:08 阅读更多 →
还在一个个下载视频?这款开源Iwara下载工具帮你批量搞定

还在一个个下载视频?这款开源Iwara下载工具帮你批量搞定

还在一个个下载视频?这款开源Iwara下载工具帮你批量搞定 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 上周整理收藏夹,我数了数,攒了三十多…

2026/9/29 23:47:19 阅读更多 →
多轮对话智能体策略优化:从链式推理到树状学习与自我纠正

多轮对话智能体策略优化:从链式推理到树状学习与自我纠正

1. 项目概述:当智能体学会“自我反思”与“知识嫁接”最近在折腾多轮对话智能体(Multi-turn Agent)的策略优化,发现一个挺有意思的现象:很多智能体在复杂的长程任务中,表现得像个“固执的健忘症患者”。它们…

2026/10/9 12:29:48 阅读更多 →

最新新闻

GCC四阶段实战:从hello.c到可执行文件的完整编译链

GCC四阶段实战:从hello.c到可执行文件的完整编译链

简介:这是一份面向软件开发初学者与Linux系统使用者的GCC编译器入门指南,聚焦C/C开发环境搭建与核心编译原理。资源以PDF形式呈现,内容覆盖GCC发展沿革、多语言支持能力、跨平台特性及与G的本质区别,重点澄清四大常见误区&#xf…

2026/10/11 15:09:55 阅读更多 →
OVITO数据管道实战:分子模拟轨迹可视化与Python批处理解析

OVITO数据管道实战:分子模拟轨迹可视化与Python批处理解析

简介:OVITO是分子动力学模拟结果可视化的常用工具,这份1个PDF文件(约2.14MB)的手册与总结面向使用LAMMPS开展材料、物理、化学等模拟研究的用户,帮助快速掌握从导入Dump文件到分析原子轨迹的完整流程。内容按三部分梳理…

2026/10/11 15:09:55 阅读更多 →
220V降压24V700mA交转直芯片WT5110

220V降压24V700mA交转直芯片WT5110

220V降压24V700mA交转直芯片WT5110WT5110 是一款适用于非隔离型 AC-DC 降压转换的芯片,支持宽输入电压范围(85VAC~265VAC,部分场景可扩展至 110VAC~265VAC), 可将 220V 交流电转换为稳定的 24V 直流输出,并…

2026/10/11 15:09:55 阅读更多 →
SQL Server AlwaysOn 集群添加只读副本:从裸机到可用组的完整实战指南

SQL Server AlwaysOn 集群添加只读副本:从裸机到可用组的完整实战指南

简介:这份文档面向 SQL Server 数据库管理员与运维工程师,聚焦在已有 Always On 可用性组集群中新增一个数据库节点的完整落地流程,适合具备一定故障转移群集基础、需要横向扩展只读副本或提升高可用能力的技术人员参考。资源包内共 1 个 doc…

2026/10/11 15:09:55 阅读更多 →
SHL真题截图结构化:从PNG到JSON的6步确定性流水线

SHL真题截图结构化:从PNG到JSON的6步确定性流水线

简介:本资源为SHL在线评估测试真题截图整理文档,面向IT、金融、咨询等行业的求职者及HR招聘从业者,助力高效备考数理逻辑、数据解读与商业分析类标准化测评。文档完整呈现22道典型题目及其参考答案(含9处错题标注)&…

2026/10/11 15:09:55 阅读更多 →
2027浙大EMBA提前批面试怎么准备?底层逻辑与实战策略全解析

2027浙大EMBA提前批面试怎么准备?底层逻辑与实战策略全解析

每年到了三四月份,总会有几位在企业里做到中高层的老朋友来找我聊同样的问题:2027年想试试浙大EMBA,提前批面试到底要不要报名?我的回答从来都很干脆——只要你自己评估下来基本条件达标,就一定要申。原因并不复杂&…

2026/10/11 15:08:55 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →