MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门
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 绕过操作系统缓存以优化性能。