当前位置:首页 > 内存 > 正文

mysql数据库内存设置

  • 内存
  • 2024-09-02 19:01:38
  • 7128

一、mysql数据库outofmemory内存溢出如果数据库数据量太大,查询时没有条件语句,就会出现内存溢出。解决方法是添加查询条件或使用分页查询。


二、启动mysql服务器报错

一般情况下,MySQL启动错误很容易解决,但今天我们要讲的是一种不寻常的情况。我有一个服务器并在安装mysql后启动它。启动报错如下:

有同学会说,老兄,你是不是把bufferpool设置太大了?在96G内存中。这清楚地表明内存无法分配。如果是这样我就不会在这里分享了,哈哈。

我的服务器内存是128G,如下图:

服务器内存使用情况:

然后问题是,既然还剩下这么多内存,为什么会请求无法分配内存呢??。对于童鞋,你有什么看法呢?

1你首先想到的是内存的某些部分是否损坏了?于是我的运维同学检查了一下,给我反馈硬件正常。

2我重新检查了mysql的配置参数,没有发现问题。

3将文件复制到另一台机器上,另一台服务器可以正常启动(两台机器的硬件配置相同)。

所以如果排除了硬件问题和mysql配置问题,那么剩下的就只剩下操作系统内核参数配置了。于是我对比了两台服务器,最后发现有一个内核参数不稳定。

复制代码如下:

mmit_memory

mysql启动正常服务器,将参数值改为0,而mysql启动错误服务器应该值为2。

那么问题来了,这个参数到底是什么?居然导致mysql无法分配内存,最终无法启动。查了资料才知道mmit_memory是什么。

mmit_memory

默认值为:0
从内核文档来看,该参数有三个值,分别是:
0:当用户当请求更多内存空间时,内核会尝试估计剩余的可用内存。
1:当该参数的值设置为1时,内核允许过量的内存使用,直到被使用为止,主要用于科学计算。
2:当该参数的值设置为2时,内核会使用永不溢出内存的算法,即整个系统内存地址空间不能超过swap+RAM值的50%。


mmit_ratio
默认值为:50


该参数值仅在mmit_memory=2生效时可用。

那么我们看看总内存地址不能超过多少。其实直接就能看出来。

[root@yayundeng3306]#cat/proc/meminfo|grep-icommit
CommitLimit:70144396kB
Comfilled_AS:135196kB
[root@yayundeng3306]#

你看一下就知道70G上是什么样子了。那么这是如何计算的呢?这就是上面提到的公式。Swap+RAM值的50%,50%参数设置为overcommit_ratio。

总虚拟内存=可用物理内存×百分比+交换分区

[root@yayundeng3306]#cat/proc/meminfo|grepMemTotal
MemTotal:132096808kB
[root@yayundeng3306]#
[root@yayundeng3306]#free-k
缓存使用的空闲共享缓冲区总数
Mem:1320968081583944130512864010222-ca/buffer<3:1440484130656324
Rock:409599204095992
[root@yayundeng3306]#cat/proc/sys/vm/overcommit_ratio
50
[root@06]eng/p>

总虚拟内存=132096808*50%+4095992=70144396kB

那么最终结果就是缓冲池不能超过70144396kB-135196kB=70009200KB=66G。事实上,经过测试,bufferpool只能设置为57G。

最后看一下虚拟内存总量:

CommitLimit:最大可用虚拟内存

Comfilled_AS:已用虚拟内存

[root@yayundeng3306]#cat/proc/meminfo|grep-icommit
CommitLimit:70144396kB
Comfilled_AS:65539208kB

然后如果参数kernelvmOvercommit_memory重置为默认值0,则不受限制。

复制以下代码:

/proc/sys/vm/overcommit_memory

参考资料:


三、如何优化mysql内存占用高导致宕机1、首先通过任务管理器对进程进行排序,找到占用内存较大的程序进程。通常占用大量内存的进程包括W3WP、sqlserver和。
2.站点进程w3wp您可以从cmd命令行使用iisapp命令来查看哪些网站占用了大量容量。内存量。您可以通过设置回收时间、最大内存使用量或共享进程池来减少内存使用量。但为了保证您网站的访问质量,我们建议您升级到更高的型号来解决该问题。;
3.这可以通过使用数据库的企业管理器(也可以通过数据库sqlserver)设置最大内存使用量来解决。但是,如果你的网站程序需要占用大量内存,就会导致页面错误、无法运行等问题。设置后即可打开。
本身占用大量虚拟内存,因此禁用mysql数据库可能会导致其挂起。