有一些已知SQL语法与MySQL 8.0不兼容,例如:

grant ALL on *.* to admin@'%' identified by 'hechunyang';
select NVL(id/0,'YES') from test.t1 where id = 1;
select user_id,sum(amount) from test.user group by user_id DESC limit 10;

第一条语句,在MySQL 8.0中,要改成:

create user admin@'%' IDENTIFIED WITH mysql_native_password BY 'hechunyang';
grant ALL on *.* to admin@'%';

第二条语句,NVL函数是MariaDB特有的,在MySQL 8.0中,要改成:

select IFNULL(id/0,'YES') from test.t1 where id = 1;

​https://mariadb.com/kb/en/nvl/​

第三条语句,在MySQL 8.0中group by 字段 ASC/DESC 失效,要改成:

select user_id,sum(amount) from test.user group by user_id order by user_id DESC limit 10;

那么,如何判断业务上的未知SQL是否与MySQL 8.0兼容呢?

pt-upgrade工具可以帮助你

​https://www.percona.com/doc/percona-toolkit/LATEST/pt-upgrade.html​

使用方法:

1)你可以把一些已知的SQL,存入一个文件里,例如存入pt_upgrade_test.sql文件中。

在MySQL 8.0测试环境中执行:

shell> pt-upgrade h=127.0.0.1,P=3306,u=admin,p=hechunyang 
--type rawlog /root/tmp/pt_upgrade_test.sql
--save-results /root/tmp/upgrade_result/
--no-read-only

然后你到/root/tmp/upgrade_result/目录下,执行

shell> grep 'error' results

看报错信息。没有报错,就代表SQL是兼容的。

2)你在生产环境下开启general_log,抓取1分钟数据,然后把general_log文件拷贝到测试环境里,然后你执行:

shell> pt-upgrade h=127.0.0.1,P=3306,u=admin,p=hechunyang 
--type genlog /root/tmp/general_log.log
--save-results /root/tmp/upgrade_result/
--no-read-only

看报错信息。没有报错,就代表SQL是兼容的。

也支持对慢日志或者binlog文件进行分析,只需把

--type 后面加binlog或者slowlog即可。