使用mysqldiff对多个MySQL数据库进行比较 - 感觉不妥

时间:2024-02-24 09:09:01

提示:本文内容是在 MySQL5.7.32 和 MySQL8.0.23 中使用 mysqldiff ,前面是使用及遇到的一些问题,后面是安装及遇到的一些问题;

           MySQL8.0.23遇到的一些问题可以配合MySQL5.7.32版本进行调整并最终成功执行,8.0及以上版本的处理办法放在使用方法这块的结尾,安装和执行命令是相同的,不同的只有报错,根据提示,相应得到处理即可。

 

——使用:

当你已经安装成功之后(安装在后面),直接在命令行输入 mysqldiff 之后执行,会获得一个警告,而警告中就告诉你如何去使用这个工具了:

[root@MySQL-120 ~]# mysqldiff
# WARNING: Using a password on the command line interface can be insecure.
Usage: mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4

mysqldiff: error: No objects specified to compare.

 

完整的语法是:mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4

非常简单易懂,比如我自己将我本机的MySQL下的两个库进行比较,看看之间有什么不同:

[root@MySQL-120 ~]# mysqldiff --server1=root:123456@localhost --server2=root:123456@localhost test1:test2
# WARNING: Using a password on the command line interface can be insecure.
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# WARNING: Objects in server1.test1 but not in server1.test2:
#        TABLE: t2
# WARNING: Objects in server1.test2 but not in server1.test1:
#        TABLE: t3
#        TABLE: t4
# Compare failed. One or more differences found.

信息显示了对比的两个库中的表有哪些差异,分别列出test1与test2之间相比较出现的差异表,当然有视图的话还会显示视图;

最后一句提示对比失败,是因为库中的表有差异,表示失败,并不是本身执行失败,若对比未出现差异,则是对比成功,显示 # Success. All objects are the same.

 

若要对比表的结构,使用database.table的形式对比:

注意:mysqldiff 会对库中的表是否存在以及表的结构进行对比,但不会去对比表中的数据,若表名表结构相同但数据有差异,依然会显示对比成功,表的结构发生差异,会显示出具体差异情况。

[root@MySQL-120 ~]# mysqldiff --server1=root:123456@localhost --server2=root:123456@localhost test1.t1:test2.t1
# WARNING: Using a password on the command line interface can be insecure.
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Comparing test1.t1 to test2.t1                                   [FAIL]
# Object definitions differ. (--changes-for=server1)
#

