飞嗨,欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。(本博已于2015.12.6升级到php7,运行环境php7 php-fpm + nginx1.8.0)

问题解决:MYSQL(mariadb) Cannot allocate memory for the buffer pool

Linux lf 9015℃ 0评论

今天早上,360网站监控给我邮箱发了封email,说昨天晚上2:22时起,服务器返回500错误,于是打开blog.feehi.com,wordpress提示:建立数据库连接时出错!这个问题,前两天也遇到过一次,当时有个朋友跟我在一起,我就把mariadb重启一下就解决了…今天,我决定去看一下/var/log/mariadb下的日志。

定位到最后几行,果然有一个FATAL ERROR:Cannot allocate memory for the buffer pool,看来应该是mariadb没有配置好,php程序访问量稍微大一些,分配给mariadb的内存就满了,然后就锁死了,mysql –u root –p竟然也打不开,看来确实是mariadb daemon挂掉了…

Cannot allocate memory for the buffer pool

Cannot allocate memory for the buffer pool

 

Innodb 存储引擎的缓存机制和 MyISAM 的最大区别就在于 Innodb 不仅仅缓存索引,同时还会缓存实际的数据。所以,完全相同的数据库,使用 Innodb 存储引擎可以使用更多的内存来缓存数据库相关的信息,当然前提是要有足够的物理内存。innodb_buffer_pool_size 参数用来设置 Innodb 最主要的 Buffer(Innodb_Buffer_Pool)的大小,也 就是缓存用户表及索引数据的最主要缓存空间,对 Innodb 整体性能影响也最大。这个参数设置成内存的50%-80%,当然具体要结合实际情况而定,考虑别的存储引擎占用的内存,考虑服务器是不是还提供其他服务等等…看来,我的机器之所以宕掉的原因是,系统默认的内存:

default innodb_buffer_pool_size

default innodb_buffer_pool_size

太多了,因为服务器还提供了别的ftp www git svn……,看来内存不足引起的,innodb_buffer_pool_size要改小一些的了。。。改成50M,监测一段时间,看问题还会不会重现,,,此博客未完,是否有效,待验证

innodb_buffer_pool_size=50M

innodb_buffer_pool_size=50M

主要是我的服务器是免费的,很久很久以前,微软刚和世纪互联运营的时候,申请的免费试用,,,云设置中,内存稍微加大一些,撑不了一个月,该月的硬件资源就会被使用光光,好无奈啊!!!

无意中看到的其他一些问题解决办法

A.日志中很多如IP address ‘116.255.155.76’ could not be resolved: Name or service not known…
Mysql DNS反查会致使连接缓慢:mysql在用户建立连接时,会反查该ip的域名,如果没法访问dns服务器,mysql会一直等待网络 超时,在my.cnf加上skip-name-resolve就会跳过反解析了(这条与今天的问题应该无关,看到了就记录一下)ip不反解析成域名,省了向dns服务器查询的时间,连接当然会快一些了

B、问题错误日志:Error: Can’t create a new thread (errno 12)

数据库服务器问题,数据库操作无法创建新线程。一般是有以下3个方面的原因:

1)、MySQL 线程开得太多。

2)、服务器系统内存溢出。

3)、环境软件损坏或系统损坏。

解决办法:
1)进入 phpmyadmin 的 mysql 数据库中的 user 表,对数据库的用户进行编辑,修改 max_connections 的值。适当的改小一点

2)联系服务器管理员检查服务器的内存和系统是否正常,如果服务器内存紧张,请检查一下哪些进程消耗了服务器的内存,同时考      虑是否增加服务器的内存来提高整个系统的负载能力。

3)mysql版本更改为稳定版本

4)优化网站程序的sql等等

    C.操作报错:ERROR 1010 (HY000): Error dropping database

  解决办法: 在做数据库删除时出现这种提示,其原因是在database下面含有自己放进去的文件,譬如*.txt文件或*.sql文件等,只要进去把这个文件删了在执行。

D.4.导出数据很快,导入到新库时却很慢:

MySQL导出的SQL语句在导入时有可能会非常非常慢,经历过导入仅400万条记录,竟用了近2个小时。在导出时合理使用几个参数,可以大大加快导入的速度。

 

-e 使用包括几个VALUES列表的多行INSERT语法;

–max_allowed_packet=XXX 客户端/服务器之间通信的缓存区的最大大小;

–net_buffer_length=XXX TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行

注意:max_allowed_packet和net_buffer_length不能比目标数据库的配置数值大,否则可能出错。

首先确定目标库的参数值

点击(此处)折叠或打开

mysql> show variables like ‘max_allowed_packet';

+——————–+———+

| Variable_name | Value |

+——————–+———+

| max_allowed_packet | 1048576 |

+——————–+———+

1 row in set (0.00 sec)

mysql> show variables like ‘net_buffer_length';

+——————-+——-+

| Variable_name | Value |

+——————-+——-+

| net_buffer_length | 16384 |

+——————-+——-+

1 row in set (0.00 sec)

根据参数值书写mysqldump命令,如:

mysql>mysqldump -uroot -p   数据库名 -e –max_allowed_packet=1048576 -net_buffer_length=16384 > SQL文件

例如:

点击(此处)折叠或打开

mysql> mysqldump -uroot -p xjtrace -e –max_allowed_packet=1048576 –net_buffer_length=16384 >xjtrace_data_`date +%F`.sql

之前2小时才能导入的sql现在几十秒就可以完成了。

 

转载请注明:飞嗨 » 问题解决:MYSQL(mariadb) Cannot allocate memory for the buffer pool

喜欢 (0)or分享 (0)

Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in /www/wwwroot/feehi/blog.feehi.com/wp-content/themes/yusi1.0/comments.php on line 17
发表我的评论
取消评论

表情
粤ICP备15018643号-1