Files
dbx/docs/content/docs/schema-diff.cn.mdx
T

212 lines
7.7 KiB
Plaintext

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