--- test1.t1
+++ test2.t1
@@ -1,4 +1,3 @@
 CREATE TABLE `t1` (
-  `id` int(11) DEFAULT NULL,
-  `name` varchar(20) DEFAULT NULL
+  `id` int(11) DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
# Compare failed. One or more differences found.

 

 

关于MySQL8.0及以上版本执行命令时出现的各种报错:

1.遇到Authentication plugin ‘caching_sha2_password’ cannot be loaded:

root@localhost : mysql 11:31:01> alter user root@\'localhost\' identified with mysql_native_password by \'123456\';
Query OK, 0 rows affected (0.00 sec)
root@localhost : mysql 11:31:48> flush privileges;
Query OK, 0 rows affected (0.00 sec)

典型的MySQL5.x与8.0版本的差异错误,各种场景下遇到太多次了,密码的问题,直接修改密码的加密模式即可。

 

2.报错 mysql 中的 proc 和 event 表不存在:

两个表并不会一起提示,先会提示你 proc 不存在,之后再提示你 event 表不存在,一起解决就行了,方法就是从MySQL5.x的版本的数据库导出,之后导入8.0及以上的库

报错信息:ERROR: Query failed. 1146 (42S02): Table \'mysql.proc\' doesn\'t exist

                  ERROR: Query failed. 1146 (42S02): Table \'mysql.event\' doesn\'t exist

  ##从MySQL5.x版本的数据库进行导出,然后scp传给8.0的库
[root@localhost ~]# mysqldump -u root -p mysql event proc > event_proc.sql
Enter password: 
[root@localhost ~]# scp event_proc.sql 192.168.1.120:/root/event_proc.sql.sql

  ##在8.0的库进行导入
[root@MySQL-120 ~]# mysql -u root -p mysql < event_proc.sql.sql 
Enter password: 
Warning (Code 3719): \'utf8\' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
......
  ##导入期间会警告提示,此为警告,是因为版本发生变化,UTF8的别名也发生了变化,不过数据会正常执行导入并成功完成

  ##之后我们再执行则可以正常的进行比对了
[root@MySQL-120 ~]# mysqldiff --server1=root:123456@localhost --server2=root:123456@localhost test01:test02
# WARNING: Using a password on the command line interface can be insecure.
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# WARNING: Objects in server1.test01 but not in server1.test02:
#        TABLE: t01
#        TABLE: t02
# Compare failed. One or more differences found.

此问题是由于MySQL8.0及以上的版本在mysql的库中没有 proc 和 event 这两个表,执行 mysqldiff 又需要它们,至于为什么个人没有去深入研究,反正解决了,哈哈!

 

 


 

——安装:

在官网下载 MySQL Utilities 工具软件本体( https://downloads.mysql.com/archives/utilities/ )

同时还需要在官网下载必要的依赖软件( https://downloads.mysql.com/archives/c-python/ )

这是目前我下载的版本,有特殊需求,可以选择其他版本:

[root@MySQL-120 ~]# ll mysql-*
-rw-r--r-- 1 root root    247024 Mar 20 13:06 mysql-connector-python-2.1.7-1.el7.x86_64.rpm
-rw-r--r-- 1 root root    856440 Mar 20 12:21 mysql-utilities-1.6.5-1.el7.noarch.rpm

 

注意:这里我是家里测试的,我个人的MySQL是8.0.23的版本,而最开始使用的是MySQL5.7.32的版本,我个人的8.0.23版本出现了异常报错;

           所以将软件下载的版本降下来,不要下 mysql-connector-python-8.0.23 , 而是选择2.1.7 ;

[root@MySQL-120 ~]# mysqldiff
Traceback (most recent call last):
  File "/usr/bin/mysqldiff", line 28, in <module>
    from mysql.utilities.common.tools import check_python_version
ImportError: No module named utilities.common.tools

 

之后将两个rpm包进行安装

[root@MySQL-120 ~]# rpm -ivh mysql-connector-python-2.1.7-1.el7.x86_64.rpm 
warning: mysql-connector-python-2.1.7-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:mysql-connector-python-2.1.7-1.el################################# [100%]

[root@MySQL-120 ~]# rpm -ivh mysql-utilities-1.6.5-1.el7.noarch.rpm 
warning: mysql-utilities-1.6.5-1.el7.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:mysql-utilities-1.6.5-1.el7      ################################# [100%]

 

 

安装时出现的各种报错:

1.当你直接安装 mysql-utilities 的时候报错:

[root@MySQL-120 ~]# rpm -ivh mysql-utilities-1.6.5-1.el7.noarch.rpm 
warning: mysql-utilities-1.6.5-1.el7.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
error: Failed dependencies:
    mysql-connector-python >= 2.0.0 is needed by mysql-utilities-1.6.5-1.el7.noarch

注意:提示中还给显示了版本要 >= 2.0.0 。

 

2.当你安装 mysql-connector-python 的时候报错:

[root@MySQL-120 ~]# rpm -ivh mysql-connector-python-2.1.7-1.el7.x86_64.rpm 
warning: mysql-connector-python-2.1.7-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
error: Failed dependencies:
    python-setuptools is needed by mysql-connector-python-2.1.7-1.el7.x86_64

注意:提示你需要一个叫做 python-setuptools 的软件包,有外网的情况下可以直接 yum install -y python-setuptools 进行安装。

 

3.还是当你安装 mysql-connector-python 的时候报错:

[root@MySQL-120 ~]# rpm -ivh mysql-connector-python-2.1.7-1.el7.x86_64.rpm 
warning: mysql-connector-python-2.1.7-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
error: Failed dependencies:
    net-tools is needed by mysql-connector-python-2.1.7-1.el7.x86_64

注意:根据这个情况可以看出,你缺少了什么包,都会在报错中为你提示,比较好处理,直接找对应的进行下载安装就可以了。

posted on 2021-03-25 21:02  感觉不妥  阅读(209)  评论(0编辑  收藏  举报