具有大量數據庫和大量表的 MySQL 實例的最佳配置是什麼?
我有一個 MySQL 數據庫實例,其中包含 3000 多個數據庫。每個數據庫包含 200 多個表。所有這些數據庫的總數據約為 100 GB。我正在使用具有 4 GB RAM 的 Windows Server 2012R2 作業系統。伺服器系統的 RAM 記憶體使用率始終顯示很高。所以我嘗試重新啟動系統並且重新啟動不起作用。顯示重啟很長時間沒有重啟。當我檢查日誌時,我了解到存在記憶體問題。具有上述架構的 MySQL 的最佳配置是什麼?我需要做些什麼才能使這項工作在未來沒有失敗?
$$ Warning $$InnoDB:很難在緩衝池中找到空閒塊(1486 次搜尋迭代)!1486 次刷新頁面的嘗試失敗!考慮增加緩衝池大小。在您的 Unix 版本中,fsync 也可能非常慢,或者完全凍結在作業系統核心中。然後升級到更新版本的作業系統可能會有所幫助。查看下面診斷資訊中的 fsync 數量。待刷新(fsync)日誌:0;緩衝池:0。26099 個 OS 文件讀取,1 個 OS 文件寫入,1 個 OS fsync。啟動 InnoDB Monitor 以將進一步的診斷資訊列印到標準輸出。
您需要更多 RAM 是有原因的…… INFORMATION_SCHEMA 數據庫。
必須在其中填充什麼???讓我們只選擇兩個表作為範例:
想像一下(表中的所有列 + 表的數量)乘以 3000 ???
元數據需要大量 RAM 才能將它們映射出來。更不用說映射索引、約束、視圖以及許多其他數據庫對象了。
我的雇主曾經擁有一個 Galera 集群,其中包含 11000 個數據庫和近 200 萬個表。
- 啟動 mysqld 和 Galera 組件至少需要 24 小時。
- 崩潰恢復使這種噩夢般的場景變得更糟
請參閱我的舊文章,其中討論了 INFORFMATION_SCHEMA 的記憶體消耗
你可以做什麼
請執行以下操作:
- 在另一台伺服器上創建一個新的 MySQL 實例。
- 當 MySQL 實例為空時,記錄伺服器有多少 RAM 可用。
- 在該實例中創建所有數據庫和表,但不載入任何數據。
- 創建數據庫和表後,記錄伺服器有多少可用 RAM。
- 關閉mysql
- 等1-2分鐘
- 啟動mysql
- 記錄伺服器有多少 RAM 可用以及啟動備份需要多長時間。
這將給出一個大致的概念(或大概的數字)您需要添加多少 RAM。
無論您選擇為 RAM 增加多少數字,請加倍!!!
增加 RAM 不會減少崩潰恢復時間。另外,不要忘記數據庫連接也需要記憶體(打開和關閉數據庫連接的成本是多少?)
所以你有 100GB 的數據保存在3000個數據庫中?
這些數據庫中的每一個都非常小(我猜每個大約 30MB)。
我會認真建議您需要重新考慮以這種方式分割/隔離數據的願望。這幾乎肯定不是做事的最佳方式。
您正在嘗試執行只有4GB RAM的 Windows Server ? 我很驚訝它甚至啟動了!
好的,(剛剛檢查過)我們在雷德蒙德的朋友推薦“至少 2GB”的 RAM,但是這台機器所能做的就是執行作業系統本身並用它的風扇讓辦公室保持溫暖一點。
如果您想在其上執行任何其他軟體,那麼您需要更多的記憶體,並且對於 DBMS,一般來說越多越好。