Navicat可以通过Structure Synchronization比较两个数据库或Schema中的表、字段、索引、主键、外键、字符集等结构信息,并根据差异生成同步脚本。它比较的是数据库对象定义,不是表中的业务数据,因此使用前要先确认Source Database和Target Database选择正确。出现同一批数据库重复比较结果不同、Navicat显示有差异但人工查看结构相同等情况时,应继续检查比较选项、对象DDL以及两端数据库服务器的实际配置。
Navicat可以通过SSH隧道访问不能直接暴露数据库端口的远程服务器,连接时先建立到SSH服务器的加密通道,再由SSH服务器访问数据库。配置中同时存在两组主机、端口和账号:一组属于数据库,另一组属于SSH服务器。出现连接超时时,应先判断SSH通道本身是否能够建立,再检查隧道建立后能不能从SSH服务器访问数据库,避免把数据库地址、SSH地址和两套账号混在一起修改。
数据库平时运行正常,很容易让人忽略备份。等到误删表、升级失败或服务器异常,再临时找恢复文件,往往就有点晚了。处理“Navicat怎么备份数据库Navicat数据库备份文件恢复失败是什么原因”,重点不只是点一下【备份】,还要确认对象选全、文件可用,并提前验证恢复流程。
SQL文件执行到100%,点开数据表却看到一排“???”,这种情况确实挺折腾。表结构已经建好,记录也写进去了,可中文全坏了,再改字符集往往也恢复不了。处理“Navicat怎么导入SQL文件Navicat导入SQL文件后中文乱码如何解决”,要把SQL文件编码、Navicat连接编码和数据库字符集放在一起看。少检查一处,重新导入后仍可能乱码。
Navicat数据迁移的操作,和迁移之后表结构不一致的处理,关键并不在于把源库和目标库连接起来就直接开始传输,而是需要先确认好迁移的对象、表结构、字段的映射、索引和约束,还有目标库的类型。Navicat提供了Data Transfer、Data Synchronization和Structure Synchronization这些功能,可以用来处理数据库对象、表数据,还有结构差异这类问题。
Navicat怎么配置数据库连接,以及连接超时的时候又该怎么排查,这在数据库管理工具的使用当中,是很常见的问题。Navicat这个工具,它本身是支持连接MySQL、MariaDB、SQL Server、PostgreSQL、Oracle、SQLite这些不同类型的数据库的,但是连接最终能不能成功,并不仅仅是取决于软件这边的设置,它和数据库服务的状态、账号的权限、端口、防火墙、网络环境、SSL或者SSH通道,这些东西都有关系。碰到连接超时的时候,不要只是反反复复地去改密码,而是应该先去判断一下,问题到底是在本机的配置上面,还是在服务器的监听上面,又或者是在网络的链路上面。
开发库、测试库和正式库各管各的时间一长,表的字段、索引还有视图慢慢就容易对不上号。很多人都会关心Navicat里的结构同步功能到底要怎么操作,以及在同步之前又该怎样去比较两边库的差异;有一点操作上要留心的是,不能一上来就直接去点执行按钮。因为结构同步一旦跑起来,它会去改动目标库里对象的定义,像删掉某个字段、改变数据类型、动了约束条件这些,全都有可能给已有的数据造成影响。好在Navicat的结构同步工具可以先比出两个数据库在结构上的差异,然后生成一份等着去执行的变更脚本。
数据库初始化、表结构调整或者批量往里写数据的时候,免不了要用到 SQL 脚本,于是很多人会问,在 Navicat 里头怎么去跑这些 SQL 脚本,跑完以后又该从哪儿把执行记录翻出来看,要解决这两个问题,动手前就最好先确认三样东西:连的是哪台服务器、脚本要对准哪个库,以及脚本文件本身是什么编码,完了还要去翻翻执行日志,光看到文件顺顺利利打开了,不代表它就一定执行在了正确的那一个库里;跑完之后如果只瞄一眼那个成功的提示,其实也还不太够稳妥。
在Navicat里做ER图,很多人最容易混淆的不是窗口在哪,而是“画图”和“出关系线”并不是完全同一步。按Navicat官方资料,ER图既可以从现有数据库反向生成,也可以在模型图里手工维护;而关系线的核心基础其实是外键,数据库里本来就有外键时,反向建模通常会把关系一起带进图里,数据库里没有外键时,就要在模型图里补外键,关系线才会真正出现。
Navicat导入SQL文件,很多人一开始会把【Import SQL】和【Execute SQL File】当成同一个功能来用,结果不是导进去没执行,就是执行了以后中文变成乱码。官方手册其实把这两条路径分得很清楚,一条是把SQL文件内容读进查询编辑器,也就是【File】→【Import SQL】;另一条是直接在连接、数据库或模式上执行一个SQL文件,也就是右键后的【Execute SQL File】。而乱码问题最常见的根子,也不是SQL本身有问题,而是文件编码和连接使用的客户端字符集没有对齐。