dbswitch实战:数据库全量迁移与增量同步的避坑指南
简介dbswitch是一款面向数据迁移与同步场景的开源工具适用于需要将源端数据库批量迁移至目的端的开发、运维及数据管理人员重点解决异构库表结构转换、全量与增量数据同步等问题。资源包内含完整工程源码与构建脚本共506个文件以Java核心代码为主辅以前端Vue/JavaScript页面、SQL脚本、XML配置及Shell/Docker部署文件整体体积约99.09MB目录结构清晰便于按模块查阅。工具支持基于正则的表名/字段名映射、主键表增量变更同步CDC以及insert/copy两种写入方式读者可借助源码深入理解迁移同步的实现细节也可基于构建配置快速部署试用用于自身项目的改造与扩展。目前该资源已有793人学习适合具备一定数据库基础、希望掌握数据迁移工具原理并落地实践的工程师。1. 从一次凌晨切换事故说起dbswitch 在批量迁移里到底解决什么做数据库迁移的人多半经历过这种夜源端 MySQL 二十几张业务表目标端换成了国产库字段类型对不上业务方要求第二天 9 点前必须看到全量数据。手工写脚本的同事熬到凌晨三点最后发现视图没迁、自增主键撞了、增量窗口里漏了二十分钟数据。dbswitch 这类工具之所以在国产化迁移和数据库同步场景里被反复提起就是因为它把「源端数据库向目的端数据库批量迁移同步」这件事拆成了结构转换、全量抽取、增量回放三条明确的流水线而不是让你在黑匣子里一次次试错。它适合正在做数据库替换、双库并行、以及需要在短切换窗口内完成数据追平的 DBA 和数据平台工程师。本文会按全量与增量的选型逻辑、最小可用配置、增量落地姿势、踩坑记录这个顺序把这套方案讲透。2. 先分清全量和增量dbswitch 的两种同步模式与选型逻辑2.1 全量迁移的本质结构转换先行数据抽取殿后dbswitch 处理全量迁移时并不是简单地把源端数据倒出来再灌进目标端。它先做的一件关键事是结构转换读取源端库表的元数据把字段类型、约束、索引、自增属性翻译成目标端能识别的 DDL。这一步是它和数据导出导入工具拉开差距的地方。以最常见的 MySQL 迁往达梦、人大金仓这类国产库为例varchar(255)可能要被映射成VARCHAR2(255 CHAR)datetime(6)要确认目标端是否支持微秒精度unsigned int可能要改成INT并单独处理取值范围。盲目按源端 DDL 原样执行大概率会在目标端报类型不合法或精度截断。数据抽取阶段常见做法是按表分批拉取。每一批数据插入目标端时控制在一个合理的事务大小内避免大事务把目标端的 redo 日志撑爆。我一般会把单批行数设在 2000 到 10000 之间具体看字段宽度和目标端磁盘 IO。这里值得留意的是全量迁移的成功标准不是「跑完了」而是「结构逐项一致、行数一致、关键字段抽样一致」所以后面专门有一节讲校验。2.2 增量同步的机制日志解析与位点续传增量同步解决的是全量迁完后源端继续产生的业务变更怎么持续流到目标端。它的核心不再是「拉数据」而是识别变更。业界两条技术路线基于update_time之类的增量字段轮询以及基于数据库日志的 CDC 解析。dbswitch 的增量能力在常见做法里依赖源端日志解析比如 MySQL 的 binlog把源端事务变更解析成目标端可执行的写入操作。为什么强调基于日志而不是轮询时间戳因为业务表如果存在删除操作或者某些更新语句没有刷新update_time轮询方案会漏数据。基于日志则能拿到完整的事务语义包括行级变更前镜像和后镜像。代价也很明确源端必须开启对应日志格式要选对且日志保留时长要覆盖增量任务可能中断的窗口长度。同步机制上增量任务需要记住自己消费到哪个位点这样进程重启后才能从断点继续而不是从头重放或跳过一段。位点存储是增量配置里最不能省的一环后面说参数时会展开。2.3 全量和增量为什么几乎总是混用切换窗口的接力逻辑真实的割接流程里很少有一轮全量直接宣布上线。常见做法是三步走第一天先跑全量让目标库有一份基线数据业务继续跑源端不断产生新变更到了切换夜跑一轮增量把基线之后的数据追平等同步延迟降到零附近再停业务、做最后一小段增量、校验、切流量。这个「全量铺底、增量追平」的组合决定了切换窗口是 5 分钟还是 5 小时。如果你只用全量切换夜要停业务等待所有数据搬完如果你只用增量没有基线数据增量回放也无从谈起。dbswitch 的价值在于把这两种模式放在同一个配置模型里全量任务跑完后再启动增量任务两边衔接时不需要导出导入中间文件。衔接是否顺滑重点看增量任务能否从全量结束的位点开始——很多工具在这一步上是断裂的零点几秒的间隙都会造成数据空洞而 dbswitch 这类工具在配置正确时可以做到位点连续。2.4 选型边界dbswitch 与 DataX、Flink CDC 的取舍很多团队会问我有 DataX也有 Flink CDC为什么还要看 dbswitch我的判断是三者的适用场景并不重合。DataX 强在异构数据源之间稳定的大批量抽取但它的结构同步能力很弱表结构转换基本靠人工写 DDL而且 DataX 本身不支持增量位点管理。Flink CDC 强在实时性和分布式吞吐但链路重需要维护 Flink 集群、状态后端和 checkpoint对一个小团队来说过重。dbswitch 站在两者中间轻量、配置化、能处理结构转换和增量同步适合百 GB 级别、库到库的批量迁移同步尤其是国产化迁移这类异构数据库替换场景。如果你的数据量到了 TB 级且对实时性要求到秒级Flink CDC 是合理选择如果你只是想把数据抽到文件或数仓DataX 更顺手。做选型时我习惯列一张表结构转换、增量机制、断点续传、运维成本、集群依赖双方一栏栏比对基本不会有争议。3. 用 dbswitch 跑通第一轮全量迁移从最小配置到校验3.1 环境准备拿到发布包后先确认什么开箱一个 Java 系的迁移同步工具第一件事不是急着启动而是检查环境和配置结构。常见做法是发布包里有启动脚本和配置文件配置里包含源端连接、目标端连接、迁移模式三块。跑全量迁移前我一般会确认三件事目标端驱动是否已放入 lib 目录源端连接账号是否有读取元数据和数据的权限目标端账号是否有建表、插入、索引权限。权限缺失是迁移任务在中途翻车的最常见原因而且报错往往很晚——可能跑了半小时才在某一张表上失败。另外源端和目标端的网络连通性千万不要只测 ICMP要用数据库客户端各连一次。JDBC 连接串里的主机名、端口、服务名写错会导致启动即失败而这种失败经常被误判为工具问题实际上只是连接串里一个字符的事。环境准备好的标准是用命令行能分别连上两端数据库执行select 1成功。3.2 最小配置以 YAML 形式描述源端与目标端dbswitch 的配置在常见发布包里是 YAML 结构核心是 source、target、migration 三段。第一轮建议只迁少数几张表把配置风险压到最低。source: type: mysql host: 192.168.10.15 port: 3306 username: migrate_user password: ChangeMe2024 database: shop target: type: dm host: 192.168.10.16 port: 5236 username: SYSDBA password: ChangeMe2024 database: SHOP migration: mode: full include_tables: - user - order - item batch_size: 5000 truncate_target: true这段配置的逻辑是先指定源端库类型、地址和账号再指定目标端库类型和账号最后声明迁移模式为full并把范围限制在 user、order、item 三张表。truncate_target: true表示每次重跑前先清空目标端表保证任务幂等——全量迁移反复试跑时不清空会导致行数翻倍。参数说明里batch_size决定每批插入目标端的行数值太大容易造成目标端锁竞争和日志膨胀值太小则吞吐上不去5000 是一个稳妥起点include_tables是白名单防止把日志表、临时表也迁过去mode: full切到incremental就是增量模式全量增量共用这套配置骨架。3.3 启动迁移任务并读日志配置写好后一般通过启动脚本加载配置文件运行。Java 系工具最常见的是sh bin/dbswitch.sh --config这种风格日志会打到控制台和文件。# 启动全量迁移任务建议后台运行并把日志落盘 nohup sh bin/dbswitch.sh --config config/application.yml \ logs/full_migration_$(date %Y%m%d_%H%M%S).log 21 # 实时观察迁移进度 tail -f logs/full_migration_*.log启动后重点关注日志里的表级状态结构转换是否成功、抽取多少行、插入多少行、每张表耗时多久。我习惯在日志里 grep 关键字ERROR和RETRY如果某张表反复重试基本可以断定目标端类型映射或约束有问题不要干等直接打断去看那张表的明细错误。全量迁移遇到单表失败时常见做法是先把这张表从include_tables里摘掉让整体任务先完成再单独排查问题表。命令里nohup和21的作用是让任务脱离终端会话避免你关掉 SSH 窗口时任务被杀掉日志文件名带时间戳方便和任务执行时刻对应排查。3.4 结果校验行数、主键、抽样三个层面迁移跑完那一刻永远先假设它有问题。第一层校验是行数对每张表分别执行源端和目标端的count(*)并比对第二层校验是主键最大值和最小值这能暴露行数相同但内容错位的情况第三层是抽样逐字段比对随机抽 3 到 5 条数据比对关键业务字段值尤其是字符串、日期、金额这三类最容易出问题的类型。-- 源端执行 SELECT COUNT(*), MAX(id), MIN(id) FROM shop.order; -- 目的端执行 SELECT COUNT(*), MAX(id), MIN(id) FROM SHAP.ORDER_T;这两条 SQL 结果的差异能直接定位问题方向行数不一致说明有漏迁或重复迁移行数一致但 max(id) 不同说明主键序列出了问题两者都一致不等于逐行一致所以要保留抽样比对这一步。校验脚本不要临时写建议沉淀成一份固定 SQL 集每次迁移都跑同一套这样前后对比才有意义。4. 增量同步的落地姿势日志开启、位点管理与追平4.1 增量同步的硬前提源端必须开日志且保留够久增量同步最常被人忽略的前提是源端数据库配置。MySQL 要开 binlog并且格式建议设为ROW因为STATEMENT格式对函数和存储过程的同步可能产生不一致。同时要设置binlog_expire_logs_seconds或对应的过期参数保留时长至少要覆盖增量任务可能中断的最长时间。一个血泪经验源端只开了 binlog 但保留半天周末增量任务挂了没被发现周一来看日志早就清了位点断裂只能重新全量。在国产化迁移场景里还有一个高频问题目标端是达梦或其他库增量同步要借助源端日志解析但源端如果是 Oracle 或 PostgreSQL日志机制完全不同。Oracle 需要开启归档和补充日志PostgreSQL 需要设置wal_levellogical。动手前先确认源端数据库的日志能力再决定增量方案是否可行这比调任何参数都重要。4.2 增量任务的关键参数与位点存储增量模式的配置继承全量的 source 和 target 段但 migration 段要换成增量参数。常见配置长这样migration: mode: incremental incremental: server_id: 1002 start_position: checkpoint: storage: database table_name: dbswitch_checkpoint flush_interval_sec: 5逻辑说明server_id在 binlog 订阅场景里相当于给源端注册一个从库身份同一套源库里不能有两个任务用相同的 server_id否则源端会互相踢掉会话start_position留空表示从当前最新位点开始如果要做增量追平填上次记录的位置即可checkpoint段决定消费位点存在哪里强烈建议存到数据库表而不是本地文件因为本地文件在任务被调度系统迁移或容器重建时极易丢失。flush_interval_sec是位点刷新的间隔5 秒代表最多在异常退出时重复消费 5 秒内的数据。这里需要理解一个取舍拉长刷新间隔能降低数据库写入频率但断电时可能重复消费更多数据缩短到 1 秒则接近实时但要承担更高的位点表写入开销。增量同步本质上是至少一次语义所以目标端写入能力要支持幂等或者接受少量重复后靠主键或去重逻辑兜底。4.3 观察同步延迟并确认切换窗口增量任务跑起来后最需要盯的指标是同步延迟源端当前日志位点与目标端已应用位点的差值。常见查看方式是看任务日志里周期性输出的位点信息或者直接查 checkpoint 表里记录的位点与源端最新位点的差距。当延迟逐步收敛到 5 秒以内就可以考虑进入切换窗口了。切换窗口内的操作顺序我一般固定为停掉源端写入口或只读等待增量任务把最后一批变更消费完确认延迟归零再核对一遍行数和抽样数据最后把流量切到目标端。这里有个细节不要看到延迟归零立刻切先等一到两个flush_interval周期确保位点刷新落盘否则任务一停重启后可能从更早位置重放切过去才发现重复数据。增量阶段另一个常见瓶颈是目标端写入性能。源端业务高峰期的 TPS 如果高于目标端最大写入能力延迟只会上涨不会收敛。遇到这种情况优先检查目标端是否有锁等待、索引维护开销和归档日志空间再考虑调大批量提交的线程数。增量任务的性能指标不是「跑得快」而是「追得平」。4.4 增量与全量的衔接一个容易忽略的边界很多第一次用的人会把全量任务和增量任务分开跑这没问题但要注意一个边界全量任务运行期间源端产生的变更是否被增量任务覆盖。常见做法是让增量任务在全量任务启动前就记录一个起始位点全量跑完后增量从该位点开始追。如果全量跑完才启动增量并且从最新位点开始中间几个小时的变更就丢了业务方在切换后才可能发现数据是空的或缺失的。我习惯在跑全量之前先记录源端当前位点并把这个位点保存成文件或写进数据库。全量结束后把增量任务的start_position指到这个保存的位点让增量任务补追全量期间的数据。这样即使全量跑了十几个小时切换夜的最终数据也是完整的。两条任务一前一后接力而不是并行空跑。5. 避坑指南dbswitch 迁移同步最容易踩的 5 个现场5.1 连接与配置类的坑连接串、权限与字符集现象一任务启动后立刻报Communications link failure或Connection refused但用命令行能连上库。原因是 JDBC 连接串和命令行客户端用的端口、服务名不一致。很多国产数据库的默认端口和 MySQL 不同例如达梦默认是 5236PostgreSQL 是 5432连接串里写错端口是最低级的翻车。解决不要复制粘贴逐字符核对端口、数据库名、用户名三项先在一个简单的测试类或用数据库自带客户端验证该连接串可用再填入配置。现象二全量迁移跑完中文全部变成问号或乱码。原因是目标端表字符集或连接字符集不匹配。源端是utf8mb4目标端默认字符集如果是GBK或没显式指定字符串在转换时被截断。解决在连接串里显式指定两端字符集例如 MySQL 加?useUnicodetruecharacterEncodingutf8迁移后立刻抽查含中文的字段不要等全部跑完。5.2 数据与性能类的坑大表、主键与精度现象三单表几亿行调大batch_size到 20000 反而越来越慢目标端日志疯狂告警。原因是单批数据量过大导致目标端每批次写入时间长行锁和表锁竞争加剧大事务也拖慢了 check point 和日志切换。解决把batch_size回调到 3000 到 5000观察目标端写入耗时必要时对大表开启并行分片迁移但要注意分片键不能选分布不均的字段。现象四增量同步追平后业务写入报主键冲突。原因是结构迁移时自增序列没有被同步目标端自增起始值落后于源端。比如源端 user 表 id 已经到 100 万目标端序列从 1 开始增量回放插入 100 万的新行再切流量后业务插入新记录撞上已存在的主键。解决全量迁移完成后立即重置目标端对应序列到源端当前自增值加一个安全余量在切换验证清单里加上一条「检查目标端自增值大于源端当前最大值」。现象五datetime(6)的高精度字段迁移后丢失了微秒后缀。原因是目标端字段类型不支持微秒精度或结构转换时映射到了精度较低的日期类型。这类问题最容易伪装成「没报错」直到业务做时间范围查询时对不上账。解决结构转换前对照两端数据库的类型映射规则凡是时间精度字段、大精度数字字段逐表确认转换后的类型用小表试迁一次并跑那条最精确的时间查询验证通过再放大到全量。6. 进阶把迁移任务做成可重跑、可校验、可交接的最后一公里迁移工具上了线真正拉开团队差距的是收尾这一步。我会把整套方案固化到三个层面。第一是幂等重跑能力全量任务固定带truncate_target: true增量任务靠数据库表里的 checkpoint 位点任务被调度系统杀了或机器重启了重启服务后能直接从上次消费位点继续。第二是校验自动化把行数比对、主键极值比对、抽样字段比对写成一个脚本每次迁移跑完自动执行并输出差异清单而不是靠人肉眼对两个查询结果。第三是监控接入全量任务监控表级失败数量增量任务监控同步延迟峰值超过阈值就告警避免数据断流一晚上没人知道。我最想分享的一个教训是第一次带团队做割接时我以为校验脚本就是跑一遍 count结果上线第二天业务方说历史订单的金额字段对不上。查下来是那批订单在源端有字符集特殊符号目标端转换时静默截断。从那以后不管工具多信任校验脚本里必须包含对关键业务字段的逐行哈希比对哪怕只比对近一周的数据。做迁移同步真正让你敢按下切换按钮的不是工具的宣传文档而是那套你自己反复跑过的校验。技术方案的最后一公里永远是笨功夫但笨功夫最可靠。希望这篇能帮你少熬几个凌晨一次切换就平平稳稳落地。本文还有配套的精品资源点击获取

