MYSQL 版本迁移带来 严重生产事故“的”分析

2024年 6月 21日 56.7k 0

开头还是介绍一下群,如果感兴趣 PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server 等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共 2380 人左右 1 + 2 + 3 + 4 +5 +6)新人分配到 6 群。

MYSQL 版本迁移带来 严重生产事故“的”分析-1

这两年一直在做MySQL迁移到PolarDB for MySQL的问题,基本上是迁移一个项目反馈都是好的,优秀的,没有马失前蹄,终于在昨天掉进了陷马坑,MySQL 迁移到 POLARDB FOR MYSQL 后报表任务无法运行,业务强制回滚了。

这里分析一下原因,这个部分不光适合 MYSQL TO POLARDB FOR MYSQL ,也适合 MYSQL TO MYSQL 的版本迁移或者 MYSQL TO 以国产为套壳的MYSQL 数据库产品。

先说显现问题的状态,在迁移到PolarDB for mysql后从节点的CPU 打满,并且在开启弹性后整体的弹性的PCU 也打满,原先MySQL 配置也就16C 64G的配置,而迁移到PolarDB后,CPU用到了31CPU,迟迟不能下降持续100% 的运行频率进行。

经过分析发现是从节点大量运行报表的SQL导致问题,SQL这里就不展示了有业务的敏感性,语句很长,之前在RDS MYSQL 上运行是可以的,但为什么迁移到PolarDB for MYSQL 就出现问题。

经过和阿里云的工程师进行分析后,主要的问题点在于版本,我们都知道MYSQL 8的功能更新点较多,尤其8.00 -8.032,我最近也总结了相关的版本的更新的一些要点,需要的可以看下面的链接,后续还有8.024-8.037的MySQL版本更新的梳理贴。

MySQL 8.0 版本更新 要点 列表 (8.0-8.0.23)

MYSQL 版本迁移带来 严重生产事故“的”分析-2

8.0.24 -- 8.0.37 将在下周发文

MYSQL 版本迁移带来 严重生产事故“的”分析-3

为什么MySQL RDS产品可以做报表,POLARDB FOR MYSQL 在运行这个部分,不可以的关键在于版本,MYSQL RDS 的版本为8.0.25 ,而POALRDB FOR MYSQL 8.01 的版本是8.0.13, 在mysql 8.018上更新了一个SQL语句的处理功能 HASH JOIN,

查阅了官方的文档,关于Hash join的解释部分
https://dev.mysql.com/doc/refman/8.4/en/hash-joins.html
在具有hash join功能的MySQL数据库系统中,哈希连接内存使用可以通过join_buffer_size来进行控制,哈希链接使用的内存不能超过join_buffer_size的数量当超过这个内存的需求的情况下,将引发磁盘缓冲来解决问题,性能会降低,所以在mysql8.0.18后的数据库系统要注意的是 join_buffer_size的部分设置的是否有问题,太小等。同时如果太多的语句都需要进行临时文件生成,超过open_file_limit的设置,则语句可以能无法运行成功。

hash join 使用分为构建阶段和探测阶段,在构建阶段会构建出内存hash table, 将需要构建的列的值都写入到内存表中,然后就开始探测的阶段,在探测的阶段开始读取另一个表中的行并和内存中的数据进行比较,进行数据的关系行的匹配。这样相对于nestloop的方式在 JOIN 等值计算中有相当好的性能。

MYSQL 版本迁移带来 严重生产事故“的”分析-4MYSQL 版本迁移带来 严重生产事故“的”分析-5

mysql> select * from countries limit 1;
+------------+--------------+
| country_id | country_name |
+------------+--------------+
|          1 | Country1     |
+------------+--------------+
1 row in set (0.00 sec)

mysql> select * from persons limit 1;
+-----------+------------+------------+
| person_id | given_name | country_id |
+-----------+------------+------------+
|         1 | Person1    |        434 |
+-----------+------------+------------+
1 row in set (0.01 sec)

