不可不知的 MySQL 升级利器及 5.7 升级到 8.0 的注意事项

​数据库升级,是一项让人喜忧参半的工程。喜的是,通过升级,可以享受新版本带来的新特性及性能提升。忧的是,新版本可能与老的版本不兼容,不兼容主要体现在以下三方面:

语法不兼容。语义不兼容。同一个SQL,在新老版本执行结果不一致。新版本的查询性能更差。

所以,在对线上数据库进行升级之前,一般都会在测试环境进行大量的测试,包括功能测试和性能测试。

很多人可能会觉得麻烦,于是对待升级就秉持着一种“不主动,也拒绝”的态度,怎奈何新版本性能更好,新特性更多,而且老版本在产品维护周期结束后,也存在安全风险。

升还是不升呢?that is a question。

下面我们介绍一个 MySQL 升级利器,可极大减轻 DBA 包括开发童鞋在升级数据库时的心智负担和工作负担。

这个利器就是 pt-upgrade。

pt-upgrade 是 Percona Toolkit 中的一个工具,可帮忙我们从业务 SQL 层面检查新老版本的兼容性。

一、pt-upgrade 的实现原理

它的检测思路很简单,给定一个 SQL,分别在两个不同版本的实例上执行,看看是否一致。

具体来说,它会检查以下几项:

Row count:查询返回的行数是否一致。Row data:查询的结果是否一致。Warnings:是否提示 warning。正常来说,要么都提示 warning,要么都不提示 warning。Query time:查询时间是否在同一个量级,或者新版本的执行时间是否更短。Query errors:查询如果在一个实例中出现语法错误,会提示 Query errors。SQL errors:查询如果在两个实例中同时出现语法错误,会提示 SQL errors。

二、pt-upgrade 的常见用法

pt-upgrade 的使用比较简单,只需提供两个实例的 DSN (实例连接信息)和文件名。

常见用法有以下两种:

直接比较一个文件中的 SQL 在两个实例中的执行效果。​# pt-upgrade h=host1 h=host2 slow.log

可通过 --type 指定文件的类型,支持 slowlog(慢日志),genlog(General Log),binlog(通过 mysqlbinlog 解析后的文本文件),rawlog( SQL语句 ),tcpdump。不指定,则默认是慢日志。

先生成一个基准测试结果,然后再基于这个结果测试其它环境的兼容性。# pt-upgrade h=host1 --save-results host1_results/ slow.log

# pt-upgrade host1_results1/ h=host2

第二种用法适用于两个实例不能同时访问,或者需要基于一个基准测试结果进行多次测试。

三、Demo

看下面这个 Demo。

pt_upgrade_test.sql 包含了若干条测试语句。

# cat /tmp/pt_upgrade_test.sql

select "a word a" REGEXP "[[:

THE END
Copyright © 2024 亿华云