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:设置字体.比如:‘微软雅黑 ...
随机推荐
- javascript数组遍历的几种常用方法性能分析对比
前言: 数组遍历有很多种方法,虽然不同方法有不同的特性及适用环境,除了普通飞for循环之外,for...in能直接输出数组元素的索引,for...of能直接输出数组元素的值,map则可以直接生成新的数 ...
- Android 编译 product 分区
https://source.android.google.cn/devices/bootloader/product-partitions 编译 product 分区 Android 9 支持使用 ...
- ASP.NET中httpmodules与httphandlers全解析
https://www.cnblogs.com/zpc870921/archive/2012/03/12/2391424.html https://www.cnblogs.com/PiaoMiaoGo ...
- SpringBoot MAVEN编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:
参考了好几篇文章没搞定,直到查询错误关键字 An unknown compilation problem occurred 分别参考了以下博客: https://blog.csdn.net/fanre ...
- Spring cloud微服务安全实战-7-1章节概述
前面的章节都是围绕这微服务的安全在讲一些东西,包括微服务本身api的安全.网关的安全.怎么去做安全中心,包括认证服务器,权限的服务.权限的设计,怎么来实现SSO.然后sentinel来实现统一的熔断, ...
- plsql 记录型变量
set serveroutput on declare emplist emp%rowtype; begin ; dbms_output.put_line(emplist.ename||'的薪水是'| ...
- django项目模型字段
一个模型(model)就是一个单独的.确定的数据的信息源,包含了数据的字段和操作方法.通常,每个模型映射为一张数据库中的表. 基本的原则如下: 每个模型在Django中的存在形式为一个Python类 ...
- 使用 Fiddler 代理调试本地手机页面
文件下载:http://files.cnblogs.com/files/dtdxrk/fiddler4_4.6.2.0_setup.rar 从事前端开发的同学一定对 Fiddler 不陌生,它是一个非 ...
- [LeetCode] 127. Word Ladder 单词阶梯
Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...
- [LeetCode] 244. Shortest Word Distance II 最短单词距离 II
This is a follow up of Shortest Word Distance. The only difference is now you are given the list of ...