【问题标题】:Mysql RDS with 3 million records not allowing to add new column具有 300 万条记录的 Mysql RDS 不允许添加新列
【发布时间】:2018-05-16 11:38:58
【问题描述】:

您好,我有 mysql rds 数据库服务器,当我尝试添加新列时,我的一个表有 3 million+ 记录,它总是失败并给出以下错误

查询ALTER TABLE user_notifications ADD program_id int(11);

错误Temporary file write failure

我的 RDS 数据库实例是 db.t2.medium

【问题讨论】:

标签: mysql amazon-web-services ruby-on-rails-4 amazon-rds


【解决方案1】:

ALTER TABLE 是重新创建表,因此在此过程的某个阶段,系统上会存在两个表副本。

因此,您将需要大于data length 大小的可用空间来执行此操作。

您可以在表格信息中查看data length

有这个alternate solution,您可以在其中创建一个具有新所需架构的新表,并将数据从旧表分块移动到新表。

【讨论】:

  • "ALTER TABLE 是重新创建表,......在过程中的某个阶段。" 并非总是如此 MySQL 5.6+ 支持 InnoDB 表上的在线 DDL (dev.mysql.com/doc/refman/5.6/en/…).. "指定ALGORITHM=INPLACE 使操作对支持它的子句和存储引擎使用就地技术,否则会失败并出现错误,因此如果您尝试更改使用与预期不同的存储引擎的表,则可以避免冗长的表副本。 " 来源dev.mysql.com/doc/refman/5.7/en/alter-table.html
【解决方案2】:

MySQL 将在使用 alter 时重新创建表,因此您需要在磁盘上有足够的可用空间来存储表的另一个副本。

我怀疑表很大,因为它有 300 万条记录,而您的磁盘空间不足

This article 显示如何确定一个表正在使用多少磁盘空间

【讨论】:

  • "当使用 alter ... 磁盘创建表的另一个副本时,MySQL 将重新创建表。"并非总是如此 MySQL 5.6+ 支持 InnoDB 表上的在线 DDL (dev.mysql.com/doc/refman/5.6/en/…)..“指定 ALGORITHM=INPLACE 使操作对支持它的子句和存储引擎使用就地技术,否则会失败并出现错误,因此如果您尝试更改使用与您预期不同的存储引擎的表,请避免冗长的表副本。" 来源dev.mysql.com/doc/refman/5.7/en/alter-table.html
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
相关资源
最近更新 更多