相关新闻

智能体风险治理框架3.0:九大风险检查与整改落地指南

智能体风险治理框架3.0:九大风险检查与整改落地指南

1. 框架3.0落地:智能体从"试点炫技"进入"整改内审"阶段做企业级AI落地的同行应该都有同感:智能体这个词喊了两三年,真正敢让它们在业务链路里独立干活的大规模落地,其实是从近两年才多起来的。模型能力是一道…

2026/10/13 17:53:24 阅读更多 →
基于Python+Django的智慧农业管理系统设计与实现解析

基于Python+Django的智慧农业管理系统设计与实现解析

如果你最近正在折腾Django项目,或者正准备做一套智慧农业方向的管理平台,接下来的内容应该能帮你省不少事。“基于PythonDjango的智慧农业管理系统”这类项目,本质上就是一套标准的数据采集、状态监控、设备控制加可视化展示的综合系统。它能…

2026/10/14 19:57:11 阅读更多 →
WSL2 GPU直通实战:在Windows上获得原生级AI开发体验

WSL2 GPU直通实战:在Windows上获得原生级AI开发体验

1. 为什么非得用 WSL2 而不是虚拟机或双系统?我第一次在某高校实验室带学生做图像生成项目时,遇到一个典型困境:导师要求用 Linux 环境跑 PyTorch CUDA,但学生主力笔记本全是 Windows 系统,装双系统怕搞崩引导&#x…

