MySQL常见问题及处理方案

本文出自:http://www.stubbornwolf.cn

 

本文为作者在工作中遇到过的MySQL错误,并给出一些解决方案以供参考

 

Q1、[ERROR] [FATAL] InnoDB: pthread_create returned 11

完整的错误日志内容如下:

这个错误原因主要是因为线程创建失败,要么是创建的线程数超出硬件资源的允许值,要么是该线程占用的内存大小超过系统的限制值。要解决前一个个问题,我们得先知道我们的硬件环境到底能支持多少线程,要知道能支持多少线程就得先知道系统默认栈的大小,因为number of threads(线程数) = total virtual memory(总内存大小) / (stack size*1024*1024)(栈大小),这个公式是前提,不管其他文件对线程最大值设定为多大(最大线程小于可用线程数才起作用,大于可用线程数实际是无效的,仍要受可用线程数控制)。要解决后一个问题,就需要知道线程所能使用的系统设定的栈的大小,查看栈大小:

这是CentOS 7.2默认栈大小,是8M,所以能创建的线程数你就自己算一下吧。然后,这个线程数得减去其他程序占用的线程,才是你能给mysql分配的线程数。那么,有3个解决方法:

1、调整mysql的配置参数,减少线程数,将max_threads改成你能承受的大小(没实践过,不推荐)。

2、调整系统默认的栈大小,你可以减少它以获得更多的线程,也可以增加它以使每个线程获取更多的内存资源,设置方法(常用方法)

3、设置虚拟内存,这是强制增加系统资源的方法,很少有人用,而且估计性能也不好,除非你用固态硬盘(非主流)

建议将栈的默认大小设置为umlimited,并写入/etc/profile里以确保永久生效。

有关ulimit命令的更多信息请参考:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html

 

Q2、ERROR 1105 (HY000): Unknown error

MySQL服务运行时执行mysql -uroot -pXXXX -e “flush logs”刷新日志时,报错:

检查你日志文件所在目录的权限(日志路径在my.cnf里配置,如果你没有配置,可以用mysql -uroot -pXXXX -e “show variables like ‘%log%'”查看系统的默认配置,解决方法2个:

1、给该日志文件所在目录的权限改为777(不推荐)

2、改该日志文件所在目录的用户和用户组为mysql(常用)

权限修改完毕后再刷新日志即可

 

Q3、mysql连接出现大量TIEM_WAIT

起因:web服务器连接出现time out,查看web服务器网络连接发现有大量的TIME_WAIT,考虑是否是mysql服务器延误造成,进而查看mysql服务器发现mysql连接出现大量的TIME_WAIT

解决办法:

1、系统内核参数调优(web、mysql服务器都需要)

在/etc/sysctl.conf文件末尾加入以下内容:

选项解释:

net.ipv4.tcp_syncookies = 1 //表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭.
net.ipv4.tcp_tw_reuse = 1 //表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭.
net.ipv4.tcp_tw_recycle = 1 //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭.
net.ipv4.tcp_fin_timeout   //修改系統默认TIMEOUT时间.

2、mysql参数优化

在/etc/my.cnf内加入以下内容:

加快mysql处理速度,重启mysql后生效

当然以上只是优化手段,并不能解决根本原因,应该考虑的其他方面包括:网络恶意攻击、系统硬件资源限制、配置参数的限制、程序本身的疏漏等等

 

陆续更新…

0 条评论

发表我的观点

取消

  • 昵称 *
  • 邮箱 *
  • 网址
相关文章
  • * 暂无相关文章
  • 登录

    忘记密码 ?

    切换登录

    注册