作/译者:叶金荣(Email:

),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。

一、试验

从手册的"6.4.8. How MySQL Opens and Closes Tables"可以了解到,每打开一个MyISAM表,就需要使用2个文件描述符,咱们来验证一下。

1. 重启mysqld

/etc/init.d/mysql restart

2. 看看打开了几个文件

lsof | grep /home/mysql

...

mysqld 24349 mysql 5u unix 0x000001041e8de040 4244009 /home/mysql/mysql.sock

mysqld 24349 mysql 6u REG 8,33 2048 30425188 /home/mysql/mysql/host.MYI

mysqld 24349 mysql 7u REG 8,33 0 30425189 /home/mysql/mysql/host.MYD

mysqld 24349 mysql 8u REG 8,33 2048 30425153 /home/mysql/mysql/user.MYI

mysqld 24349 mysql 9u REG 8,33 892 30425155 /home/mysql/mysql/user.MYD

mysqld 24349 mysql 10u REG 8,33 5120 30425126 /home/mysql/mysql/db.MYI

mysqld 24349 mysql 11u REG 8,33 3080 30425148 /home/mysql/mysql/db.MYD

mysqld 24349 mysql 12u REG 8,33 4096 30425154 /home/mysql/mysql/tables_priv.MYI

mysqld 24349 mysql 13u REG 8,33 0 30425157 /home/mysql/mysql/tables_priv.MYD

mysqld 24349 mysql 14u REG 8,33 4096 30425143 /home/mysql/mysql/columns_priv.MYI

mysqld 24349 mysql 15u REG 8,33 0 30425156 /home/mysql/mysql/columns_priv.MYD

mysqld 24349 mysql 16u REG 8,33 4096 30425127 /home/mysql/mysql/procs_priv.MYI

mysqld 24349 mysql 17u REG 8,33 0 30425136 /home/mysql/mysql/procs_priv.MYD

mysqld 24349 mysql 18u REG 8,33 1024 30425173 /home/mysql/mysql/servers.MYI

mysqld 24349 mysql 19u REG 8,33 0 30425174 /home/mysql/mysql/servers.MYD

mysqld 24349 mysql 20u REG 8,33 2048 30425182 /home/mysql/mysql/event.MYI

mysqld 24349 mysql 21u REG 8,33 0 30425183 /home/mysql/mysql/event.MYD

...

可以看到,总共打开了8个表,每个表分别有2个文件描述符,看来没错。

3. 再来看 status 结果

mysql>show global status like 'open_%';

+------------------------+-------+

| Variable_name | Value |

+------------------------+-------+

| Open_files | 17 |

| Open_streams | 0 |

| Open_table_definitions | 15 |

| Open_tables | 8 |

| Opened_files | 52 |

| Opened_tables | 15 |

+------------------------+-------+

4. flush tables 后再看看

mysql>flush tables;

mysql> show global status like 'open_%';

+------------------------+-------+

| Variable_name | Value |

+------------------------+-------+

| Open_files | 1 |

| Open_streams | 0 |

| Open_table_definitions | 0 |

| Open_tables | 0 |

| Opened_files | 52 |

| Opened_tables | 15 |

+------------------------+-------+

lsof | grep /home/mysql

...

mysqld 24349 mysql 5u unix 0x000001041e8de040 4244009 /home/mysql/mysql.sock

mysqld 24349 mysql 22u unix 0x00000102378ff980 4244128 /home/mysql/mysql.sock

...

可以看到,flush 之后,所有的文件描述符都释放了。

通过测试可以得知,另一个打开的文件描述符是 slow query log所用。

如果是有大量的 MyISAM 表,那么就需要特别注意打开文件数是否会超出限制了。

二、原理

接下来仔细了解下这个最大文件数相关的参数:

table_cache (新版本改成了 table_open_cache) The number of cached open tables.

open_files_limit If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit().

If this value is 0 then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger)

number of files.

如果 open_files_limit 不是设置为 0,则以 setrlimit() 函数计算后的结果为准,如果设置为 0,则实际值是 max_connections*5 或 max_connections + table_cache*2 中的最大者。

因此,想要解决打开文件数超限的问题,还需要综合系统内核限制(ulimit -n),mysqld自身限制(open_files_limit),以及表缓存数(table_open_cache)等多方面因素。

不过,实际测试中,发现却不是这样的,open_files_limit采用了内核的最大限制,而非上面的计算结果。

1. 查看内核限制

ulimit -n

65535

2. 修改 my.cnf 限制

vi /etc/my.cnf

...

open_files_limit = 10000

...

3. 重启 mysqld

/etc/init.d/mysql restart

4. 查看结果

mysql>show global variables like '%open%';

| open_files_limit | 65535 |

| table_open_cache | 1000 |

5. 不设置 open_files_limit 看看

vi /etc/my.cnf

...

#open_files_limit = 10000

...

重启

/etc/init.d/mysql restart

查看

mysql>show global variables like '%open%';

| open_files_limit | 65535 |

| table_open_cache | 1000 |

而这个时候,按计算公式结果如下:

| max_connections | 100 |

| table_open_cache | 1000 |

来计算一下:

max_open_files_1 = max_connections + table_cache * 2 = 100 + 1000 * 2 = 2100

max_open_files_2 = max_connections*5 = 100 * 5 = 500

6. 修改 ulimit 试试看:

unlimit -n 5000

vi /etc/my.cnf

...

open_files_limit = 10000

...

/etc/init.d/mysql restart

mysql>show global variables like '%open%';

| open_files_limit | 10000 |

| table_open_cache | 1000 |

