#1041 - mysql 内存不足问题

Bhu*_*dey 4 mysql memory mysql-5.5 amazon-rds

我正在使用 Amazon RDSdb.m1.medium实例。它至少有 40-50 个数据库和至少 10k 个表。过去一年它工作正常,但今天我正在改变一张表,它开始出现错误。我正在使用 InnoDB 格式。

当我创建表或更改表时,出现此错误:

#1041 - 内存不足;检查 mysqld 或其他进程是否使用了所有可用内存;如果没有,您可能必须使用 'ulimit' 来允许 mysqld 使用更多内存,或者您可以添加更多交换

我该如何解决?

Rol*_*DBA 6

问题#1

你的主要问题是至少有 10000 张桌子

这是我看到的问题

RDS 实例全是 InnoDB

如果您有 10000 个 InnoDB 表,有多少文件句柄打开?

  • 对于一个文件句柄.frm文件
  • 对于一个文件句柄.ibd文件

这将是最多 20000 个打开的文件句柄

RDS 实例全是 MyISAM

如果您有 10000 个 MyISAM 表,有多少文件句柄打开?

  • 对于一个文件句柄.frm文件
  • 对于一个文件句柄.MYD文件
  • 对于一个文件句柄.MYI文件

这将是最多 30000 个打开的文件句柄

问题#2

您正在使用m1.medium. 那只有 3.75 GB RAM。

问题#3

由于要维护的元数据量,拥有 10000 个表可能会占用大量内存

查看我关于 INFORMATION_SCHEMA 内存消耗的旧帖子

问题#4

您的生产服务器可能有太多处于休眠状态但消耗内存的打开的数据库连接(请参阅我的帖子打开和关闭数据库连接的成本如何?

分析

您的问题可能只是在您尝试创建表(需要 2-3 个文件句柄)或更改表(需要 2-3 个文件句柄)时打开的表过多。我已经看到这种情况发生在我试图创建一个分区表并且用完文件句柄时。我在我的旧帖子中写过这个问题 对大型数据库表进行分区可能涉及哪些风险?我在操作系统(裸机服务器)上提出了 ULIMIT 来解决它。我知道更改 ULIMIT 对您没有帮助,因为您在 RDS 中。

建议

只需运行

mysql> FLUSH TABLES;
Run Code Online (Sandbox Code Playgroud)

它将关闭所有具有打开文件句柄的表。

如果您更喜欢关闭特定的打开表,您可以列出打开的表

mysql> SHOW OPEN TABLES FROM <database>;
Run Code Online (Sandbox Code Playgroud)

然后,您必须像这样显式关闭表

mysql> FLUSH TABLES db1.tb1,db2,tb2,db3.tb3;
Run Code Online (Sandbox Code Playgroud)

运行后FLUSH TABLES;,那么你就可以运行CREATE TABLEALTER TABLE

您可能还需要升级到具有更多 RAM 的其他服务器型号。

您可以减少表的数量,但要归档数据并删除不活动的数据库。这将减少 INFORMATION_SCHEMA 消耗的 RAM。

您还应该关闭所有未被池化的数据库连接。

试一试 !!!