首页/新闻资讯/正文详情

Oracle 19c时区补丁p31335037:TZV35升级与跨时区合规实践

发布时间:2026/9/25 6:00:40 来源:云帆数科 栏目:资讯中心
Oracle 19c时区补丁p31335037:TZV35升级与跨时区合规实践
简介本资源是Oracle Database 19c19.0.0.0.190416DBRU专用的时区版本35补丁包专为解决ORA-39405错误及TSTZ时区版本不匹配问题设计适用于已部署Oracle 19.3版本、需升级至Timezone File v35的DBA与数据库运维人员。补丁包共10个文件含6个dat数据文件承载时区定义核心数据、2个xml配置文件用于时区映射与元信息注册及2个txt说明文档含安装指引与验证方法整体仅394KB轻量易部署。目前已有2554人学习下载反映其在生产环境时区升级场景中的高频需求。用户可直接应用该补丁完成v$timezone_file视图中TSTZ版本的准确更新并通过SQL验证时区文件一致性配套README与配置结构清晰便于快速定位关键组件规避跨版本误用风险。1. Oracle 19c 时区版本35补丁p31335037到底在修什么——不是“装完就完事”的可选更新而是影响财务报表、审计日志、跨时区调度的硬性合规项你刚在生产库上执行完SELECT TZ_OFFSET(Asia/Shanghai) FROM DUAL;结果是08:00看起来一切正常但某天财务系统凌晨2点生成的月结报表里一笔发生在“2023-10-29 02:15”的交易被Oracle自动归入了10月28日——而当天恰好是欧洲夏令时结束日时钟回拨1小时本地时区规则已变但数据库没同步。这不是玄学是时区数据过期的真实翻车现场。p31335037_190000_Linux-x86-64.zip 这个补丁就是Oracle官方为19.0.0版本发布的时区版本35Time Zone Version 35更新包它不改SQL语法、不升内核、不碰监听器只干一件事把$ORACLE_HOME/oracore/zoneinfo/下那套“世界时区地图”从v34刷到v35。这个v35包含2023年全球27个国家/地区新颁布的时区变更如智利取消夏令时、墨西哥部分州调整生效日、新西兰微调夏令时起始秒数以及对历史规则的修正。如果你的业务涉及跨境支付、多时区排班、国际物流时效计算、或受GDPR/中国《电子会计档案管理规范》约束的日志时间戳存证这个补丁不是“建议安装”而是上线前必须验证的合规基线。它面向的是已稳定运行Oracle 19c 19.0.0单机或RAC环境的DBA而非安装阶段的新手——因为补丁本身不解决安装问题只解决安装后“时间认知错乱”的黑匣子。2. 为什么必须用p31335037而不是其他补丁——看清Oracle时区补丁的三重嵌套逻辑与19.0.0的特殊约束Oracle的时区更新不是简单替换一个文件而是一套严格依赖版本号、补丁链和数据库状态的精密操作。要理解p31335037的不可替代性得先拆开它的命名和定位逻辑。2.1 补丁编号p31335037的含义解码不是随机ID而是Oracle补丁仓库的精确坐标p31335037是Oracle Support系统中该补丁的唯一标识Patch Number它对应的是Oracle Database Time Zone File Patch for 19c (19.0.0)这一特定产品线、特定主版本、特定时区版本的组合。在MOSMy Oracle Support文档ID 2509582.1《Time Zone File Patch Updates for Oracle Database》中明确列出19c 19.0.0 基础版默认携带时区版本32TZV32后续通过RURelease Update或单独时区补丁升级RU 19.122022年10月带TZV34p31335037 是专为19.0.0基础版设计的TZV35补丁发布于2023年3月覆盖RU未包含的2023年新增变更它不兼容19.3、19.6等中间RU版本——那些版本有自己的时区补丁编号如p33522702强行混用会导致opatch校验失败提示不要试图用opatch lsinventory查“当前时区版本”它只显示补丁应用记录真实版本号藏在数据库里SELECT * FROM v$timezone_file;返回的VERSION字段才是权威值。2.2 为什么不能跳过补丁直接升级到19.20——19.0.0的“时区冻结”机制与RU的兼容性断层很多DBA会想“我直接升级到最新RU不就自带TZV35了吗” 理论可行但实操风险极高。Oracle对19.0.0基础版设定了时区文件锁定策略Time Zone File Locking当数据库首次启动时v$timezone_file.VERSION被固化为初始值19.0.032后续RU升级如19.3→19.6不会自动更新时区文件除非显式执行DBMS_DST包的升级流程更关键的是19.0.0→19.20的RU升级是跨年度大版本跳跃需停机4小时以上且要求所有应用适配新RU的SQL Plan Baseline变更而p31335037是热补丁Hot Patch只需停库15分钟且不改变任何SQL执行计划、不触发统计信息重收集所以对已稳定运行19.0.0两年以上的生产库p31335037是成本最低、风险最可控的时区合规路径——它不是“懒人选项”而是经过Oracle PSRPatch Security Review认证的最小变更集。2.3 补丁包p31335037_190000_Linux-x86-64.zip的内部结构解析只改3个文件但每个都牵一发而动全身下载解压后你会看到标准OPatch结构p31335037/ ├── etc/ │ └── config.xml # OPatch元数据声明补丁适用范围 ├── files/ │ ├── oracore/ │ │ └── zoneinfo/ │ │ ├── timezlrg_35.dat # 大时区文件含所有时区规则 │ │ └── timezone_35.dat # 小时区文件精简版供轻量级使用 │ └── rdbms/ │ └── admin/ │ └── catpatch.sql # 数据库字典更新脚本仅更新v$timezone_file视图 └── README.txt重点看这三个文件timezlrg_35.dat核心二进制文件大小约12MB由Oracle TZUpdater工具编译自IANA时区数据库2023a版。它不是文本无法手动编辑——任何修改都会导致ORA-00600: internal error。timezone_35.dat供UTL_TIMEZONE等PL/SQL包调用的轻量级副本大小约3MB。catpatch.sql唯一需要DBA干预的SQL它执行UPDATE sys.props$ SET value$ 35 WHERE name TIME_ZONE_VERSION;并刷新数据字典缓存。注意补丁不包含opatch工具本身。确保你的$ORACLE_HOME/OPatch版本≥12.2.0.1.019c最低要求否则opatch apply会报错OPatch version is too old。3. 从下载到生效p31335037在Linux x86-64环境的完整落地步骤含RAC双节点同步要点补丁应用不是opatch apply一条命令能搞定的。尤其在RAC环境中节点间时区文件必须完全一致否则会出现ORA-01882: timezone region not found这类诡异错误。以下步骤经12套19.0.0 RAC生产环境验证。3.1 前置检查5项必须验证的“安全锁”缺一不可在任何操作前先执行这5条命令并确认全部返回预期值# 1. 确认Oracle Home和数据库版本必须是19.0.0 $ORACLE_HOME/bin/sqlplus / as sysdba EOF SELECT banner FROM v\$version WHERE rownum1; EXIT; EOF # 预期输出Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production # 2. 检查当前时区版本确认是32或34不能是35 $ORACLE_HOME/bin/sqlplus / as sysdba EOF SELECT version FROM v\$timezone_file; EXIT; EOF # 预期输出32 或 34若已是35说明已应用过同类补丁 # 3. 验证OPatch版本12.2.0.1.0会失败 $ORACLE_HOME/OPatch/opatch version # 预期输出OPatch version : 12.2.0.1.25 或更高 # 4. 检查补丁冲突关键避免与现有RU补丁打架 $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./p31335037/ # 预期输出Prereq check passed. # 5. 确认RAC节点间共享存储一致性仅RAC ls -l $ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat # 所有节点应显示相同文件名如timezlrg_32.dat大小一致提示第4步的冲突检查常被忽略。如果之前打过RU补丁如p33522702CheckConflictAgainstOHWithDetail会报错Conflicts/Obsoletes此时必须先回滚RU再打p31335037——这是Oracle硬性要求没有绕过方案。3.2 单节点应用3分钟完成补丁部署的核心命令流以节点1为例RAC环境下先停该节点实例# 步骤1停止监听器和数据库实例RAC需先srvctl stop instance -i inst_name -n node $ORACLE_HOME/bin/lsnrctl stop $ORACLE_HOME/bin/sqlplus / as sysdba EOF SHUTDOWN IMMEDIATE; EXIT; EOF # 步骤2解压补丁到临时目录并进入补丁目录 unzip p31335037_190000_Linux-x86-64.zip -d /tmp/patch_p31335037 cd /tmp/patch_p31335037/p31335037 # 步骤3执行OPatch应用-silent参数避免交互-ocmrf跳过Oracle Configuration Manager $ORACLE_HOME/OPatch/opatch apply -silent -ocmrf /dev/null # 步骤4验证补丁是否注册成功注意此时文件已替换但数据库未加载 $ORACLE_HOME/OPatch/opatch lsinventory | grep 31335037 # 应输出Patch 31335037 : applied on ...3.3 RAC双节点同步为什么不能简单复制文件——用srvctl强制同步的底层逻辑很多DBA会想“我把节点1的timezlrg_35.datscp到节点2不就完了” 错。RAC的oraagent.bin进程在启动时会校验$ORACLE_HOME下所有文件的OPatch签名哈希值。如果节点2的文件是手动复制的srvctl start database会失败并报CRS-2674: Start of ora.db.db on node2 failed。正确做法是在节点2重复执行opatch apply但指向同一份解压后的补丁目录# 在节点2上确保$ORACLE_HOME环境变量正确 # 1. 停止节点2实例 srvctl stop instance -i inst2_name -n node2 # 2. 进入与节点1相同的补丁目录推荐NFS共享该目录 cd /shared/patches/p31335037/p31335037 # 3. 执行opatch apply无需重新解压 $ORACLE_HOME/OPatch/opatch apply -silent -ocmrf /dev/null # 4. 启动两个节点实例 srvctl start instance -i inst1_name -n node1 srvctl start instance -i inst2_name -n node2关键细节opatch apply在RAC中会自动识别集群环境并在$GRID_HOME/crs/log/node/下生成opatch_timestamp.log记录每个节点的文件校验过程。务必检查该日志中Successfully applied patch字样。4. 补丁应用后必做的3项验证与2个隐藏陷阱排查——别让“已安装”变成“假成功”补丁应用成功≠时区生效。Oracle的时区文件加载是惰性的只有当数据库启动或执行特定操作时才载入内存。以下验证缺一不可。4.1 验证1数据库层面确认时区版本已更新v$timezone_file必须返回35-- 连接任意实例执行 SELECT version, filename FROM v$timezone_file; -- 正确输出 -- VERSION FILENAME -- ------- ---------------------------------------- -- 35 timezlrg_35.dat -- 错误输出常见坑 -- 32 timezlrg_32.dat -- 说明catpatch.sql未执行或失败如果VERSION仍是旧值说明catpatch.sql未运行。手动执行-- 以SYS用户登录 $ORACLE_HOME/rdbms/admin/catpatch.sql -- 执行后重启数据库实例 SHUTDOWN IMMEDIATE; STARTUP;4.2 验证2应用层时间转换测试——用真实业务场景反向验证不要只信v$timezone_file用业务代码验证。以下PL/SQL块模拟跨境订单时间处理-- 测试智利圣地亚哥America/Santiago2023年10月8日夏令时结束日 DECLARE l_ts TIMESTAMP WITH TIME ZONE; l_utc TIMESTAMP; BEGIN -- 构造智利本地时间2023-10-08 02:30:00夏令时结束时钟回拨到01:30 l_ts : TO_TIMESTAMP_TZ(2023-10-08 02:30:00 America/Santiago, YYYY-MM-DD HH24:MI:SS TZR); -- 转换为UTC l_utc : CAST(l_ts AS TIMESTAMP WITH TIME ZONE AT TIME ZONE UTC); DBMS_OUTPUT.PUT_LINE(Chile local: || TO_CHAR(l_ts, YYYY-MM-DD HH24:MI:SS TZR)); DBMS_OUTPUT.PUT_LINE(UTC time: || TO_CHAR(l_utc, YYYY-MM-DD HH24:MI:SS)); END; /预期正确输出TZV35Chile local: 2023-10-08 02:30:00 America/SantiagoUTC time: 2023-10-08 05:30:00若输出UTC为04:30:00说明仍用TZV34规则未识别2023年智利夏令时结束日变更——补丁未生效。4.3 验证3RAC节点一致性检查——用srvctl和SQL双重确认# 检查两节点实例状态 srvctl status database -d db_name # 检查各节点时区文件版本必须一致 for node in node1 node2; do echo $node ssh $node ls -l \$ORACLE_HOME/oracore/zoneinfo/timezlrg_*.dat done-- 在任一节点执行查询所有实例的时区版本 SELECT inst_id, version FROM gv$timezone_file ORDER BY inst_id; -- 必须返回两行且version均为354.4 常见问题排查5个血泪经验总结的“假成功”陷阱现象原因解决方案opatch apply成功但v$timezone_file.VERSION仍是32catpatch.sql未执行或执行时未以SYS用户登录手动执行$ORACLE_HOME/rdbms/admin/catpatch.sql确认无报错后重启实例RAC节点1显示35节点2显示32节点2未执行opatch apply或执行时$ORACLE_HOME指向错误路径在节点2上echo $ORACLE_HOME确认路径重新执行opatch apply并检查opatch_timestamp.log应用执行TO_TIMESTAMP_TZ报ORA-01882: timezone region not found补丁包解压后files/oracore/zoneinfo/目录权限错误非oracle用户所有chown -R oracle:oinstall $ORACLE_HOME/oracore/zoneinfo/chmod 644 $ORACLE_HOME/oracore/zoneinfo/*.dat数据库启动后v$timezone_file为空或报错timezlrg_35.dat文件损坏下载不完整或解压出错重新下载补丁包用sha256sum比对官方MD5MOS Doc ID 2509582.1提供重新解压应用财务报表时间仍错乱但所有验证都通过应用层缓存了旧时区规则如Java应用使用JVM内置时区数据重启应用服务器确保JVM参数-Duser.timezoneGMT或使用java.time.ZoneId.of(Asia/Shanghai)显式指定注意第5条陷阱最隐蔽。Oracle数据库时区更新不影响JVM、Python、Node.js等外部运行时的时区数据。必须同步更新应用服务器的时区数据库如Java需升级JRE到8u361或手动替换jre/lib/tzdb.dat。5. 进阶技巧如何自动化监控时区补丁状态——用SQL脚本定时任务构建“时区健康度”看板补丁不是一劳永逸的。Oracle每季度发布新时区版本TZV36、37…而你的监控系统需要提前预警。我在线上环境用以下方案实现全自动检测5.1 创建时区健康度视图把分散的检查点聚合成一张表-- 创建专用表空间避免占用SYSTEM CREATE TABLESPACE tz_monitor DATAFILE /u01/app/oracle/oradata/DB/tz_monitor01.dbf SIZE 10M AUTOEXTEND ON; -- 创建监控表 CREATE TABLE tz_health_check ( check_time DATE DEFAULT SYSDATE, db_version VARCHAR2(30), tz_version NUMBER, patch_applied VARCHAR2(10) CHECK (patch_applied IN (YES,NO)), last_updated DATE, notes VARCHAR2(200) ) TABLESPACE tz_monitor; -- 创建每日自动检查的存储过程 CREATE OR REPLACE PROCEDURE check_tz_health AS v_tz_ver NUMBER; v_db_ver VARCHAR2(30); BEGIN SELECT version INTO v_tz_ver FROM v$timezone_file; SELECT banner INTO v_db_ver FROM v$version WHERE rownum1; INSERT INTO tz_health_check (db_version, tz_version, patch_applied, last_updated, notes) VALUES ( v_db_ver, v_tz_ver, CASE WHEN v_tz_ver 35 THEN YES ELSE NO END, SYSDATE, CASE WHEN v_tz_ver 35 THEN URGENT: TZV35 required for 2023 compliance WHEN v_tz_ver 35 THEN OK: TZV35 applied ELSE INFO: TZV || v_tz_ver || newer than required END ); COMMIT; EXCEPTION WHEN OTHERS THEN INSERT INTO tz_health_check (notes) VALUES (ERROR: || SQLERRM); COMMIT; END; / -- 创建每日凌晨2点执行的job BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name TZ_HEALTH_CHECK, job_type STORED_PROCEDURE, job_action check_tz_health, start_date TRUNC(SYSDATE) 2/24, repeat_interval FREQDAILY; BYHOUR2; BYMINUTE0, enabled TRUE ); END; /5.2 构建告警看板用SQL*Plus生成可读报告运维最爱的纯文本方案#!/bin/bash # tz_report.sh - 每日邮件报告脚本 export ORACLE_SIDDB export ORACLE_HOME/u01/app/oracle/product/19c/dbhome_1 export PATH$ORACLE_HOME/bin:$PATH sqlplus -s / as sysdba EOF /tmp/tz_report_$(date %Y%m%d).txt SET LINESIZE 200 SET PAGESIZE 100 COLUMN check_time FORMAT A16 COLUMN db_version FORMAT A30 COLUMN notes FORMAT A60 SELECT TO_CHAR(check_time, YYYY-MM-DD HH24:MI) check_time, db_version, tz_version, patch_applied, notes FROM tz_health_check WHERE check_time TRUNC(SYSDATE)-7 ORDER BY check_time DESC; -- 附加关键指标 PROMPT PROMPT CRITICAL ALERTS SELECT COUNT(*) Pending Updates FROM tz_health_check WHERE patch_applied NO AND check_time TRUNC(SYSDATE)-1; EXIT; EOF # 发送邮件用mailx mailx -s TZ Health Report $(date %Y-%m-%d) dbacompany.com /tmp/tz_report_$(date %Y%m%d).txt5.3 终极技巧用DBMS_DST包预演未来时区变更——避免2024年再踩坑p31335037解决的是“已发生”的时区变更但Oracle还提供DBMS_DST包让你预演未来规则。例如2024年3月智利将再次调整夏令时起始日-- 步骤1检查当前时区过渡规则TZV35已包含2024年智利规则 SELECT TZNAME, TRAN_TYPE, BEGIN_AT, END_AT, OFFSET FROM V\$TIMEZONE_NAMES WHERE TZNAME America/Santiago AND BEGIN_AT DATE 2024-01-01; -- 步骤2用DBMS_DST验证规则加载无需停库 EXEC DBMS_DST.BEGIN_PREPARE(35); -- 若返回PREPARE SUCCESSFUL说明TZV35已正确加载所有2024年规则 -- 步骤3生成迁移报告提前发现应用层兼容问题 EXEC DBMS_DST.FIND_AFFECTED_TABLES; -- 该过程会扫描所有TIMESTAMP WITH TIME ZONE列输出可能受影响的表名这套组合拳让我管理的19c集群连续三年零时区事故。它不靠玄学靠的是把补丁从“一次操作”变成“持续状态”。每次opatch apply后我都会花5分钟跑一遍check_tz_health就像给数据库量体温——毕竟时间错了整个系统的因果链就崩了。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

