使用Navicat对比多环境数据库数据差异和结构差异,以及自动DML和DDL脚本

说明

今天在开发项目中在使用navicat同步工具时无意中看到数据同步和结构同步有点好奇,于是就简单使用了下,使用过后感觉很适合目前的需求;

【1】不同环境数据库表的差异对比,以及自动生成差异DDL语句
【2】不同环境的数据记录的差异,以及自动生成DML语句
在这里插入图片描述
【数据传输】相信开发人员很熟悉经常使用,而对于【数据同步】【结构同步】之前是没有接触的,其中数据同步主要对比两个数据间对应表的数据差异,结构同步主要对比两个数据库间数据表的差异以及生成SQL脚本。

结构同步

准备两个数据库,然后分别在两个数据库创建一个相同表名的数据表,其中上边的表比下面边的多一个address字段。

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

选择【工具】【结构对比】,选择t_user表结果如下,通过下面的展示可以很直观的看到差异

在这里插入图片描述
点击【部署脚本】可以看到工具帮我们生成的差异SQL,非常的方便

在这里插入图片描述

数据同步

基于上面的表结构,执行上面生成的DDL语句使两边的数据表保持一致,然后添加如下的测试数据

【源库】
INSERT INTO `t_user`(`id`, `name`, `age`, `address`, `create_time`) VALUES (1, '张三', 25, '安徽合肥', '2022-06-22 15:29:16');
INSERT INTO `t_user`(`id`, `name`, `age`, `address`, `create_time`) VALUES (2, '李四', 25, '合肥', '2022-06-22 15:29:54');
INSERT INTO `t_user`(`id`, `name`, `age`, `address`, `create_time`) VALUES (3, '王五', 25, '合肥', '2022-06-22 15:29:54');
 
 
【目标库】
INSERT INTO `t_user`(`id`, `name`, `age`, `address`, `create_time`) VALUES (1, '张三', 25, '安徽合肥', '2022-06-22 15:29:16');
INSERT INTO `t_user`(`id`, `name`, `age`, `address`, `create_time`) VALUES (3, '王五', 26, '上海', '2022-06-22 15:29:54');

点击【工具】【数据同步】,选择源库和目标库,下图就是本次对比的结果。
在这里插入图片描述
【A】区域展示了经过对比存在不同数据的表的记录,展示了不同的记录数和相同的数量等等。

【B】区域这里可以选择仅展示不同的数据,相同的数据,全部的数据等等,展示的结果在C区域,会以不同的颜色标识。

【C】展示了实际的对比结果,通过上图可以看到两库之间ID为1的数据记录相同,左表多一个ID为2的记录,两表ID为3的记录数据有差异

【D】部署,点击部署会生成差异的SQL,如上例所示,从源库到目标库,会新增一个ID为2的记录,并更新ID为3的记录
在这里插入图片描述
生成的DML如下:

SET FOREIGN_KEY_CHECKS = 0;
 
INSERT INTO `test`.`t_user`(`id`, `name`, `age`, `address`, `create_time`) VALUES (2, '李四', 25, '合肥', '2022-06-22 15:29:54');
 
UPDATE `test`.`t_user` SET `name` = '王五', `age` = 25, `address` = '合肥', `create_time` = '2022-06-22 15:29:54' WHERE `id` = 3;
 
SET FOREIGN_KEY_CHECKS = 1;

其中:SET FOREIGN_KEY_CHECKS作用:在执行sql脚本时,为了不让外键受影响导致出错。

小结

【1】本次只是简单的测试了数据同步和结构同步的功能,对于这两个功能也是工作中无意接触到的,在了解过后确实感觉对于以后的项目开发中有一定的帮助。
【2】对于其中数据结构同步,在进行版本测试提测时或者大版本升级的时候,如果没有留存升级脚本,可以通过该工具一键快速生成相关的DDL语句。如果准备了升级脚本,也还是可以通过这个工具进行一次源库和目标库的对比,这样可以保证升级时不会有缺失的,做一个保障。

【3】其中数据同步功能可以适用于一些基础表、配置表、字典表等等,如果开发中有人变更了某些数据但是未及时提交,就会导致各环境不一致。此外,对于数据结构的变更一般能够比较及时的提交,但是对于临时修改一些配置数据,基础数据等很可能有遗漏的情况,那么通过这个工具就可以对比差异,并自动生成差异SQL。

【4】在接触到该功能后,我也找了一些类似的产品,比如Liquibase、dbForge Data Compare、以及一些开源的平台。总体的功能差不多,Navicat这里提供的使用起来很方便功能也很强大,最重要的没有其他成本,作为目前项目团队所使用的数据库连接工具,可以直接连接各个环境数据库无需额外配置,而且稳定好用。

### 如何使用 Navicat 导出 MySQL 中所有数据库数据 要完成从 MySQL 数据库中导出所有数据的任务,可以通过 Navicat 提供的功能实现。以下是具体方法: #### 使用 Navicat 导出 MySQL 数据库 Navicat 是一款强大的数据库管理工具,它支持多种数据库系统的管理操作[^2]。通过其图形化界面,用户能够轻松执行复杂的任务,比如备份恢复数据库。 当需要导出 MySQL 的所有数据库时,可以按照以下方式配置 Navicat 来完成此过程: 1. **打开 Navicat 并连接至目标 MySQL 实例** 首先,在 Navicat 软件中建立与目标 MySQL 数据库实例的连接。这一步骤确保后续的操作能够在正确的服务器环境中运行。 2. **选择“数据传输”功能** 在 Navicat 主界面上方菜单栏找到并点击 `工具` -> `数据传输`。这一选项允许用户定义源数据库以及目标存储位置之间的映射关系。 3. **设置源目标参数** - 源部分应指定当前已连接上的 MySQL 服务作为输入端。 - 对于目标,则可以选择保存为 SQL 文件或其他兼容格式以便稍后重新加载回新的环境当中去[^3]。 4. **全选待处理对象** 进入下一步后会显示该 MySQL 实例下所有的 schema 列表;此时只需勾选全部条目即可准备一次性打包整个系统内的所有结构及相关记录内容。 5. **启动导出进程** 完成上述设定之后按下确认按钮即刻触发实际写盘动作直到结束为止。最终生成的结果文件包含了完整的 DDL (Data Definition Language) DML(Data Manipulation Language),从而实现了跨平台移植的需求满足。 ```sql -- 示例SQL语句用于手动验证导出后的脚本是否正常工作 CREATE DATABASE IF NOT EXISTS my_database; USE my_database; DROP TABLE IF EXISTS example_table; CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO example_table (name) VALUES ('Test Entry'); ``` 以上代码片段展示了创建新数据库及其内部一张简单表格的过程,并插入一条测试记录来检验还原效果如何。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZWZhangYu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值