TableCache设置过小造成MyISAM频繁损坏 与 把table_cache适当调小mysql能更快地工作
来源:
前些天说了一下如何修复损坏的MyISAM表,可惜只会修复并不能脱离被动的境地,只有查明了故障原因才会一劳永逸。
如果数据库服务非正常关闭(比如说进程被杀,服务器断电等等),并且此时恰好正在更新MyISAM表,那么发生损坏的概率就比较大。今天我要说的是另一种情况:频繁的打开关闭MyISAM表文件造成MyISAM表损坏。
什么时候会出现频繁的打开关闭MyISAM表文件的情况呢?
先查看当前系统的table_cache设置,它的作用就是缓存表文件描述符,降低打开关闭表的频率,如果这个参数设置得过小,那么很快就会被占满,再有新请求过来的时候,就不得不关闭一些已打开的表以便为新请求腾出空间,从而出现频繁的打开关闭MyISAM表文件的情况:
mysql> show variables like 'table%';
再查看当前系统的打开表的情况:
mysql> show status like 'open%';
有两项关键的结果:Open_tables和Opened_tables,他们的名字类似,其含义的区别在于:
Open_tables:表示当前打开的表数目。
Opened_tables:表示累计已经打开的表数目。
那么如何判断table_cache是否设置合理呢?其判断尺度如下:
如果Opened_tables远大于Open_tables,并且Open_tables很接近table_cache,那么就说明table_cache偏小。
还要注意设置操作系统的参数,因为即便你把table_cache设置得很大,一旦超过了操作系统的限制也没用,可以按如下方法查询当前值:
ulimit -n
设置方法也很简单,比如设置成8k,可以这样:
vi /etc/security/limits.conf
* hard nofile 8192
* soft nofile 8192
这样设定比在/etc/rc.local里设定ulimit -n 8192更合理一些(参考链接)。
MySQL运行稳定后,查看open_files_limit参数:
mysql> show variables like '%open%';
在大量使用MyISAM的环境里,应该保证open_files_limit表类型至少是table_cache的二到三倍,这是因为每个MyISAM表都包括三个文件:一个表定义文件,一个表索引文件,一个表数据文件,详细介绍可以参考文档。而在Innodb的环境里,一个表只有一个文件,明白这些基本知识对解决问题很有帮助。
具体的数据库文件打开情况可以用lsof来查看:
lsof | grep MYI 或者 lsof | grep MYD
可以发现索引文件描述符是客户端共享的,数据文件则不是,你可以这样确认这一点:
lsof | egrep -i 'myd|myi' | awk '{++state[$NF]} END {for(key in state) print state[key], "\t", key}' | sort -nr
为了保险点,或许还要查查内核的相关参数,比如fs.file-max,这些细节往往会影响到MySQL:
sysctl -a | grep "file"
注意到以上这些因素,问题差不多就能解决了。不过还要注意一点,table cache不是越大越好:
http://www.freshbooks.com/blog/2008/09/09/now-were-flying/
http://www.mysqlperformanceblog.com/2009/11/16/table_cache-negative-scalability/
http://www.mysqlperformanceblog.com/2009/11/26/more-on-table_cache/
BTW:如果你比较懒惰,也可以用MySQL Performance Tuning Primer Script来判断参数是否合理
把table_cache适当调小mysql能更快地工作
在我们的意识里,通常增大table_cache,尽量使打开的表句柄在缓存中,mysql能更快地响应操作,但是当我增大table_cache后,cpu增大了很多,查资料发现,table_cache并不是越大越好,因为mysql只有一个全局锁来控制打开和关闭表,也就是说无论有多少个线程在并行执行,只有一个线程可以打开或关闭表,这也就会出现很多死锁,别的线程等待那个全局锁,相应地增加了cpu的消耗,延长了其他链接线程执行sql的时间,降低系统性能,所以在保证table_cache够用的情况下,尽量保持table_cache足够小,但是这个度怎么把握,我也没有一定的尺度,还得再学习。
参考资料:
TableCache设置过小造成MyISAM频繁损坏 与 把table_cache适当调小mysql能更快地工作的更多相关文章
- mysql max_allowed_packet 设置过小导致记录写入失败
mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...
- 还原MySql数据库失败:max_allowed_packet 设置过小导致记录写入失败
MySQL根据配置文件会限制Server接受的数据包大小. 有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...
- mysql导入数据失败:mysql max_allowed_packet 设置过小
mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...
- 频繁插入(insert)的业务,用什么存储引擎更合适? | 数据库系列(转)
本文来自微信公众号 继续回答星球水友提问: 沈老师,MyISAM只支持表锁,但网上文章却说,在并发插入量比较大的时候,比较适合使用MyISAM,这矛盾吗? 这个问题,涉及MySQL表锁的一些细节,借着 ...
- CentOS 7 -防火墙设置--安装数据库,远程连接报错--Can't connect to MySQL server on localhost (10061)
前提简介:在CentOS 7 上安装了mysql5.7版本,已设置了远程访问权限,但是其他服务器无法访问到此Mysql,提示[Can't connect to MySQL server on loca ...
- 让tomcat启动更快的设置
http://wiki.apache.org/tomcat/HowTo/FasterStartUp#Entropy_Source 关于随机数的"熵源"(entropy source ...
- Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)
在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项 /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令 #pragma pack ...
- activemq持久化配置,设置为主从模式(带复制的主从模式,应用mysql数据库)
配置文件如下<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor l ...
- HTML字体的设置
CSS字体设置 box-sizing:border #content-box box-shadow:设置盒子边框的阴影. 字体动作: font-family:设置字体.比如:‘微软雅黑 ...
随机推荐
- 本地git工作流
一:add后的回退代码 1.在原有已经的基础上,又新增加了一个小需求 经过修改,添加到暂存区. 这个时候,会存在modified文件: 2.然后,又说需求不需要存在了 可以进行丢弃 在reset后,需 ...
- python开发--列表当全局变量来使用
python中,申明全局变量的时候,一般该变量类型基本上是:字符串或数字: 比较少用“列表”当做变量, 当有作用域限制的情况下,想要外部调用内部作用域的“列表”变量时,可以用这种方式,外部申明一个空列 ...
- ubuntu18 maven
user1@user1-ThinkPad-W540:~$ user1@user1-ThinkPad-W540:~$ sudo mkdir /opt/maven[sudo] password for u ...
- post 发送方式
/** * post 方式 解码 */ public static String getWebContentByPost(String urlString, String data, final St ...
- EasyNVR网页无插件播放摄像机RTSP流是如何调取接口在Web页实现多窗口同时直播的
背景需求 在互联网飞速发展的时代,开发者常会说的一个词就是"跨平台".自从移动端的用户需求越来越大,H5逐渐发展,跨平台似乎已经成为了软件开发不可或缺的技术.EasyNVR互联网直 ...
- LeetCode_412. Fizz Buzz
412. Fizz Buzz Easy Write a program that outputs the string representation of numbers from 1 to n. B ...
- Docker 搭建本地 cnpm 私有仓库
1.首先启动本地的docker 2.下载 cnpm 仓库 git clone https://github.com/cnpm/cnpmjs.org.git 3.进入到 cnpmjs.org目录 cd ...
- JavaScript之 BOM 与 DOM
1. JavaScript 组成 2. DOM.DOCUMENT.BOM.WINDOW 区别 DOM 是为了操作文档出现的 API , document 是其的一个对象:BOM 是为了操作浏览器出现的 ...
- [LeetCode] 90. Subsets II 子集合 II
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...
- [ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4: install (default-install) on project authorizationManagement-service: Failed to install metadata com.dmsdbj.itoo:autho
今天在打包时遇到这个问题: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4: inst ...