我正在使用Amazon db.m1.medium实例。它至少有40-50个数据库和至少10k表.在过去的一年里,它运行得很好,但是今天我改变了一个表,它开始出错。我正在使用InnoDB格式。
当我创建一个表或修改一个表时,我会得到以下错误:
#1041 -内存不足;检查mysqld或其他进程是否使用所有可用内存;如果没有,则可能必须使用“ulimit”来允许mysqld使用更多内存,或者可以添加更多交换空间。
我该怎么解决这个问题?
发布于 2015-11-13 18:07:14
你的主要问题是至少有10000张桌子
这是我看到的问题
。
如果您有10000个InnoDB表,那么打开多少个文件句柄?
.frm文件的一个文件句柄.ibd文件的一个文件句柄这将是最多20000打开的文件句柄。
。
如果您有10000个MyISAM表,那么打开多少个文件句柄?
.frm文件的一个文件句柄.MYD文件的一个文件句柄.MYI文件的一个文件句柄这将是最多30000打开的文件句柄。
您正在使用m1.medium。它只有3.75GB内存。
拥有10000个表可能非常占用内存,因为要维护的元数据数量很大。
请参阅我以前关于INFORMATION_SCHEMA内存消耗的文章
Apr 22, 2014:非活动的MySQL数据库是否占用内存?Apr 21, 2014:添加新表--内存使用量增加您的Production可能有太多的开放DB连接,它们处于休眠状态,但占用内存(请参阅我发布的打开和关闭DB连接的成本有多高?)
您的问题可能只是在尝试创建一个表(需要2-3个文件句柄)或一个alter (需要2-3个文件句柄)时有太多打开的表。我看到这种情况发生在我试图创建一个分区表并耗尽文件句柄的过程中。我在我以前的帖子对大型数据库表进行分区可能涉及哪些风险?中写到了这一点,我在OS (裸金属服务器)上提出了ULIMIT来解决这个问题。我知道改变ULIMIT无助于你,因为你在RDS。
简单地跑
mysql> FLUSH TABLES;它将关闭所有具有打开文件句柄的表。
如果您希望关闭特定的打开表,则可以将打开的表列出
mysql> SHOW OPEN TABLES FROM <database>;然后,您必须像下面这样显式地关闭表
mysql> FLUSH TABLES db1.tb1,db2,tb2,db3.tb3;运行FLUSH TABLES;之后,您可以运行CREATE TABLE或ALTER TABLE。
您还可能需要升级到另一个具有更多RAM的服务器模型。
您可以减少表的数量,但可以存档数据和删除非活动数据库。这将减少用于INFORMATION_SCHEMA的内存消耗。
您还应该关闭所有未被池化的DB连接。
发布于 2021-08-05 11:08:59
在这里张贴我的经验,因为它是相同的信息,并在搜索结果的顶部页搜索该消息。
在Windows服务器上看到有大量内存可用的[ERROR] Failed to write to mysql.slow_log: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space。MySQL 5.7.20-log x64社区
运行mysql_upgrade.exe --upgrade-system-tables -h 127.0.0.1 -u root -p给了mysql_upgrade: [ERROR] 13: Can't get stat of '.\mysql\slow_log.CSV' (Errcode: 2 - No such file or directory)
因为我的slow_query_log_file在其他地方,这让人很困惑。在.\mysql\slow_log.CSV创建空文件之后,到目前为止,一切看起来都很好。
如果有任何可能显示丢失文件的消息,我还没有查看源代码,我现在要说的是,在这种情况下,有可能出现错误消息。
https://dba.stackexchange.com/questions/120999
复制相似问题