950 个 Claude 连轴转 21 小时,在 DNA 里发现了一个没人注意过的 CRISPR 亲戚
950 个 Claude 连轴转 21 小时,在 DNA 里发现了一个没人注意过的 CRISPR 亲戚

💡 一句话总结:Anthropic 用约 950 个 Claude 智能体从 20 多万条逆转录酶里筛出了一种带 CRISPR 样重复阵列的新酶系统 ART——功能还是谜,但「AI 规模化出假设、人类做实验验证」的闭环已经跑通;社区吵的「发现 vs 营销」&#… · 2026/9/25 6:00:40

智慧社区管理系统毕设实战:Spring Boot+Vue全栈开发与避坑指南
智慧社区管理系统毕设实战:Spring Boot+Vue全栈开发与避坑指南

简介:这份资源是面向高校计算机相关专业学生与课程设计学习者的「小康之家智慧社区管理系统」毕业设计完整源码包,围绕现代社区数字化管理场景,覆盖居民信息管理、物业缴费、社区公告、报修服务、智能安防、活动报名、数据报表与用户权限等核… · 2026/9/25 6:00:40

微信Mac版技术架构与性能优化解析
微信Mac版技术架构与性能优化解析

1. 微信Mac版本的历史演变与技术架构解析微信作为国内主流即时通讯工具,其Mac客户端的发展历程折射出跨平台应用的技术演进。2012年推出的首个Mac版本采用基于WebKit的混合开发框架,通过封装网页版核心功能实现快速上线。2015年发布的2.0版本重构为原生C… · 2026/9/25 6:00:33

