有一些已知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即可。
