2026/10/14 19:04:50 阅读更多 →

最新新闻

工艺尺寸链解题全攻略:封闭环、极值法与三类必考题型

工艺尺寸链解题全攻略:封闭环、极值法与三类必考题型

工艺尺寸链这几个字,在《机械制造工艺学》这门课里不算难,但绝对算得上“烦”。考研真题和期末作业里,它几乎年年出现,而且形式很固定:给你一张零件图、几道工序、几个已知尺寸,让你解某个工序尺寸和公差范…

2026/10/14 20:54:23 阅读更多 →
又快又稳不封号:剖析 web-search-mcp 的并发提取、速率限制与 HTTP/2 容错恢复机制

又快又稳不封号:剖析 web-search-mcp 的并发提取、速率限制与 HTTP/2 容错恢复机制

人工智能MCP 服务 【免费下载链接】web-search-mcp A simple, locally hosted Web Search MCP server for use with Local LLMs 项目地址: https://gitcode.com/gh_mirrors/we/web-search-mcp 点击查看 免费下载 web-search-mcp 是一个本地部署的网络搜索 MCP 服务…

2026/10/14 20:54:23 阅读更多 →
C++模板元编程实现编译期循环展开:原理、写法与性能优化实战

C++模板元编程实现编译期循环展开:原理、写法与性能优化实战

