问题描述
在做MySQL备份时,出现 MySQL 打开文件错误:
mysqldump: Got error: 1016: “Can’t open file: ‘./db_lto/c_e00008_001_bb_rel_forum_userstonotify.frm’ (errno: 24)” when using LOCK TABLES
分析问题
此时是 MySQL 打开了太多的文件,而打不开新的文件了,那么解决此问题就会有两种解决的方案:
1、将打开文件的限制数调大
2、将打开的文件关闭
备注:
每个数据库都会在数据目录下生成一个文件夹,在文件夹中
.frm是描述了表的结构,.MYD保存了表的数据记录,*.MYI则是表的索引
这些文件不用随便动,否则会带来比较严重的问题。
方法一
1、登陆数据库,查看当前打开文件的限制
[root@hdds1 src]# mysql
MariaDB [(none)]> show variables like 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
1 row in set (0.00 sec)
2、修改 my.cnf 配置文件,在 mysqld 下修改
[mysqld]
open_files_limit = 65535
3、重启mysql服务
4、其他关联限制
①使用 show status like 'open%' 命令去查看,
Open_files 就是目前打开的文件数,
Open_table_definitions 是目前打开了多少个表,
Opened_files 是自从mysql服务启动打开了多少个文件。
MariaDB [(none)]> show status like 'open%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| Open_files | 723 |
| Open_streams | 0 |
| Open_table_definitions | 400 |
| Open_tables | 400 |
| Opened_files | 686851 |
| Opened_table_definitions | 0 |
| Opened_tables | 0 |
| Opened_views | 0 |
+--------------------------+--------+
8 rows in set (0.00 sec)
②通过 show open tables 命令可以查看打开了那些表
③打开文件的限制数的设置还会受到 max_prepared_stmt_count 的限制数的限制,
如果这个值大于 open_files_limit 的值, 系统会以 max_prepared_stmt_count这个设置限制数为标准。
使用show variables like 'max_prepared%'查看
MariaDB [(none)]> show variables like 'max_prepared%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| max_prepared_stmt_count | 16382 |
+-------------------------+-------+
1 row in set (0.00 sec)
方案二
使用 flush tables 进行对打开表的缓存进行清空。