Mysql

#1041 - mysql 中的記憶體不足問題

  • August 5, 2021

我正在使用 Amazon RDSdb.m1.medium實例。它至少有 40-50 個數據庫和至少 10k 個表。過去一年它工作正常,但今天我正在改變一張桌子它開始出錯。我正在使用 InnoDB 格式。

當我創建表或更改表時,我收到此錯誤:

#1041 - 記憶體不足;檢查 mysqld 或其他程序是否使用了所有可用記憶體;如果沒有,您可能必須使用 ‘ulimit’ 以允許 mysqld 使用更多記憶體,或者您可以添加更多交換

我該如何解決這個問題?

問題 #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;

它將關閉所有具有打開文件句柄的表。

如果您希望關閉特定的打開表,您可以列出打開的表

mysql> SHOW OPEN TABLES FROM <database>;

然後,您必須像這樣顯式關閉表

mysql> FLUSH TABLES db1.tb1,db2,tb2,db3.tb3;

跑完之後就FLUSH TABLES;可以跑了。CREATE TABLE``ALTER TABLE

您可能還需要升級到另一個具有更多 RAM 的伺服器型號。

您可以減少表的數量,但歸檔數據並刪除不活動的數據庫。這將減少 INFORMATION_SCHEMA 消耗的 RAM。

您還應該關閉所有未匯集的數據庫連接。

試一試 !!!

在這裡發布我的經驗,因為它是相同的消息,並且在搜尋該消息時在搜尋結果中的首頁

[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 spaceWindows 伺服器上看到有大量可用的 RAM。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