开发库和生产库表结构对不上?3 分钟自动找出所有差异

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