转自老王的博客

前些天说了一下如何修复损坏的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来判断参数是否合理

转载于:https://www.cnblogs.com/sunss/archive/2011/03/09/1977985.html

TableCache设置过小造成MyISAM频繁损坏相关推荐

  1. excel文件损坏修复绝招_Access文件频繁损坏的解决方法

    ↑↑↑点击上方图片,了解详情 网络\操作系统\Access配置前提说明: 局域网多人使用,Access前后端分离,后端Access文件通过共享放在文件服务器上,Access前端文件在每个客户端电脑上都 ...

  2. PermSize 设置过小对性能的影响(OutOfMemoryError:PermGen spac)

    [现象]:应用更新新版本后,其中一台机出现了较多的重启现象. [原因分析]: 分析应用日志,发现有OutOfMemoryError:PermGen space,此报错说明 PermSize 设置过小, ...

  3. mysql max_allowed_packet 设置过小导致记录写入失败

    mysql max_allowed_packet 设置过小导致记录写入失败 mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参 ...

  4. 如何快速修复谷歌浏览器扩展插件频繁损坏问题

    很多人使用浏览器扩展都是第三方下载的,这些扩展在安装之后,都会频繁提示"已损坏,需要修复",无论怎么下载重装都是没用的,除非在官方商店安装.那么,如何快速修复谷歌浏览器扩展插件频繁 ...

  5. ORACLE RAC 11.2.0.4 ASM加盘导致集群重启之ASM sga设置过小

    最近,一同事为一2节点的ORACLE RAC 11.2.0.4集群ASM加盘,没有注意到ASM的sga设置过小,加盘reblance时导致集群重启.详细描述如下: ​1.问题描述 ​ORACLE RA ...

  6. 【Redis】Redis最大连接数maxTotal设置过小的问题

    最近由于不合理的配置了redis中的最大连接数导致了线上服务间歇性不可用的问题,问题无小事,稳定大于一切. 一.结论 先直接说结论:并发量激增,redis最大连接数过小,导致获取redis连接超时,超 ...

  7. mysql表缓冲大小可能设置过小_MySQL 5.7 my.cnf配置文件详解

    [client] default-character-set = utf8mb4 [mysql] #开启 tab 补全 #auto-rehash default-character-set = utf ...

  8. Linux的Open Files设置过小导致程序退出并且Unable to create new native thread

    1.视界 2. 背景 我们在一台机器上部署了几个服务,但是总是有服务无缘无故挂掉.报错如下 并且jps打印如下 并且停止任务的时候如下 3. 查找问题

  9. MySQL性能调优与架构设计-架构篇

    架构篇(1) 读书笔记 1.Scale(扩展):从数据库来看,就是让数据库能够提供更强的服务能力 ScaleOut: 是通过增加处理节点的方式来提高整体处理能力 ScaleUp: 是通过增加当前处理节 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记2 启程前的认知准备
  2. 封装各种生成唯一性ID算法的工具类
  3. selenium 验证码——万能码的使用
  4. .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  5. axios创建实例对象发送ajax请求_解决一个网页请求多个服务器场景---axios工作笔记009
  6. 每一个企业的供应商都有供应商
  7. luogu1850 [NOIp2016]换教室 (floyd+dp)
  8. 小红帽系统进入oracle,11G RAC 安装在红帽6上,grid跑root.sh报错
  9. IE下图片切换的时候,图片总是切换不成功---根本问题是IE缓存图片
  10. Cypress总结回顾
  11. 应用系统安全检测技术
  12. vscode 修改显示文件顺序
  13. 谷歌浏览器打开CSDN老是弹出安卓网页
  14. OpenCV对TBB的支持
  15. 为什么我们选择LambdaMART作为我们的酒店排序模型
  16. 芋道项目搭建注意事项
  17. 想抵御“黑客”和“黑产” 智能+安全能不能有高招?
  18. useradd命令行参数
  19. 平行线拟合问题(附带 C++ 源代码)
  20. 用jupyter notebook打开不同盘的ipynb文件

热门文章

  1. 为什么null为对象,并且null和undefined有什么区别?
  2. Win10笔记本电脑如何开启热点
  3. rosweb,roslib:bug汇总。报Warning: Invalid argument “/map“ passed to canTransform
  4. Calendar与Date用法示例
  5. ifpc币_劳力士手表价格表一览表
  6. python计时器timeit返回秒数_一日一技:Python中的timeit()方法
  7. TypeScript学习(七):类型断言
  8. python nmap模块详解_python中的Nmap模块问题
  9. Confluence 6 针对合并完全失败的内容重新运行合并
  10. git中如何提交空目录