mysql open files
错误信息如下:
..... 150905 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './mytest/t1.frm' (errno: 24) 150905 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './mytest/t2.frm' (errno: 24) ...... 150905 13:10:17 [ERROR] Error in accept: Too many open files ....
注意到, 系统错误代号是 24, 用 perror 来查看一下具体的错误信息是什么:
[root@myplace]# /usr/local/mysql/bin/perror 24 OS error code 24: Too many open files
原来是打开文件太多了, 好办.用sysctl来调整一下就好了:
[root@myplace]# sysctl -w fs.file-max=43621 [root@mypalce]# sysctl -a | grep fs.file-max fs.file-max = 43621
最后, 还有最重要的一点是, 修改 mysqld 的配置文件 my.cnf, 增加如下一行:
open_files_limit = 4096 #根据自己的情况适当调整,系统默认值是 # max_connections*5 或 max_connections + table_cache*2
然后, 以root身份重新启动 mysqld. 在这里, 尽管 my.cnf 中指定的运行用户不是root, 一样可以以root身份来启动mysqld, 否则 open_files_limit 选项无法生效, 因为内核限制了普通用户的最多打开文件数.
目前open file超过limit的问题:
除了socket,binlog, relay log, ibdata, logfile等这些固定需要打开的句柄以外,
剩下的各种存储引擎的数据文件的打开数量,只应该和即时的IO并发请求量有关系,和用户的请求, 压力, 多少张表没有什么关系。
所以,出现的open file太多的问题,属于代码缺陷, 目前集中在Myisam和tukodb引擎:
InnoDB引擎严格按照Innodb_open_files的设置,使用LRU管理open file,不会遇到这个问题。
flush tables,其实没有关闭文件的含义,只是mysiam的handler close接口刚好会尝试关闭MYD,MYI文件, 这个操作对InnoDB表并没有什么卵用。
分区表过多,也是属于myisam表的缺陷,分区多少也应该和open file数量没什么关系。
如何查看mysqld进程打开的文件数?
假设pid = 26206
ls /proc/26206/fd | wc -l
在MySQL中,有几个地方会存在文件描述符限制:
1、在Server层,整个mysqld实例打开文件总数超过用户进程级的文件数限制,需要检查内核 fs.file-max 限制、进程级限制 ulimit -n 及MySQL中的 open-files-limit 选项,是否有某一个超限了。任何一个条件超限了,就会抛出错误。 2、虽然Server层总文件数没有超,但InnoDB层也有限制,所有InnoDB相关文件打开总数不能超过 innodb-open-files 选项限制。否则的话,会先把最早打开的InnoDB文件描述符关闭,才能打开新的文件,但不会抛出错误,只有告警信息。
相应地,如果提示超出限制,则可以使用下面方法提高上限:
1、首先,提高内核级总的限制。执行:sysctl -w fs.file-max=3264018;2、其次,提高内核对用户进程级的打开文件数限制。执行:ulimit -n 204800;3、最后,适当提高MySQL层的几个参数:open-files-limit、innodb-open-files、table-open-cache、table-definition-cache。
1、open-files-limit
它限制了mysqld进程可持有的最大打开文件数,相当于是一个小区的总电闸,一旦超限,小区里所有住户都得停电。
5.6.7(含)以前,默认值0,最大和OS内核限制有关;
5.6.8(含)以后,默认值会自动计算,最大和OS内核限制有关。
在5.6.8及以后,其自动计算的几个限制规则见下,哪个计算结果最大就以哪个为上限:
1) 10 + max_connections + (table_open_cache * 2) 2) max_connections * 5 3) open_files_limit value specified at startup, 5000 if none
2、innodb-open-files
限制InnoDB引擎中表空间文件最大打开的数量,相当于自己家中电箱里的某个电路保险,该电路短路的话,会自动跳闸,而不会影响其他电路,去掉短路源后重新按上去就可以使用。
其值最低20,默认400,只计算了包含ibdata*、ib_logfile*、*.ibd 等三类文件,redo log不计算在内,5.6以后可独立undo log,我还未进行测试,应该也不会被计算在内,有兴趣的朋友可验证下。
3、table-definition-cache
该cache用于缓存 .frm 文件,该选项也预示着 .frm 文件同时可打开最大数量。
5.6.7 以前默认值400;
5.6.7 之后是自动计算的,且最低为400,自动计算公式:400 + (table-open-cache / 2)。
对InnoDB而言,该选项只是软性限制,如果超过限制了,则会根据LRU原则,把旧的条目删除,加入新的条目。
此外,innodb-open-files 也控制着最大可打开的表数量,和 table-definition-cache 都起到限制作用,以其中较大的为准。如果没配置限制,则通常选择 table-definition-cache 作为上限,因为它的默认值是 200,比较大。
4、table-open-cache
该cache用于缓存各种所有数据表文件描述符。
5.6.7 以前,默认值400,范围:1 – 524288;
5.6.8 – 5.6.11,默认值2000,范围:1 – 524288;
5.6.12以后,默认值2000(且能自动计算),范围:1 – 524288。
补充说明1:关于如何计算表文件描述符的建议:
table-open-cache 通常和 max-connections 有关系,建议设置为 max_connections * N,N的值为平均每个查询中可能总共会用到的表数量,同时也要兼顾可能会产生临时表。
补充说明2:MySQL会在下列几种情况把表从table cache中删掉:
1、table cache已满,并且正要打开一个新表时; 2、table cache中的条目数超过 table_open_cache 设定值,并且有某些表已经长时间未访问了;3、执行刷新表操作时,例如执行 FLUSH TABLES,或者 mysqladmin flush-tables 或 mysqladmin refresh
补充说明3:MySQL采用下述方法来分配table cache:
1、当前没在用的表会被释放掉,从最近最少使用的表开始;
2、当要打开一个新表,当前的cache也满了且无法释放任何一个表时,table cache会临时加大,临时加大的table cache中的表不用了之后,会被立刻释放掉。
转载于:https://www.cnblogs.com/yuyue2014/p/4783553.html
mysql open files相关推荐
- mysql header files_编译安装php Cannot find MySQL header files under /usr/include/mysql.
编译php-5.5-6的mysql支持,出现Cannot find MySQL header files under /usr/include/mysql. Note that the MySQL c ...
- mysql include files_安装sphinx出现错误ERROR: cannot find MySQL include files.
安装sphinx出现错误ERROR: cannot find MySQL include files. 发布时间:2011-10-20 11:29:59来源:红联作者:like7419 今天在配置sp ...
- 编译php时提示“Cannot find MySQL header files”的解决方法
由于系统中被别人已经用rpm包安装过mysql了 在编译php时参数如下: /configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/ap ...
- Linux(centOS)手动安装Apache+MySQL+PHP+Memcached+Nginx原创无错版
最后更新时间:2012.3.21 =================== 第一步:Apache安装(已更新到2.2.22) =================== 下载 去 http://www.ap ...
- Ansible批量安装mysql数据
1.构建安装目录 mkdir -p /ansible/roles/mysql/{defaults,files,handlers,meta,tasks,templates,vars} defaults ...
- lnmp mysql 哪个好_lamp与lnmp的选择
安装 PHP 5.4.3 报 configure error xml2-config notfound. please check your libxml2 installation 错误 检查是否安 ...
- centos7 systemctl 管理 mysql
centos 7 开始使用systemctl 管理服务 服务脚本目录 /etc/systemd/system/mysql.service 脚本如下: # # Simple MySQL systemd ...
- ubuntu 安装nginx,php,mysql。常见错误解决
2019独角兽企业重金招聘Python工程师标准>>> sudo apt-get install -y libpcre3 libpcre3-dev zlib1g-dev ./conf ...
- linux mysql详解,Linux 下mysql安装使用详解
一.检查旧版本,rpm 完全卸载 rpm -qa |grep mysql 查询,将相关包卸载 find / -name mysql 查询, 相关mysql目录,文件统统卸载 /etc/my. ...
- cve -2016-6663 mysql 本地提权
0x01 漏洞原文 翻译水平不高求轻喷 感觉作者在写文章的时候有些地方描述的也不是特别清楚,不过结合poc可以清晰理解漏洞利用过程 0x04漏洞利用过程总结给出了清晰的漏洞利用过程,结合poc食用效果 ...
最新文章
- 收藏:用DE-9IM判断二维空间位置关系
- 系统集成项目管理工程师-项目人力资源管理笔记
- oracle数据库切换教程,oracle 11gR2 物理备用数据库搭建及切换
- 打印控件---引用网友推荐
- Scrapy中的yield使用
- js与html编码不同,js与html中unicode编码的使用
- 求最大公约数——欧几里得算法(JAVA)
- c++ strlen 使用
- 第七章 Git操作 7.1利用gitee提交代码
- 机房收费系统个人重构—图(文档)
- 【MarkDown】基础语法
- 【数模之数据分析-2】
- SDU程序设计思维Week5-作业 B-TT's Magic Cat
- 华为员工工资曝光:入职12年月薪31万,小编我瑟瑟发抖
- 年轻不要停止奋斗的脚步
- 产品的理解:TOC、TOB、TOG
- wireshark 安装与使用
- 带属性随机游走的图循环网络
- 乌班图mysql的安装
- php漏洞检测修复,PHPStudy漏洞自查与修复指导
热门文章
- VirtualBox一类系统只能出现一个?
- 商品包含资源和劳动两部分内容
- C向Python正确传递数组的代码
- c++数组排序_为什么?为什么?Java处理排序后的数组比没有排序的快?想过没有?
- 什么工作经常出差_职场妈妈困扰: 经常出差, 工作孩子该怎么选择?
- 竞赛成绩管理系统用c语言编写,学生成绩管理系统代码(c语言编写).doc
- mysql查询行数据_MySQL数据库~~~~~查询行(文件的内容)
- jspx格式手机打开_zip格式的文件怎么打开,手机和电脑的操作方法一样吗?
- 中jsp加载不出来layui_Maven+JSP+SSM+Mysql实现的学生选课系统
- Sysinternals Suite