以下的文章主要描述的是MySQL数据库是如何正确计算打开文件数的实际操作流程,大家都知道每打开一个MyISAM表,就需要对其使用2个文件描述符,所以我们就来验证一下MySQL数据库如何计算打开文件数。
试验
从手册的”6.4.8. How MySQL Opens and Closes Tables”可以了解到,每打开一个MyISAM表,就需要使用2个文件描述符,咱们来验证一下。
1. 重启mysqld
/etc/init.d/mysqlrestart
2. 看看打开了几个文件
lsof|grep/home/mysql ... mysqld24349mysql5uunix0x000001041e8de0404244009/home/mysql/mysql.sock mysqld24349mysql6uREG8,33204830425188/home/mysql/mysql/host.MYI mysqld24349mysql7uREG8,33030425189/home/mysql/mysql/host.MYD mysqld24349mysql8uREG8,33204830425153/home/mysql/mysql/user.MYI mysqld24349mysql9uREG8,3389230425155/home/mysql/mysql/user.MYD mysqld24349mysql10uREG8,33512030425126/home/mysql/mysql/db.MYI mysqld24349mysql11uREG8,33308030425148/home/mysql/mysql/db.MYD mysqld24349mysql12uREG8,33409630425154/home/mysql/mysql/tables_priv.MYI mysqld24349mysql13uREG8,33030425157/home/mysql/mysql/tables_priv.MYD mysqld24349mysql14uREG8,33409630425143/home/mysql/mysql/columns_priv.MYI mysqld24349mysql15uREG8,33030425156/home/mysql/mysql/columns_priv.MYD mysqld24349mysql16uREG8,33409630425127/home/mysql/mysql/procs_priv.MYI mysqld24349mysql17uREG8,33030425136/home/mysql/mysql/procs_priv.MYD mysqld24349mysql18uREG8,33102430425173/home/mysql/mysql/servers.MYI mysqld24349mysql19uREG8,33030425174/home/mysql/mysql/servers.MYD mysqld24349mysql20uREG8,33204830425182/home/mysql/mysql/event.MYI mysqld24349mysql21uREG8,33030425183/home/mysql/mysql/event.MYD ...
可以看到,总共打开了8个表,每个表分别有2个MySQL数据库文件描述符,看来没错。
3. 再来看 status 结果
mysql>showglobalstatuslike'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>flushtables; mysql>showglobalstatuslike'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 ... mysqld24349mysql5uunix0x000001041e8de0404244009/home/mysql/mysql.sock mysqld24349mysql22uunix0x00000102378ff9804244128/home/mysql/mysql.sock ...
可以看到,flush 之后,所有的文件描述符都释放了。
通过测试可以得知,另一个打开的文件描述符是 slow query log所用。
如果是有大量的 MyISAM 表,那么就需要特别注意打开文件数是否会超出限制了。
以上的相关内容就是对MySQL数据库如何计算打开文件数的介绍,望你能有所收获。
【编辑推荐】
- MySQL 事件调度器的操作流程MySQL锁表在那些情况中是不利的?如何实现MySQL锁的优化MySQL数据库中的中文乱码如何解决?MySQL heap使用大汇总