Schema 与数据对比
DBX 提供两类对比工作流:
- Schema 对比比较对象结构和 DDL,生成从源环境部署到目标环境的脚本
- 数据对比按关键字段比较一张或多张表的行,生成可选择的插入、更新和删除同步 SQL
两者都遵循“源端作为期望状态,目标端作为待检查/同步状态”的方向。选择反了会生成相反的操作。
Schema 对比流程
选择或创建配置
选择最近配置,或新建、重命名、复制一个对比配置。配置可以导入/导出 JSON,便于复用源/目标和比较选项。
选择源与目标
分别选择连接、数据库和 Schema。可以交换源/目标,但交换后必须重新检查部署方向。
配置比较范围
选择表、主键、外键、唯一键、Check、视图、函数、索引、序列、触发器、Rule、Owner 等对象。实际选项按数据库类型显示。
比较并筛选对象
DBX 读取两端元数据和 DDL,构建对象树,标记新增、删除、修改和依赖关系。选择真正需要部署的对象。
审查 DDL 与影响
查看源/目标 DDL、字段映射、部署脚本、依赖、潜在冲突和影响报告。
导出或部署
复制/导出 .sql,或在最终确认后部署到目标数据库。支持时可以在事务中执行,并查看语句级进度与结果。
Schema 差异类型
| 状态 | 含义 | 典型脚本 |
|---|---|---|
| 源端新增 | 目标缺少对象 | CREATE、添加字段/索引/约束 |
| 目标多余 | 源端没有对象 | DROP 或删除字段/索引/约束 |
| 对象修改 | 两端定义不同 | ALTER、重建、替换源码 |
| 重命名候选 | 名称不同但结构相似 | 根据阈值建议重命名,需要人工确认 |
| 兼容性冲突 | 源类型或特性不能直接映射到目标 | 字段映射、降级或手写迁移 |
对象树可以按操作类型筛选和选择。删除对象不会因为“目标多余”就自动执行,仍需要用户选择和最终确认。
比较选项
对象范围
不同数据库可以比较:
- 表、字段、列顺序和主键
- 唯一键、外键、Check 和排除约束
- 索引、视图、函数、序列、触发器和 Rule
- Owner 和序列当前值
选项按方言默认值加载。没有可靠元数据或同步 SQL 的对象会隐藏或只显示差异。
表过滤
- 包含和排除模式
- 包含/排除冲突时的优先级
- 批次模式和表名模式
- 是否显示系统对象
过滤用于控制比较范围,不等于数据库权限。当前账号无法读取的对象不会出现在结果中。
重命名检测
可以启用字段或表重命名检测,并设置相似度阈值。重命名建议基于结构相似度,不知道业务语义;确认前检查数据、约束、应用代码和依赖对象。
跨方言与字段映射
源/目标数据库类型不同时,可以指定源方言、目标方言、兼容阈值和字段类型映射:
- 保留参数,例如
VARCHAR(255)的长度 - 去掉不兼容参数
- 使用自定义目标参数
跨引擎对比只能生成“尽可能兼容”的脚本。字符集、排序规则、自增、序列、分区、存储引擎、函数和权限往往需要人工迁移设计。
DDL、依赖与部署审核
选择对象后可以查看:
- 源端和目标端 DDL
- 单对象部署 SQL
- 全部所选对象的部署脚本
- 对象依赖和被依赖关系
- 字段映射与兼容性提示
- 创建、修改、删除数量和影响摘要
- 可选回滚脚本(启用且能够生成时)
最终部署页面会再次显示目标服务器、数据库、Schema、数据库版本和语句数量。生产环境保护会在执行前要求明确确认。
方言语义
DBX 会尽量保留数据库专属语义,而不是把所有 DDL 转成通用格式,例如:
- PostgreSQL / openGauss 等的 Schema、序列、Owner、Rule 和索引特性
- MySQL 兼容数据库的字符集、排序规则、自增和索引语法
- Oracle、达梦、GaussDB、KingbaseES 等的类型和对象限定方式
- Doris / StarRocks、ClickHouse、Elasticsearch/Easysearch 等只在可可靠处理的结构范围内参与
支持连接不代表所有对象都可对比或部署。查看 数据库支持 和结果中的 capability 提示。
数据对比
数据对比独立于 Schema 对比,用于比较源表和目标表的行。
选择源表和目标表
选择连接、数据库、Schema 和表。批量模式可以选择多张源表,并按同名表映射到目标。
选择关键字段
指定能够唯一识别行的主键或业务键。关键字段错误会把更新误判为新增/删除。
执行比较
DBX 读取两端数据并标记源端新增、目标端多余和字段修改。批量模式显示当前表、进度和单表失败原因。
选择差异
按新增、删除、修改筛选,并选择要同步的行或字段。详情预览限制可以控制一次展示的数据量。
生成并执行同步 SQL
DBX 为目标数据库生成 INSERT、UPDATE 和 DELETE。确认语句、数量和目标后再执行。
数据差异方向
| 状态 | 含义 | 同步到目标时 |
|---|---|---|
| 新增 | 行只存在于源端 | 生成 INSERT |
| 删除 | 行只存在于目标端 | 生成 DELETE |
| 修改 | 相同关键字段的其他列不同 | 生成 UPDATE |
| 一致 | 两端行相同 | 不生成语句 |
删除同步风险最高。若目标端允许存在源端没有的本地数据,不要选择删除差异。
对比前检查
- 源和目标方向是否正确
- 账号是否能读取完整元数据、DDL 或表数据
- 表过滤和对象选择是否遗漏关键依赖
- 关键字段是否唯一、是否包含
NULL - 跨方言字段映射是否保留精度和语义
- 目标是否启用只读或生产保护
- 是否已经备份并在测试环境验证脚本
已知边界
- 动态 SQL、存储过程内部行为、应用代码和外部 ETL 不在 Schema 对比范围内
- 重命名检测是相似度建议,不是确定结论
- DDL 格式差异可能产生语义相同但文本不同的结果
- 数据对比需要把选定范围读入比较流程,不适合无过滤地处理超大表
- 事务回滚能力取决于目标数据库
- 对比配置包含连接 ID 和范围,但不包含数据库密码