open_files_limit 比内核最大限制数还大,因此以 open_files_limit 为准。

vi /etc/my.cnf

...

#open_files_limit = 10000

...

/etc/init.d/mysql restart

mysql>show global variables like '%open%';

| open_files_limit | 5000 |

| table_open_cache | 1000 |

看到了,变成了新的内核最大限制

看到了吧,结果完全跟文档描述的以及mysql源码中写的不一样,看来预编译版本有些地方不太可靠啊 :(

以上测试在mysql 5.1.23-rc(预编译), mysql-5.1.24-rc(自编译) 以及 5.0.45(预编译) 均一样。

uname -a

Linux s1.yejr.com 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux

mysql> select version();

+---------------+

| version() |

+---------------+

| 5.1.23-rc-log |

+---------------+

本文出自 “老叶茶馆” 博客,转载请与作者联系!

mysql查看已打开文件数_[MySQL FAQ]系列 -- mysql如何计算打开文件数相关推荐

  1. mysql查看已打开文件数_MySQL如何计算打开文件数_MySQL

    每打开一个MyISAM表,就需要使用2个文件描述符,咱们来验证一下MySQL如何计算打开文件数. 一.试验 从手册的"6.4.8. How MySQL Opens and Closes Ta ...

  2. mysql查看现在使用的引擎_如何查看MySQL的当前存储引擎?

    如何查看MySQL的当前存储引擎? 一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你 ...

  3. mysql查看客户端执行的语句_查看MySQL最近执行的语句-阿里云开发者社区

    首先登入MySQL. Reading table information for completion of table and column names You can turn off this ...

  4. mysql榨包是什么意思_模块与包 Mysql与Oracle区别

    1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码( ...

  5. mysql查看数据文件ibdata_如何从 ibdata文件 恢复 MySQL 数据库

    大家好,前天重做了系统,忘了备份数据库,只在其他盘保留 MYSQL的安装目录,如何从安装目录中的 ibadata1 文件中恢复数据库和数据? 注:所用的MYSQL版本是 5.5.22 ,原有安装目录文 ...

  6. 怎么查到mysql的账号密码是什么_怎么查到mysql的账号密码是什么?

    查到方法:首先以管理员身份运行一个cmd窗口,输入"mysql -uroot -p",回车入数据库:然后使用"select host,user,password from ...

  7. mysql物理备份迁移注意细节_物理拷贝备份mysql到其他机器上恢复

    经常会遇到mysql数据要迁徙的情况 ,逻辑导出是可以的 但是就是太慢 第三方工具也同样可以用 也是操作麻烦,最简单粗暴的方式就是直接拷贝物理文件来的最快 也很简单 当然 前提是远程服务器和目标服务器 ...

  8. mysql数据库应用的权限层级_涂抹MySQL--第5章 MySQL数据库中的权限体系 - 5.3权限级别(1)...

    5.3 权限级别 总的来说,MySQL数据库的权限从大的粒度上划分可以分成5类:全局.数据库.表.列.程序.通过对这5个大类权限的细分,可以精确地为某个用户分配从某台机器连接进来访问某个数据库下某个表 ...

  9. navicat和mysql有必要都装吗_干掉Navicat!MySQL官方客户端到底行不行?

    在我们选择工具的时候,往往会优先选择那些免费又好用的工具!Navicat作为一款付费软件,虽然功能强大,但也阻止不了我们探索新工具的步伐.最近体验了一把MySQL的官方客户端工具MySQL Workb ...

  10. mysql计算机二级选择题题库_全国计算机二级mysql数据库选择题及答案

    全国计算机二级mysql数据库选择题及答案 选择题是全国计算机二级mysql考试里的送分题,下面小编为大家带来了全国计算机二级mysql数据库选择题及答案,欢迎大家阅读! 全国计算机二级mysql数据 ...

最新文章

  1. tensorflow学习入门笔记
  2. 如何通过apache运行php,apache-2.2 – 如何使所有URL通过单个PHP文件运行?
  3. 百万数据报表读取:步骤分析以及自定义事件处理器
  4. php去掉多字节字符,PHP 面试题 - 如果没有 mb 系列函数,如何切割多字节字符串...
  5. MySQL优化详解(四)——MySQL缓存设置
  6. c语言散列表的长度为11,2011数据结构C语言模拟试题及答案.doc
  7. 超级详细的Junit单元测试教程
  8. android 辅助功能_关于辅助功能的9个神话
  9. 桌面点击鼠标右键一直显示转圈卡住如何解决
  10. vscode背景绿色配置
  11. Python给定两个有序整数数组nums1和nums2,合并nums1和nums2为数组nums1
  12. 编译器整数除法的优化
  13. 免费HTTP代理商如何
  14. 【论文阅读】DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning
  15. 海上日出(Sunrise)
  16. 医药采购之采购单明细添加查询
  17. 2021物联网产业链全景图谱(附PDF下载)
  18. java 集成 v8_V8 的 Java 封装版本 J2V8
  19. 【龙芯2K1000】交叉编译QT库
  20. python转成exe格式

热门文章

  1. 对象的生命周期回顾篇
  2. Jetson TX2入门学习之Ubuntu默认密码
  3. 【ubuntu】配置zsh
  4. 区块链基础语言(二十)——Go语言结构体
  5. 内存泄漏(Memory Leak)
  6. 线性表链式存储的基本操作
  7. css transition transform animation例子讲解
  8. ping 和 远程桌面 与防火墙的关系
  9. 关于树节点巨多时获取用户选中(可多选)节点的优化
  10. 深入浅出SharePoint——站点的部署