欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

mysql异常Initializingbufferpool, size = 128.0M 有大用

背景

今天购买的云服务器数据库一直异常,异常邮件快把邮箱撑爆了,连上SSH,

 
(1)查看错误日志存放位置 

vim /etc/my.conf 

blob.png

(2)cd /var/log

(3)打开错误日志发现异常信息

2017-03-08 13:21:21 11097 [Note] InnoDB: Initializing buffer pool,
             size = 128.0MInnoDB: mmap(137363456 bytes) failed; errno 12
2017-03-08 13:21:21 11097 [ERROR] InnoDB: Cannot allocate memory for the 
             buffer pool
2017-03-08 13:21:21 11097 [ERROR] Plugin 'InnoDB' init function returned error.
2017-03-08 13:21:21 11097 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE 
             failed.
2017-03-08 13:21:21 11097 [ERROR] Unknown/unsupported storage engine: InnoDB
2017-03-08 13:21:21 11097 [ERROR] Aborting

发现问题:初始化InnoDB buffer pool的时候把内存挤爆了

(4)free 命令查看内存情况,结果为

             total       used       free     shared    buffers     cached
  Mem:       1920740    1904516     20224          0      80180     481620
  -/+ buffers/cache:    1022716     898024
  Swap:       0         0    0

问题找到,果然是内存不够用了

思路

解决方案有3种 
1增加内存 
2增加虚拟内存SWAP 
3减少InnoDB buffer pool的内存占用

解决

1方案,要钱,不想给 
2可行, 
3可行

2方案开工, 
SWAP是什么

在开工之前,我们需要知道的是计算机对内存分为物理内存与虚拟内存(注意虚拟内存和虚拟地址空间的区别)。物理内存就是计算机的实际内存大小,由RAM芯片组成的。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。当程序运行起来由操作系统做具体虚拟内存到物理内存的替换和加载(相应的页与段的虚拟内存管理)。这里的虚拟内存即所谓的swap。 
当用户提交程序,然后产生进程,在机器上运行。机器会判断当前物理内存是否还有空闲允许进程调入内存运行,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。根据这种换入和换出,实现了内存的循环利用,让用户感觉不到内存的限制。从这也可以看出swap扮演了一个非常重要的角色,就是暂存被换出的进程。 
内存与swap之间是按照内存页为单位来交换数据的,一般Linux中页的大小设置为4kb。而内存与磁盘则是按照块来交换数据的。

第一步:创建一个大小为256M的文件:

dd if=/dev/zero of=/swapfile bs=1024 count=262144

第二步:把这个文件变成swap文件:

mkswap /swapfile

第三步:启用这个swap文件:

swapon /swapfile

第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:

/swapfile    swap    swap    default   0 0

3方案开工 
修改mysql配置文件

vim /etc/my.conf

在mysqld字段后增加一行

innodb_buffer_pool_size = 64M

此次异常事件可以告一段落了·····


来自  http://www.like666.com/2017/03/10/mysql%E5%BC%82%E5%B8%B8initializingbufferpool-size-128-0m/

普通分类: