首页 >数据库 >mysql教程 >详解MySQL数据库资源不足的异常错误_MySQL

详解MySQL数据库资源不足的异常错误_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB原创
2016-06-01 14:02:081022浏览

前几天,在管理系统的时候遇到一个奇怪的问题, 今天才有机会安装好MySQL环境来重现此问题,由于不是最原始的环境, 所以未必能够完全重现, 我只能努力重现关键问题了.. 我觉得此问题有点特别, 故在此大概的回想下当时的情景..

工作时, 执行了一个su – mysql 的命令, 遇到了下面这样一个错误..

<ol class="dp-xml">
<li class="alt"><span><span>[root@dbmain ~]# su - mysql   </span></span></li>
<li><span>su: cannot set user id: Resource temporarily unavailable  </span></li>
</ol>

这是一个Shell中由于资源不足引起的问题, 当时下意识的先运行ulimit,看看ulimit的基本限制.

<ol class="dp-xml">
<li class="alt"><span><span>[root@dbmain ~]# ulimit -a   </span></span></li>
<li><span>core file size          (blocks, -c) 0   </span></li>
<li class="alt"><span>data seg size           (kbytes, -d) unlimited   </span></li>
<li><span>scheduling priority             (-e) 0   </span></li>
<li class="alt"><span>file size               (blocks, -f) unlimited   </span></li>
<li><span>pending signals                 (-i) 25600   </span></li>
<li class="alt"><span>max locked memory       (kbytes, -l) 32   </span></li>
<li><span>max memory size         (kbytes, -m) unlimited   </span></li>
<li class="alt"><span>open files                      (-n) 1024   </span></li>
<li><span>pipe size            (512 bytes, -p) 8   </span></li>
<li class="alt"><span>POSIX message queues     (bytes, -q) 819200   </span></li>
<li><span>real-time priority              (-r) 0   </span></li>
<li class="alt"><span>stack size              (kbytes, -s) 10240   </span></li>
<li><span>cpu time               (seconds, -t) unlimited   </span></li>
<li class="alt"><span>max user processes              (-u) 25600   </span></li>
<li><span>virtual memory          (kbytes, -v) unlimited   </span></li>
<li class="alt"><span>file locks                      (-x) unlimited </span></li>
</ol>

又看了看,/etc/security/limits.conf

<ol class="dp-xml">
<li class="alt"><span><span>oracle              soft    nproc   2047   </span></span></li>
<li><span>oracle              hard    nproc   16384   </span></li>
<li class="alt"><span>oracle              soft    nofile  1024   </span></li>
<li><span>oracle              hard    nofile  65536   </span></li>
<li class="alt"><span>oracle              soft    memlock        12582912   </span></li>
<li><span>oracle              hard   memlock        12582912   </span></li>
<li class="alt"><span>grid              soft    nproc   2047   </span></li>
<li><span>grid              hard    nproc   16384   </span></li>
<li class="alt"><span>grid              soft    nofile  1024   </span></li>
<li><span>grid              hard    nofile  65536   </span></li>
<li class="alt"><span>grid              soft    memlock        12582912   </span></li>
<li><span>grid              hard   memlock        12582912   </span></li>
<li class="alt"><span>mysql             soft    nproc  500   </span></li>
<li><span>mysql             hard    nproc  500   </span></li>
<li class="alt"><span>mysql             soft    nofile  1024   </span></li>
<li><span>mysql             hard    nofile  65536   </span></li>
<li class="alt"><span>mysql             soft    memlock  12582912   </span></li>
<li><span>mysql             hard    memlock  12582912 </span></li>
</ol>

经过分析,怀疑也只有process/file这两个出现资源紧张的概率比较大.. 因此就先ps -ef 看系统中该用户的进程数量..

<ol class="dp-xml">
<li class="alt"><span><span>[root@dbmain ~]# ps -ef | grep mysql   </span></span></li>
<li>
<span>root      4733     1  0 10:30 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe </span><span class="attribute"><font color="#ff0000">--datadir</font></span><span>=/var/lib/mysql </span><span class="attribute"><font color="#ff0000">--pid-file</font></span><span>=/var/lib/mysql/dbmain.pid   </span>
</li>
<li class="alt">
<span>mysql     4788  4733  0 10:30 ?        00:00:04 /usr/sbin/mysqld </span><span class="attribute"><font color="#ff0000">--basedir</font></span><span>=/ </span><span class="attribute"><font color="#ff0000">--datadir</font></span><span>=/var/lib/mysql </span><span class="attribute"><font color="#ff0000">--user</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">mysql</font></span><span> </span><span class="attribute"><font color="#ff0000">--log-error</font></span><span>=/var/lib/mysql/dbmain.err </span><span class="attribute"><font color="#ff0000">--pid-file</font></span><span>=/var/lib/mysql/dbmain.pid   </span>
</li>
<li><span>root     15171 17507  0 13:26 pts/2    00:00:00 mysql -uroot -p   </span></li>
<li class="alt"><span>root     20792 17163  0 15:30 pts/1    00:00:00 grep mysql </span></li>
</ol>

从这个输出,,我们暂时排除nproc超标的可能性.

由此, 就根据此进程的pid进入其proc目录查看当前打开的文件数量..

发现有大量socket的文件连接.. 但是其数量远远未达到文件数的限制, 由此怀疑可能是MySQL的线程也会消耗掉Linux系统的nproc基数, 因此尝试调整/etc/security/limits.conf文件的nproc参数的值.

发现调整过后, su – mysql 确实可以成功执行了,,后面又将此参数改回, 重新执行su – mysql,,此问题又再次重现..由此确认,,使用MySQL的系统, 在设置MySQL的参数max_connections之外, 还需要考虑设置/etc/security/limits.conf文件的大小, MySQL是线程模式执行的, 其线程数也会被统计在nproc中, 这可能掩盖或造成对此问题的误判..

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn