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

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

31771f45c98566ab6e37ccc27e3139bb.png

这两年一直在做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)

13e133faff2d00363787ac1177f91842.png

8.0.24 -- 8.0.37 将在下周发文

f0e732d652541f8c2dd89b287e9a7a74.png

为什么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 等值计算中有相当好的性能。

fc0d9e242b538a828545e4bd426c8f43.png 54e29771ffd2c94bcbf629e81725d48a.png
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篇文章

1ade935a13336e4468d0294d95b88cb9.png

9c1ca8dbe8172e09d1130069dc3af393.png

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值