MySQL資料庫寫入異常,主庫記憶體溢位,擴容+清理buff/cach!很開門

有点儿意思發表於2024-12-06

MySQL資料庫寫入異常,主庫記憶體溢位,擴容+清理buff/cach!很開門

最近資料出現了兩次寫入異常報錯如下:org.springframework,jdbc.UncategorizedsQlException: PreparedstatementCallback; uncategzed 50LExcention [sql語句] The MysOl server is running with the --read-only option so it cannot execute this......

第一次不知道是什麼原因,DM咔咔一段操作後就好了。第二次反饋是主資料庫記憶體溢位,導致的寫入異常。專案生產上的業務所有寫入都無法操作,大概持續10多分鐘,DM幫忙處理,但是擴容需要找領導申請,DM先幫忙清理了buff/cache的東西,釋放了18G。其實從字面上看buff/cache就是讀、寫的快取。故障是其他同事在處理的,寫此文章只是學習瞭解下buff/cache


登入到資料庫部署的機器上

```Java
free    以KB為單位顯示
free -h 以GB為單位顯示 

第一列
Mem 記憶體的使用資訊
Swap 交換空間的使用資訊
第一行
total 系統總的可用實體記憶體大小
used 已被使用的實體記憶體大小
free 還有多少實體記憶體可用
shared 被共享使用的實體記憶體大小
buff/cache 被 buffer 和 cache 使用的實體記憶體大小
available 還可以被 *應用程式* 使用的實體記憶體大小

free是真正尚未被使用的實體記憶體大小,available是系統任務應用程式可用的實體記憶體大小

buff/caahe

buff:針對磁碟寫操作的最佳化,當資料到達時,不會立即寫入磁碟,而是先寫入buff緩衝區,當達到寫入磁碟的條件時再統一寫入磁碟。

cache:針磁碟讀操作的最佳化,當讀取資料時,不會立即從磁碟上讀,而是先從cache找,在cache中,直接返回資料,cache中沒有再從磁碟讀資料,減少與磁碟的互動,提高效能。

mysql內部的緩衝池機制

InnoDB 儲存引擎管理自己的快取機制,稱為 緩衝池。用於快取表資料、索引頁、插入緩衝等內容。緩衝池大小透過引數 innodb_buffer_pool_size配置,過小會依賴作業系統的 buff/cache。當 MySQL 和作業系統都需要記憶體時,記憶體可能會成為瓶頸。如果 MySQL 配置了較大的緩衝池(innodb_buffer_pool_size),作業系統的 buff/cache 可能減少;反之亦然。

下面這段話摘自mysql8.4-緩衝池-官方文件

緩衝池是主記憶體中的一個區域,用於 InnoDB快取訪問的表和索引資料。緩衝池允許直接從記憶體訪問常用資料,從而加快處理速度。在專用伺服器上,通常最多有 80% 的實體記憶體分配給緩衝池。
為了提高大容量讀取操作的效率,緩衝池被劃分為可容納多行的頁面。為了提高快取管理的效率,緩衝池被實現為頁面的連結列表;使用最近最少使用 (LRU) 演算法的變體將很少使用的資料從快取中淘汰。
知道如何利用緩衝池將經常訪問的資料儲存在記憶體中是 MySQL 調優的一個重要方面。

附上mysql8.4版本的開發文件網址:https://dev.mysql.com/doc/

Buffer Pool 直接對應 MySQL 內部的 buff,這是 InnoDB 引擎用來快取資料頁和索引頁的記憶體區域。

Operating System Cache 對應作業系統層面的 cache,這是作業系統為檔案 I/O 提供的快取機制,但在 InnoDB 中透過O_DIRECT 繞過作業系統快取以最佳化效能。

相關文章