数据库内核月报 - 2015 / 06-MySQL · 捉虫动态 · 任性的 normal shutdown

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

问题描述

在RDS生产环境中,一个MySQL实例莫名地被shutdown了, 日志中有如下信息:

150525 15:30:52 [Note] User 'userxx' issued shutdown command
150525 15:30:52 [Note] /path/to/mysqld: Normal shutdown
150525 15:30:52 [Note] Stop asynchronous binlog_dump to slave (server_id: xxxxx)
150525 15:30:52 [Note] Event Scheduler: Killing the scheduler thread, thread id xxx
150525 15:30:52 [Note] Event Scheduler: Waiting for the scheduler thread to reply
150525 15:30:52 [Note] Event Scheduler: Stopped
150525 15:30:52 [Note] Event Scheduler: Purging the queue. 0 events
150525 15:30:53 [Note] User 'userxx' issued shutdown command
150525 15:31:07 [Note] Slave I/O thread exiting, read up to log 'log.xxxxx', position xxxxxx
150525 15:31:07 [Note] Error reading relay log event: slave SQL thread was killed
150525 15:31:09 [Note] User 'userxx' issued shutdown command
AI 代码解读

以下日志是 RDS 实例特有的日志,RDS实例会将用户的重要操作记录在错误日志中。

150525 15:30:52 [Note] User 'userxx' issued shutdown command
AI 代码解读

从日志可以看出:

  1. 实例是正常关闭的
  2. 用户在极短的时间内执行了多次shutdown命令

问题分析

首先我们来查看用户userxx信息,比较奇怪的是,用户userxx为普通用户,并没有执行shutdown的权限。
第一感觉很可能是MySQL权限模块出现了bug, 导致普通用户也可以执行shutdown命令。于是在一个测试实例上,建立相同权限的同名用户,验证发现userxx确实没有权限执行shutdown命令。

进一步从源码中来分析,查找源码中所有可能执行shutdown的路径。从源码中扫描COM_SHUTDOWN 出现的地方,于是在dispatch_command函数中发现一处比较可疑的地方,代码如下:

    thd->set_time();
	if (!thd->is_valid_time())
	{
	  /*
	   If the time has got past 2038 we need to shut this server down
	   We do this by making sure every command is a shutdown and we
	   have enough privileges to shut the server down

	   TODO: remove this when we have full 64 bit my_time_t support
	  */
	  thd->security_ctx->master_access|= SHUTDOWN_ACL;
	  command= COM_SHUTDOWN;
	}
AI 代码解读

MySQL 每次执行一条命令前,会获取一个系统当前时间(thd->set_time()),如果获取的时间不合法(超过2038年或小于0),那么此条命令会自动转为shutdown命令。

如果用户多个连接并发执行命令,并且获取的时间不合法,那么每个连接都会执行shutdown命令,这和我们前面看到的日志中的现象很吻合。

看来问题集中在为什么获取时间会不合法?

最可能的原因是当前主机系统时间设置超过了2038, 于是查看系统时间,然而并没有如我们所愿,系统时间是正常的。

最后我们从系统日志中发现了端倪,

May 25 15:29:49 xxx kernel: : [4768743.131263]  [<ffffffff8109bff3>] ? ktime_get+0x63/0xe0
May 25 15:29:49 xxx kernel: : [4768743.131267]  [<ffffffff810726f7>] ? __do_softirq+0xb7/0x1e0
May 25 15:29:49 xxx kernel: : [4768743.131271]  [<ffffffff8100c24c>] ? call_softirq+0x1c/0x30
May 25 15:29:49 xxx kernel: : [4768743.131274]  [<ffffffff8100de85>] ? do_softirq+0x65/0xa0
May 25 15:29:49 xxx kernel: : [4768743.131276]  [<ffffffff810724e5>] ? irq_exit+0x85/0x90
AI 代码解读

差不多在同一时刻系统出现较多的软中断,导致获取系统时间出现错误,即超过2038年或小于0。

改进

从错误日志中我们表面上看到普通用户执行了shutdown命令,这个带来了疑惑和误导。因此我们做了如下改进:

  1. 此种情况下,在错误日志中打印详细的日志信息,说明shutdown是由于时间获取错误导致;
  2. 增加重试机制,在第一次获取时间不合法情况下,不直接执行shutdown,而是增加重试重新获取时间,如果还是不合法,再执行shutdown。
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
db匠
+关注
目录
打赏
0
0
0
0
9495
分享
相关文章
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
245 82
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
244 42
【YashanDB知识库】数据库使用shutdown immediate无响应导致coredump
【标题】数据库使用shutdown immediate无响应导致coredump 【简介】在YashanDB 22.2 - 22.2.10.100版本中,执行shutdown immediate后数据库未正常退出,强制停止进程时发生coredump。原因是参数错误导致选举错误,且shutdown后数据库重启并接收redo日志,终止时因处理redo日志触发异常。需检查参数设置并避免不当操作。
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
176 25
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?
TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用户完成原始数据的清洗和结构优化,而其零代码迁移能力更实现了历史数据从 TDengine OSS 与 MySQL 到 TDengine 企业版的平滑迁移,全面提升了企业的数据管理效率。本文将详细解读这一实践案例。
43 0
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。

相关产品

  • 云数据库 RDS MySQL 版