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

从日志可以看出:

  1. 实例是正常关闭的

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

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

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

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

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

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

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

  1. 此种情况下,在错误日志中打印详细的日志信息,说明shutdown是由于时间获取错误导致;