1. 项目概述:当循环次数被“焊死”在源码里做高性能计算和底层的兄弟,一定遇到过这种场景:算法里有一段固定次数的热点循环,比如 8 阶滤波器、64 点相关运算、16 维点积。你心里清楚这段代码的每一次迭代都在烧 CPU 周期&#xff…

2026/10/14 20:54:23 阅读更多 →
26. AI-Agent-交付

26. AI-Agent-交付

文章目录 前言 一、先说一个最简单的结论 二、Agent 可以独立存在吗? 三、第一种交付方式:直接交付一个“Agent 应用” 四、第二种交付方式:嵌入客户原来的系统 六、第四种交付方式:Agent API 七、第五种交付方式:部署一套 Agent 八、还有一种更容易被忽略的交付:一个“数…

2026/10/14 20:54:23 阅读更多 →
TEKLA图纸二次开发实战:对象模型、源码入口与避坑指南

TEKLA图纸二次开发实战:对象模型、源码入口与避坑指南

简介:TEKLA二次开发图纸入门源代码,面向钢结构详图设计领域希望扩展TEKLA功能的工程师与开发者。资料聚焦图纸管理与数据提取,围绕载入模型图纸列表、选择模型图纸、打开模型图纸、取图纸数值四个核心功能,提供基于C#的完整源代码…

2026/10/14 20:54:23 阅读更多 →
iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

拿到一块iMX8M板卡,A53那边跑着Linux做业务逻辑,M4这边想跑FreeRTOS管实时控制,第一个绕不开的问题就是:这两个核之间到底怎么通信。我在实际项目里试过几种土办法——共享变量太脆弱,串口又太慢,敲了半天代…

2026/10/14 20:53:22 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →