mysqldump资源不足


21

我正在尝试在Windows服务器上执行mysqldump,并且收到以下错误消息

mysqldump: Got error: 23: Out of resources when opening file '.\db\sometable.MYD' (Errcode: 24) when using LOCK TABLES

这是我正在运行的命令

mysqldump -u user -p"pass" --lock-tables --default-character-set=latin1 -e --quick databasename > "query.sql"

重新启动mysql服务没有帮助。

我总是收到同一张桌子的消息。

我曾尝试将table_cachemax_connections变量分别从64 减少到32,将30_减少到10,但是仅在这次针对另一张表时才得到错误(并且从现在开始,错误消息总是提及第二张表)。

相同的脚本正在其他具有相同数据库的Windows服务器上运行,没有问题。

所有数据库都有85个表。


您在什么操作系统上运行MySQL?
davey 2010年

Windows无处不在。
菲利普·卡里尔

数据库中有多少个表?好像某种文件描述符限制。
davey 2010年

数据库中有85个表。
Philippe Carriere 2010年

信息已添加到描述中。
Philippe Carriere 2010年

Answers:


21

根据此处 -“ OS错误代码24:打开的文件太多”与更常见的错误23“资源不足”对齐。

因此,似乎文件用尽了。这通常是服务器端设置/问题,无论是在MySQL中还是在操作系统本身中。

也许检查/调整MySQL本身的--open-files-limit设置,看看是否有帮助。

另外,也许尝试运行转储,而没有其他人正在使用DB时,请使用--single-transaction设置而不是--Lock-File,因为一些人建议这将一次运行一个表,而不是一次打开所有表(因此使用较少的文件句柄)。

除此之外,您可能还必须找到导致此特定服务器资源不足的根本原因。这可能涉及通过禁用尽可能多的服务/进程并查看转储是否通过来进行故障排除。然后从那里找出罪魁祸首是谁在吃太多的资源,也许没有正确地释放它们。


2
--single-transaction而不是--lock-tables有效。非常感谢。
菲利普·卡里尔

奇怪的是,我没有使用InnoDB,但是如果没有此参数,它将无法正常工作。我认为-单个事务仅与innoDB有关。
菲利普·卡里尔

真好 :)很高兴它有所帮助。
techie007

4
--lock-all-tables也可以工作,并且不存在--single-transaction在非InnoDB表上工作时的不一致问题。
自由报

只是澄清一下:--single-transaction力量--lock-tables=off。不要在非事务表上使用它。
b2ag 2011年

6

您是否可以尝试使用它--single-transaction而不是--lock-tables例如InnoDB表,并且不使用集群表,并且在转储期间不会发生ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE?如果有,最好与您的MySQL支持组织确认这是可以的。

我只在Unix上尝试过此操作,但基本上,如果我尝试使用具有2000个表的数据库,它将失败,并显示与您类似的错误,例如,我已经使用了所有打开的文件句柄。


+1。您的解决方案也与techie007相同,但他首先回答,所以我接受他的回答。对于记录,我没有使用innoDB。
菲利普·卡里尔

2

您可能会收到此错误:

MySQL:Errcode:使用LOCK TABLES时为24

...在升级到MySQL 5.5并在Plesk或正在执行的任何其他OS上运行备份时,还有其他错误mysqldump

修理:

  1. 编辑 my.cnf
  2. 加:

    open_files_limit=2048
    
  3. 重新启动MySQL

如果您收到:

无法从mysql.proc加载。该表可能已损坏(1548)

这是升级到5.5的结果。执行:

mysql_upgrade --force

经过测试并在CentOS 6.7和Plesk 12上工作。


0

我遇到了与菲利普类似的问题。当我开始转储时,我看到这样的错误:

mysqldump: Got error: 23: Out of resources when opening file './c1baznarz/timecard.MYD' (Errcode: 24) when using LOCK TABLES

我使用了简单的命令:

mysqldump -uroot -p c1baznarz > c1baznarz.sql

因此,我向mysqldump添加了另一个命令:

--single-transaction

转储已准备就绪。因此,我所有的mysqldump查询如下所示:

mysqldump -uroot -p --lock-tables --single-transaction c1baznarz > c1baznarz.sql
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.