#1041 - mysql 中的記憶體不足問題
我正在使用 Amazon RDS
db.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 記憶體消耗的舊文章
Apr 22, 2014
:不活動的 MySQL 數據庫會消耗記憶體嗎?Apr 21, 2014
:添加新表——記憶體使用量增加問題 #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 space
在Windows 伺服器上看到有大量可用的 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
到目前為止創建空文件後,一切看起來都很好。如果有任何可能顯示此消息以失去文件,我還沒有調查來源,我現在要說的是,在這種情況下可能存在顯示錯誤消息的錯誤。