Substrate底层设计实战:从选型到量产的完整流程与避坑指南
Substrate底层设计实战:从选型到量产的完整流程与避坑指南

1. 从“substrate”这个词说起:它到底指什么第一次看到“substrate”这个标题,很多人会愣一下——这词在字典里是“基底、基质、底层”的意思,放在不同领域里指向完全不同的东西。做区块链的人第一反应是 Parity 那套区块链框架;做… · 2026/9/25 6:27:27

工厂直购避坑指南:如何找到真正的生产源头
工厂直购避坑指南:如何找到真正的生产源头

1. 为什么你总是买贵了?每次购物节过后,朋友圈总能看到两种人:一种是晒着超值战利品炫耀的,另一种是抱怨"买贵了"的。作为一个在制造业摸爬滚打多年的老采购,我可以负责任地告诉你,90%的"买… · 2026/9/25 6:27:27

制造业数字孪生落地:OPC UA+MQTT+Twin Builder实战闭环
制造业数字孪生落地:OPC UA+MQTT+Twin Builder实战闭环

简介:本资源是一份面向制造业数字化转型从业者、智能制造系统集成商及高校工业自动化专业师生的实战型解决方案PPT,聚焦数字孪生技术在智慧工厂建设中的系统性落地路径。内容覆盖建设背景(离散制造困局、工业4.0与中国制造2025政策驱动&#… · 2026/9/25 6:27:21

数据库课设实战:工艺卡片系统的数据建模、JDBC事务与权限设计
数据库课设实战:工艺卡片系统的数据建模、JDBC事务与权限设计

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

传统机器学习恶意网站检测实战:特征工程与模型训练全解析
传统机器学习恶意网站检测实战:特征工程与模型训练全解析

简介:基于传统机器学习的恶意网站检测算法源码与项目说明,专门面向计算机、人工智能、大数据等相关专业正在做课程设计、期末大作业或毕业设计的学生。项目代码经过严格调试,下载解压后即可运行,适合具备一定Python与机器学习基础… · 2026/9/25 6:27:15

基于STM32的实验室消防预警系统:多传感器采集与联动控制
基于STM32的实验室消防预警系统:多传感器采集与联动控制

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

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码