如何使用 Amazon RDS 解决 MySQL“表已满”错误 1114?

Ruc*_*tel 6 mysql aws amazon-rds

我正在尝试在表中添加一个新列,并且查询给了我这个错误 1114。

我的 RDS 实例大小很小。1.7 GB 内存,1 个 ECU(1 个虚拟核心和 1 个 ECU)我试图修改的表有 500 万行和 7GB 的大小。实例的磁盘大小为 15GB(40% 免费)。

这对我们来说是关键时刻,因为我们被卡住了,AWS RDS 不允许访问 mysql 配置的所有参数。我如何摆脱这个问题?

Rol*_*DBA 6

问题是:无论何时运行ALTER TABLE,都必须使用临时表。临时表未写入您的数据文件夹。它最有可能写入/rdsdbdata/tmp. 请这个查询

SHOW VARIABLES LIKE 'tmpdir';
Run Code Online (Sandbox Code Playgroud)

这会让您知道该文件夹的位置。同样,默认情况下,它是/rdsdbdata/tmp.

为什么会停止 mysqld 的事情?归咎于 MyISAM。为什么是 MyISAM?这里需要考虑:根据MySQL 5.0 Certification Study Guide

在此处输入图片说明

第 11页第 408,409 页第 29.2 节中的要点如下:

如果在向 MyISAM 表添加行时磁盘空间不足,则不会发生错误。服务器暂停操作,直到空间可用,然后完成操作。

当磁盘空间不足时,不要只是关闭或杀死 mysql。任何当前使用的 MyISAM 中打开文件句柄的计数将不会被清除。因此,MyISAM 表被标记为崩溃。如果您可以在 mysqld 仍在运行的情况下释放数据卷中的磁盘空间,一旦磁盘空间可用,mysqld 将继续使用。请注意,mysqld 本身并没有崩溃。它只是进入一种假死状态,直到自由空间出现。

在您的情况下,只需杀死ALTER TABLE. 使用 MyISAM 的临时表只是锁定了/rdsdbdata/tmp. 杀死ALTER TABLE将摆脱临时表并释放 mysqld 以继续像往常一样的生活。

我在过去的帖子中解释了这一点:

你能做什么?

您可能必须ALTER TABLE在手动阶段自己执行。

例如,假设您有这张表:

CREATE TABLE ruchit_table
(
    id int not null auto_increment,
    field1 INT NOT NULL,
    field2 VARCHAR(20),
    primary key (id)
);
Run Code Online (Sandbox Code Playgroud)

你想跑 ALTER TABLE ADD COLUMN field3 CHAR(5);

以下是在 datadir 中执行此操作的步骤:

CREATE TABLE ruchit_table_new LIKE ruchit_table;
ALTER TABLE ruchit_table_new ADD COLUMN field3 CHAR(5);
INSERT INTO ruchit_table_new SELECT id,field1,field2 FROM ruchit_table;
ALTER TABLE ruchit_table RENAME ruchit_table_old;
ALTER TABLE ruchit_table_new RENAME ruchit_table;
DROP TABLE ruchit_table_old;
Run Code Online (Sandbox Code Playgroud)

注意

  • 临时表的位置在 datadir
  • 执行了 ALTER TABLE
    • 将新列添加到空临时表
    • 加载临时表
    • 摆脱了旧桌子

这些是 mysqld 在内部使用ALTER TABLE. 这些步骤只是模拟这一点,并在datadir.

试一试 !!!


Mic*_*bot 6

如果您只有 15 GB 的 40% = 6 GB 可用空间,那么您将无法同时在实例上拥有 7 GB 表的两个副本,无论您使用ALTER TABLE(通常会创建表,然后用它替换现有表,如 RolandoMySQLDBA 解释的那样)或创建另一个表并插入数据。

听起来您的实例也没有足够的存储空间来执行。

您应该能够从管理控制台通过选择实例、选择“修改”、更改分配的存储量并单击“确定”来增加正在运行的实例上的可用存储。看:

在此处输入图片说明

http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_ScalingStorage.html

我不知道 RDS 在后台如何处理这个,所以我不知道您的数据库在更改期间是否会在短时间内变得不可用。

此操作会在修改实例时警告您潜在的性能下降,但您应该会发现该实例仍然可用且可访问,并且在几分钟内完成操作,而不会中断您的实例的可用性。