mysql> select count(*) from countries;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from persons;
+----------+
| count(*) |
+----------+
|   895831 |
+----------+
1 row in set (0.04 sec)

SET optimizer_switch = 'block_nested_loop=off,batched_key_access=off,mrr=off,hash_join=on';

ANALYZE TABLE countries;
ANALYZE TABLE persons;

EXPLAIN FORMAT=TREE
SELECT given_name, country_name
FROM persons
JOIN countries ON persons.country_id = countries.country_id;

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                 |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Inner hash join (countries.country_id = persons.country_id)  (cost=0.70 rows=1)
    -> Table scan on countries  (cost=0.35 rows=1)
    -> Hash
        -> Table scan on persons  (cost=0.35 rows=1)    

mysql> 

结论:在MySQL 5.7到8.0版本升级的过程中,需要注意SQL语句处理的变化,不光是SQL语句的本身,如group by,union 等语句的撰写的变化,与此同时还要注意 SQL 执行计划的变化,无论是从低版本到高版本,还是高版本迁移到其他类MySQL数据库,一定要注意版本之间的差异,否则产生业务回滚或生产事故那就是必然的了!

最后一定要注意 类 MYSQL的产品,把MYSQL 往 类MYSQL的产品迁移一定要关注 版本的差异。

置顶文章:

MongoDB 的一张“大字报”  服务客户,欢迎DISS

MySQL 8.0 版本更新 要点 列表 (8.0-8.0.23)

临时工说:炮轰阿里云MongoDB司令部 低质高价技术差 你是要疯!!!!

生成式 AI 能否取代 DBA  结尾有炸弹

临时工说:数据库厂商官方媒体干不过 “破落户” 这究竟是为哪般?

临时工说:DBA转售前,练习怎么写数据库客户案例

PolarDB VS PostgreSQL  "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?

PostgreSQL 版本升级到PG14后,pgbouncer 无法使用怎么回事?临时工访谈:NoSQL 大有前景,MongoDB DBA 被裁员后谋求新职位
临时工访谈:问金融软件开发总监  哪些业务不用传统数据库PolarDB for PostgreSQL  有意思吗?有意思呀PolarDB  Serverless POC测试中有没有坑与发现的疑问
PolarDB 数据库架构 测试 serverless 后的 三字真言  稳定,灵活,省钱(的用对地方)

往期热门文章:临时工说:如果DBA大龄被裁员了怎么办?临时工访谈:DBA 考PMP 有用没有用,访谈专业的项目管理人士的意见
MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验临时工访谈:从国产数据库 到 普罗大众的产品 !与在美国创业软件公司老板对话
PostgreSQL 如何通过工具来分析PG 内存泄露
MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
临时工访谈:我很普通,但我也有生存的权利,大龄程序员 求职贴PolarDB  Serverless POC测试中有没有坑与发现的疑问
临时工访谈:PolarDB  Serverless  发现“大”问题了  之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一临时工说: 快速识别 “海洋贝壳类” 数据库方法速递临时工说:国产 数据库 销售人员  图鉴MongoDB 不是软柿子,想替换就替换PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理MySQL 八怪(高老师)现场解决问题实录
PostgreSQL 为什么也不建议 RR隔离级别,MySQL别笑临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
MONGODB  ---- Austindatabases  历年文章合集MYSQL  --Austindatabases 历年文章合集POSTGRESQL --Austindatabaes 历年文章整理POLARDB  -- Ausitndatabases 历年的文章集合PostgreSQL  查询语句开发写不好是必然,不是PG的锅
SQL SERVER 如何实现UNDO REDO  和PostgreSQL 有近亲关系吗
MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)

Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlServer,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。

截止今天共发布 1164篇文章

MYSQL 版本迁移带来 严重生产事故“的”分析-6

MYSQL 版本迁移带来 严重生产事故“的”分析-7

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论