尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

生产库改表结构不再停机:ODC 无锁结构变更原理与实战深度解析

生产库改表结构不再停机:ODC 无锁结构变更原理与实战深度解析 生产库改表结构不再停机ODC 无锁结构变更原理与实战深度解析【免费下载链接】odcOceanBase Developer Center(ODC), An open-source, enterprise-grade database tool for collaborative development项目地址: https://gitcode.com/gh_mirrors/od/odcODCOceanBase Developer Center是一款开源的企业级数据库协同开发工具其「在线结构变更Online Schema Change简称 OSC」功能可以让大表加列、改字段、建索引等操作在业务不停机的情况下平滑完成是 DBA 和后端开发绕不开的数据库变更利器。本文将带你从原理到实战完整理解 ODC 是如何实现「生产库改表结构不再停机」的。为什么直接执行 ALTER TABLE 会锁死生产库传统数据库中ALTER TABLE等 DDL 语句在改表期间往往需要持有较长的表级锁MDL 锁一旦遇到大表或长事务轻则接口变慢重则整库阻塞、业务雪崩。这也是很多团队把改表结构安排在凌晨低峰、甚至提前公告停机的根本原因。ODC 的无锁结构变更借鉴并实现了Ghost Table影子表思路核心思想不直接在原表上动刀而是新建一张新结构的目标表把数据平滑搬运过去最后用一次毫秒级的改名切换完成变更。业务全程可读写原表感知不到任何停机。一张图看懂 ODC 在线结构变更的 7 个阶段ODC 的 OSC 由一套状态机FMS驱动每个阶段对应一个可恢复的 Action。状态定义可见 OscStates.java完整流程如下阶段状态做什么1️⃣YIELD_CONTEXT初始化上下文解析 DDL、生成影子表名2️⃣CREATE_GHOST_TABLES按新结构创建影子表如user_info_osc_new_3️⃣CREATE_DATA_TASK创建全量数据搬迁任务4️⃣MONITOR_DATA_TASK监控全量增量同步进度直至追平5️⃣MODIFY_DATA_TASK必要时调整同步策略如限速配置变更6️⃣SWAP_TABLE秒级改名切换新表顶替原表7️⃣CLEAN_RESOURCE清理旧表user_info_osc_old_与临时资源对应源码分布在 oscfms/action/ 目录每个阶段都是独立的Action实现例如影子表创建见 CreateGhostTableAction.java、切表逻辑见 SwapTableAction.java。关键优势状态机支持断点续跑。任务中途失败或 ODC 重启后可以从上一个成功状态恢复而不是从头再来。影子表命名规则ODC 为影子表约定了清晰的前后缀见 DdlConstants.javaMySQL 模式新表后缀_osc_new_切换后旧表后缀_osc_old_Oracle 模式大写后缀_OSC_NEW_/_OSC_OLD_看到数据库里带osc的表就知道它们是 ODC 无锁变更的临时工任务完成后会被自动清理。数据如何不丢不重地搬过去这是无锁变更最核心的难题ODC 的解法是全量搬迁 增量追平全量阶段把原表存量数据拷贝到影子表增量阶段拷贝期间业务仍在写原表ODC 通过 OceanBase 的数据同步能力持续捕获增量变更INSERT / UPDATE / DELETE并同步到影子表追平判定当增量延迟追平、数据一致性校验通过后才允许进入切换阶段。切换阶段 ODC 还支持两种模式见 SwapTableType.javaAUTO自动追平后自动执行改名切换全程无人值守MANUAL手动追平后暂停由 DBA 在确认业务低峰后手动点切换适合核心交易表。限速控制为避免搬迁任务打满数据库 IOODC 提供了内置限速器可在任务运行中动态调整同步速率配置模型见 RateLimiterConfig.java。实战在 ODC 中发起一次无锁改表以下是在 ODC 中执行无锁结构变更的完整操作路径登录 ODC在「SQL 窗口」或「变更工单」中编写 DDL例如ALTER TABLE order_detail ADD COLUMN remark VARCHAR(256);选择执行方式不选直接执行而是提交为在线结构变更任务。ODC 支持两类 DDL见 OnlineSchemaChangeSqlType.javaALTER改表加列、改类型、删列等CREATE大表建表时同步搬运存量数据设置保护参数见 OnlineSchemaChangeParameters.java锁表超时时间切换阶段允许持锁的最长时间切换重试次数切表失败后的自动重试上限需禁用的用户会话切换瞬间强制断开哪些应用的连接限速配置控制数据搬迁的 QPS / 带宽旧表清理策略任务结束后立即删除还是保留旧表一段时间提交并跟踪进度任务进入审批流如已启用变更审批执行后可在任务中心实时查看当前所处状态机阶段、同步进度与延迟曲线。切换瞬间发生了什么SWAP_TABLE阶段是唯一的短暂临界点ODC 通过 rename/ 目录下的RenameTableInvoker协调完成按需短暂锁表、禁用指定会话连接LockUserInterceptor.java自动处理外键依赖先解绑再恢复ForeignKeyInterceptor.java原子执行RENAME TABLE原表 →*_osc_old_影子表 → 原表名失败时自动回滚改名保证表名不混乱。整个过程通常只需毫秒到秒级业务侧仅表现为一次极短的抖动。上线前必看的预检查清单 ✅ODC 在任务真正开始前会做严格的预检查见 OnlineSchemaChangeValidator.java 与 WebOscConnectionConfigValidator.java常见拦截项包括❌ 表没有主键增量同步无法定位变更行无锁变更不适用此类变更建议改用原生 DDL 或先补主键❌ 表含全文索引、外键等特殊对象超出支持范围❌ 执行账号权限不足建表、RENAME 等权限❌ 数据库空间不足影子表 旧表会额外占用一份存储请预留原表大小的 2 倍空间 记住这条经验无锁变更用时间和空间换可用性——它会多占一份存储、多花一些同步时间但换来的是生产库零停机。哪些场景适合用 ODC 无锁变更场景建议千万级以上大表加列 / 改字段✅ 首选无锁变更生产核心表建二级索引✅ 无锁变更CREATE 模式小表几万行普通 DDL⚡ 直接执行更快无需走 OSC无主键表⚠️ 先补主键或评估原生 DDL变更窗口极短的发布上线✅ 提前发起 OSC发布时点切换MANUAL 模式总结ODC 的无锁结构变更用一套精巧的状态机把改表拆成了建影子表 → 全量搬迁 → 增量追平 → 秒级切表 → 清理资源五个可观测、可恢复的步骤让生产库改表结构不再停机从口号变成了日常操作。如果你正在为凌晨改表提心吊胆不妨在 ODC 中开启这一能力把最危险的 DDL 变成一次安静的后台任务。想深入了解实现细节可以阅读以下模块源码状态机核心server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/oscfms/切表与外键处理server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/rename/参数与限速模型server/odc-service/src/main/java/com/oceanbase/odc/service/onlineschemachange/model/集成测试用例server/integration-test/src/test/java/com/oceanbase/odc/service/onlineschemachange/【免费下载链接】odcOceanBase Developer Center(ODC), An open-source, enterprise-grade database tool for collaborative development项目地址: https://gitcode.com/gh_mirrors/od/odc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表