mysqldump: Got error: 1016: "Can't open file: '*.frm' (errno: 24)"

问题描述

在做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 进行对打开表的缓存进行清空。

猜你喜欢

转载自blog.csdn.net/m0_37886429/article/details/80076304