MySQL配置变量的设置对数据库系统的性能有重要影响,有时候预测一个变量如何影响其他变量的这个问题可能有点棘手,特别是在处理我将在本文中描述的案例时,结果不是很直观。所以在这里,我们将看看当你将innodb_open_files设置为高于open_files_limit时会发生什么?
我们可以使用以下命令设置MySQL中的最大打开文件数:
1 |
open_files_limit=10000 |
如果打开表的文件个数超过了这个上限则会报错。
如果未设置,则应使用默认值 – 在MySQL 5.7中为5000。
有关如何更改打开文件限制的说明,请参阅Sveta的优秀博客文章,如果设置了这个值,它将采用SystemD LIMIT_NOFILES,除非它被设置为无穷大(并且在CentOS 7上它将使用65536,但如果手动指定则可以使用更高的值):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[root@centos7-pxc57-3 ~]# grep open_files_limit /etc/my.cnf open_files_limit=10000 [root@centos7-pxc57-3 ~]# grep LimitNOFILE /lib/systemd/system/mysqld.service.d/limit_nofile.conf LimitNOFILE=infinity [root@centos7-pxc57-3 ~]# mysql -e “SELECT @@open_files_limit” +--------------------+ | @@open_files_limit | +--------------------+ | 65536 | +--------------------+ [root@centos7-pxc57-3 ~]# perl -pi -e ’s/LimitNOFILE=infinity/LimitNOFILE=20000/‘ /lib/systemd/system/mysqld.service.d/limit_nofile.conf && systemctl daemon-reload && systemctl restart mysqld [root@centos7-pxc57-3 ~]# mysql -e “SELECT @@open_files_limit” +--------------------+ | @@open_files_limit | +--------------------+ | 20000 | +--------------------+ [root@centos7-pxc57-3 ~]# perl -pi -e ’s/LimitNOFILE=20000/LimitNOFILE=5000/‘ /lib/systemd/system/mysqld.service.d/limit_nofile.conf && systemctl daemon-reload && systemctl restart mysqld [root@centos7-pxc57-3 ~]# mysql -e “SELECT @@open_files_limit” +--------------------+ | @@open_files_limit | +--------------------+ | 5000 | +--------------------+ |
正如你在上面所看到的,MySQL无法将open_files_limit的值设置为高于系统配置为允许的值,并且如果设置得太高,open_files_limit将默认返回到最大值。
这看起来非常简单,但不太明显的是它会如何影响innodb_open_files。 innodb_open_files值的配置保证MySQL可以在任何时间保持打开的.ibd文件数,当打开文件超过innodb_open_files的时候,InnoDB就会关掉一些之前打开的文件。
因为这显然需要打开文件,所以它应该不高于open_files_limit(并且应该更低)。如果我们尝试按照此示例将其设置得更高,MySQL将在日志文件中打印警告:
1 2 |
[root@centos7-pxc57-3 ~]# grep innodb_open_files /var/log/mysqld.log 2018-09-21T08:31:06.002120Z 0 [Warning] InnoDB: innodb_open_files should not be greater than the open_files_limit. |
警告没有说明价值正在降低。尽管不是允许的最大值:
1 2 3 4 5 6 |
[root@centos7-pxc57-3 ~]# mysql -e “SELECT @@innodb_open_files” +---------------------+ | @@innodb_open_files | +---------------------+ | 2000 | +---------------------+ |
2000?为什么是2000呢?
这是因为如果我们将innodb_open_files设置得太高,它会恢复为默认值,根据文档是:
如果未启用innodb_file_per_table,则为300,否则为300和table_open_cache中的较高者。在5.6.6之前,默认值为300。
和table_open_cache?那么对于高达5.6.7的MySQL版本默认为400,对于5.6.8以上版本为2000。
请注意,table_open_cache完全是另一个设置,用来控制服务器可以一次打开的表定义(.frm)文件的数量。在InnoDB引擎打开文件超过innodb_open_files这个值的时候,就会关掉一些之前打开的文件。比如说,InnoDB分区表使用了本地分区策略以后,即使分区个数大于open_files_limit(MySQL Server层访问表时需要一次性打开所有文件,每个分区表在InnoDB层都是一个独立.ibd文件),打开InnoDB分区表也不会报“打开文件过多”这个错误,就是innodb_open_files这个参数发挥的作用。
<转载>
https://dbaplus.cn/news-11-2100-1.html