【问题标题】:AWS MySql RDS: "Got error 28 from storage engine"AWS MySql RDS:“存储引擎出现错误 28”
【发布时间】:2025-12-18 12:35:01
【问题描述】:

我正在开发一个相对较小的应用程序,为大约 1,500 个用户提供服务,并在大约 300 兆的 Mysql 数据库上运行。整个系统在 AWS 上运行,有一个专用 EC2 节点在 Tomcat 8 上运行 Grails 应用程序和一个专用 Mysql RDS 实例。该系统已经在生产环境中运行了大约三年,没有出现数据库问题。两个最大的表包含大约 40k 条记录。该应用程序是使用 Grails 和 Java 1.7 构建的。

昨天我们的应用程序开始抛出以下异常,并带有以下错误消息:

“从存储引擎收到错误 28”

RDS 管理 Web 控制台提供的日志为空。

谷歌搜索没有发现任何有希望帮助我们解决问题的线索,除了大多数消息指出磁盘空间不足。鉴于大多数搜索结果是指磁盘空间。作为软件开发人员而不是具有丰富 Mysql 专业知识的 DBA,我们提升了 Mysql RDS 实例的存储空间。不幸的是,今天我们的应用程序仍然偶尔会抛出相同的异常。在创建了具有 15 gigs 空间的 Mysql DRS 实例之后——这比我们的应用程序使用的额外空间多几个数量级——我们不知道这个问题的根本原因是什么。我们的猜测是,我们可能遇到了一些开箱即用的 Mysql 限制,但不知道它可能是什么或如何解决它。事实上,我们托管 onRDS 的全部原因是为了避免此类问题。

做一些谷歌搜索,这似乎是一个有点常见的 Mysql 错误,但没有任何具体的线索可供我们遵循。大多数建议都是关于检查文件系统或“inode”空间。鉴于这是 AWS 上托管的 Mysql RDS 实例,我不确定是否或如何检查这些内容。查看 RDS 实例的 CloudWatch,我可以看到 CPU 处于空闲状态,并且该实例大大低于 15 gig 的存储限制。

有没有人对我们的调查有任何建议?

鉴于我们是 RDS 新手,您能否向我们指出任何文档,或者 - 更好的是 - 建议我们可以在 RDS 控制台中调整哪些设置 - 以帮助防止发生此错误?理想情况下,我们转移到 RDS 认为如果这是一个 mysql 大小或扩展问题,那么转移到 RDS 将解决问题。作为最后的手段,今天早上我们删除了大约 2 万行不重要的数据。不幸的是,问题仍然存在,我们继续遇到问题。

几个问题:

  1. 我们可以调整任何 RDS 设置来避免此问题吗?
  2. 能否通过迁移到更大的 RDS 实例(或许拥有更多内存)来解决此问题?
  3. 如果我们搬到 Aurora,我们会遇到这个问题吗?

【问题讨论】:

  • 您的 RDS 磁盘总空间是多少,可用空间是多少?
  • 我应该补充一点,我使用的是 db.t2.small 实例,cpu 为 0.83,内存为 930 MB,存储空间为 13,900 MB。和数据库引擎版本是默认的 5.6.27。要回答您的问题,我如何确定我的可用 RDS 光盘总空间?
  • 错误 28 字面意思是“设备上没有剩余空间”。你熟悉SHOW FULL PROCESSLIST;吗? EXPLAIN SELECT ...?您可能有一个失控的笛卡尔查询,它构建了一个巨大的临时表,然后它立即消失并在每次完成时再次释放空间。奇怪的是错误日志中没有任何内容,但您可能需要验证 LOG_WARNINGS 在您的参数组中设置为 2。

标签: mysql amazon-web-services grails amazon-ec2 amazon-rds


【解决方案1】:

从您的评论来看,这绝对是一个低存储问题。因为 13 Gb 的存储空间非常小。您可以在仪表板中查看可用的免费存储空间。在监控下的“存储”指标中检查下面的屏幕截图,如果它超出红线,您将开始收到错误 28。您将不得不增加 RDS 实例的存储或释放一些空间。我会建议增加存储空间以避免以后出现这个问题。

【讨论】:

  • 感谢您的回复。我检查了我的控制台,存储在红线附近。鉴于我的实例大小为 15 gigs,并且它显示的数字是 13,900——正如您的存储在您的图片中显示为 64,000——我假设这意味着我有多少可用和空闲的存储空间(我知道我的数据库大约是 200 -300 兆)。您是否还有其他可能导致“存储引擎出现错误 28”错误的建议?
  • 错误 28 绝对是存储问题。做一件事,拍摄当前数据库的快照,使用该快照启动一个新数据库并增加存储空间,然后将您的应用程序指向新数据库,看看您是否收到错误 28。测试一下。
  • 在与 AWS 技术支持合作后,他们同意数据库本身没有存储不足。正如您所建议的,我的下一步是创建一个更大的实例(我使用 t2.large 和 50 GB 的存储空间)来查看问题是否仍然存在。不幸的是,它仍然会发生。经过许多其他尝试/故障排除后,我看到了一个包含约 40k 行长文本数据的表,每行大小为几千。删除所有数据并重新启动 mysql 后,我们无法重现该问题。对我来说,这表明我们缺少并且不知道的某种类型的尺寸限制。有什么想法吗?
  • 我应该补充一点,将我们指向这个大表的原因是我们意识到我们的应用程序的日志中包含以下消息:原因:java.sql.SQLException:表'table_name'已满
  • 我建议开始监控该表。