# Schema 与数据对比

> 对比数据库结构或表数据，审查差异、类型映射、影响范围和同步 SQL，再部署到目标环境。

Source: https://dbxio.com/cn/docs/schema-diff

Language: zh-CN

Relative links resolve against https://dbxio.com/cn/docs/schema-diff.



DBX 提供两类对比工作流：

* **Schema 对比**比较对象结构和 DDL，生成从源环境部署到目标环境的脚本
* **数据对比**按关键字段比较一张或多张表的行，生成可选择的插入、更新和删除同步 SQL

两者都遵循“源端作为期望状态，目标端作为待检查/同步状态”的方向。选择反了会生成相反的操作。

对比结果和生成 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、数据库版本和语句数量。生产环境保护会在执行前要求明确确认。

“在事务中执行”只在目标数据库和语句支持事务 DDL 时提供真正的整体回滚。MySQL 等数据库的 DDL 可能隐式提交。

## 方言语义

DBX 会尽量保留数据库专属语义，而不是把所有 DDL 转成通用格式，例如：

* PostgreSQL / openGauss 等的 Schema、序列、Owner、Rule 和索引特性
* MySQL 兼容数据库的字符集、排序规则、自增和索引语法
* Oracle、达梦、GaussDB、KingbaseES 等的类型和对象限定方式
* Doris / StarRocks、ClickHouse、Elasticsearch/Easysearch 等只在可靠处理的结构范围内参与

支持连接不代表所有对象都可对比或部署。查看 [数据库支持](/cn/docs/databases) 和结果中的 capability 提示。

## 数据对比

数据对比独立于 Schema 对比，用于比较源表和目标表的行。

### 选择源表和目标表

选择连接、数据库、Schema 和表。批量模式可以选择多张源表，并按同名表映射到目标。

### 选择关键字段

指定能够唯一识别行的主键或业务键。关键字段错误会把更新误判为新增/删除。

### 执行比较

DBX 读取两端数据并标记源端新增、目标端多余和字段修改。批量模式显示当前表、进度和单表失败原因。

### 选择差异

按新增、删除、修改筛选，并选择要同步的行或字段。详情预览限制可以控制一次展示的数据量。

### 生成并执行同步 SQL

DBX 为目标数据库生成 `INSERT`、`UPDATE` 和 `DELETE`。确认语句、数量和目标后再执行。

### 数据差异方向

| 状态 | 含义           | 同步到目标时      |
| -- | ------------ | ----------- |
| 新增 | 行只存在于源端      | 生成 `INSERT` |
| 删除 | 行只存在于目标端     | 生成 `DELETE` |
| 修改 | 相同关键字段的其他列不同 | 生成 `UPDATE` |
| 一致 | 两端行相同        | 不生成语句       |

删除同步风险最高。若目标端允许存在源端没有的本地数据，不要选择删除差异。

## 对比前检查

* 源和目标方向是否正确
* 账号是否能读取完整元数据、DDL 或表数据
* 表过滤和对象选择是否遗漏关键依赖
* 关键字段是否唯一、是否包含 `NULL`
* 跨方言字段映射是否保留精度和语义
* 目标是否启用只读或生产保护
* 是否已经备份并在测试环境验证脚本

## 已知边界

* 动态 SQL、存储过程内部行为、应用代码和外部 ETL 不在 Schema 对比范围内
* 重命名检测是相似度建议，不是确定结论
* DDL 格式差异可能产生语义相同但文本不同的结果
* 数据对比需要把选定范围读入比较流程，不适合无过滤地处理超大表
* 事务回滚能力取决于目标数据库
* 对比配置包含连接 ID 和范围，但不包含数据库密码

### [编辑单表结构](/cn/docs/table-structure)

可视化修改字段、索引、外键和触发器。

### [备份数据库](/cn/docs/database-backup)

在执行高风险同步前创建手动或定时逻辑备份。

### [数据传输](/cn/docs/data-transfer)

当目标是迁移整表数据而不是逐行对比时使用。

### [生产安全](/cn/docs/production-safety)

了解部署脚本和数据同步的生产确认。

