不能。mysqldiff 不解析 sql 备份文件,仅支持连接运行中的两个数据库实例(如 server1:db1 server2:db2)对比结构元数据,需先将 dump 文件导入为库才能使用。

mysqldiff 能不能直接比两个 SQL 备份文件?
不能。mysqldiff 不解析 .sql 文件,它只连数据库实例,对比的是运行中的两个库(或同一库的两个 schema)的结构元数据。如果你手上有两个 mysqldump 生成的备份文件,得先导入成库,再用 mysqldiff 对比。
- 常见错误现象:
mysqldiff backup1.sql backup2.sql报错Unknown database 'backup1.sql' - 真正支持的输入是
server1:db1 server2:db2这类连接格式 - 想跳过导入?可以考虑用
diff或sdiff直接比对 dump 文件,但仅限结构(加--no-data --skip-triggers --skip-routines导出后),且无法识别逻辑等价(比如列顺序不同、INTvsTINYINT的语义差异)
怎么让 mysqldiff 连上本地两个不同端口的 MySQL 实例?
需要显式指定 host + port + user + password,尤其当两个实例监听不同端口(如 3306 和 3307)时,mysqldiff 默认不读取 my.cnf 的多实例配置。
- 正确写法示例:
mysqldiff --server1=user:pass@localhost:3306 --server2=user:pass@localhost:3307 db1:db1 db2:db2 - 密码明文写在命令行有风险,建议用
mysql_config_editor配置登录路径,然后用--server1=login-path:dev - 如果报
Access denied,检查用户是否在对应端口上有SELECT权限,以及SHOW CREATE TABLE、SHOW CREATE DATABASE等元数据权限
对比结果里出现 “Object definitions are not equivalent” 是不是一定有结构差异?
不一定。这个提示常由无关紧要的格式/顺序差异触发,比如注释位置、索引定义顺序、AUTO_INCREMENT 值、字符集声明顺序等 —— mysqldiff 默认严格比对文本化后的 SHOW CREATE 输出。
- 容易踩的坑:没加
--force时,只要有一张表不一致,整个命令就退出;加了--force才会继续输出所有差异 - 忽略无意义差异:用
--skip-table-options(跳过AUTO_INCREMENT、ROW_FORMAT等)、--skip-definer(忽略视图/存储过程的 DEFINER)、--ignore-gtid - 性能影响:不加
--skip-table-options会导致每张表都查information_schema.TABLES,大库下明显变慢
为什么对比结果里没有显示数据行差异?
mysqldiff 是结构对比工具,天生不查数据。它只看表定义、索引、外键、视图、存储过程语法树,不执行 SELECT COUNT(*) 或逐行比对。
- 如果真要查数据差异,得换工具:
pt-table-checksum+pt-table-sync(Percona Toolkit),或用mysqldbcompare(MySQL Utilities 已弃用,但部分旧环境还在用) - 注意:
mysqldbcompare虽然名字像,但它也默认只比结构;加--changes-for=server2 --data才启用行级对比,代价极高,只适合小表 - 兼容性提醒:MySQL 8.0+ 中
mysqldiff仍可用,但官方已不更新 MySQL Utilities,建议确认你用的是 Percona 提供的独立包或 MariaDB 衍生版本
mysqldiff 消化 —— 这个转换步骤,很多人卡住就停在这儿。











