开发库和生产库表结构对不上?3 分钟自动找出所有差异
先说一个我自己踩过的坑
去年帮一个朋友的项目做版本上线,他在开发库加了两张表、改了几个字段,SQL 脚本交给运维,运维直接在生产执行。
结果第二天客户反馈:某个查询报错,Invalid object name 'XXX'。
查了半天发现——他在开发库改字段类型的时候,本地数据库版本和生产版本有出入,varchar(500) 写成了 varchar(100),生产库执行的时候静默失败了。从那以后,我每次上线前必做一件事:开发库和生产库结构对比一遍。
但这个”对比”的麻烦在于:
-
手动?几百张表,逐张看字段,看到眼花
-
VS 自带的 Schema Compare?只支持 SQL Server,而且要装完整的 Visual Studio,很多机器上根本没有
-
Redgate SQL Compare?功能是强,但一个 license 好几千,我们这种小团队买不起
-
写 Python 脚本?每次换库都要重新调试,中文注释还经常乱码
后来实在受不了,自己用 .NET 写了个小工具,现在分享出来。
这个工具叫 SchemaDiff
干的事就一件:连接两个数据库,自动对比所有表、字段、索引的差异,一张报表看清楚哪边多了表、哪边字段类型变了、哪边缺了索引。

支持四种企业级数据库
SQL Server、Oracle、MySQL、PostgreSQL。这四种是实际项目里跨环境对比的主力组合——SQLite 没人跨库比、MongoDB 没有强 schema 也比不出意义,所以就没做。
怎么用
第一步:填两个库的连接信息
左边填”源库”(比如开发库),右边填”目标库”(比如生产库)。选数据库类型,填服务器、库名、账号密码,端口自动切(SQL Server 1433,MySQL 3306,Oracle 1521)。
第二步:点”开始对比”
工具自动读取两边的元数据,按这几个维度逐项比对:
-
表:哪边多/少了表
-
字段:表是否存在、字段名、类型、长度、是否允许空、默认值、注释
-
索引:哪边多/少了索引
第三步:看差异报告
差异按类别分好:
-
「源库有、目标库没有」的表/字段——这是生产环境要补的
-
「两边都有、但字段定义不同」的——重点检查项
-
「目标库有、源库没有」的——可能是生产手工改的,要确认要不要回写开发库
每一项都列清楚差异类型(新增表/删除表/字段类型变更/长度变更/注释变更),一目了然。
几个我觉得重要的点
1. 只比结构,不碰数据
只读 INFORMATION_SCHEMA / 系统视图里的元数据,绝不对业务表做 SELECT。生产库连接进去也安全,导出报告是本地文件,不外传。
2. 单文件 exe,不用装环境
打了单文件版,Windows 上双击就能跑。运维同事机器上不用装 VS、不用装 Python、不用配 ODBC。
3. 跨库类型自动归一
SQL Server 的 NVARCHAR(100) 和 MySQL 的 VARCHAR(100) 跨库对比时,工具会做基本的类型映射,不会报”类型不匹配”没法比。
4. 离线可用
不依赖云端服务,两个库都能连通(哪怕是走 VPN)就行,比较结果存在本地。
适合什么场景
-
上线前检查:dev 改了结构,prod 执行前先比一遍,避免静默失败
-
多环境一致性校验:dev/test/staging/prod 四个库定期对一下,防止环境漂移
-
接老项目:新接手项目,对比本地环境和生产,搞清楚到底有哪些差异
-
外包交付:交付前确认开发库和部署库结构一致,避免上线后扯皮
不适合什么
-
要同步数据的(这是结构对比,不是数据同步)
-
要自动生成 ALTER 脚本的(工具只报告差异,不替你改库——结构变更脚本还是要 DBA 自己审,这是负责任的做法)
-
版本化管理(那是 Flyway/Liquibase 干的事)
最后
工具还在测试阶段,我自己在用。写完这篇,估计下周能出稳定版。
如果你也遇到过”dev 和 prod 表结构对不上”的麻烦,或者正在找 Redgate 的便宜替代,评论区说下你的场景,我看看能不能帮你测一版。
另外我之前还做了个数据库文档生成工具(FieldDoc),能把库结构一键导出成 Word/Excel/Markdown,配合这个对比工具,做完对比顺手出一份变更文档,交付给客户正好。
下载地址:[下载链接]

浙公网安备 33010602011771号