mysqldump | mysql产生'太多打开文件'错误。为什么?

时间:2008-09-17 13:33:56

标签: mysql mysqldump rhel

我有一个RHEL 5系统,带有一个全新的硬盘,我专门用于MySQL服务器。为了开始,我使用了“mysqldump --host otherhost -A | mysql”,尽管我注意到manpage从未明确地建议尝试这个(mysqldump进入文件是不行的。我们正在谈论500G的数据库)。

此过程以随机间隔失败,抱怨打开的文件太多(此时mysqld获取相关信号,并且死亡和重生)。

我尝试在sysctl和ulimit上增加它,但问题仍然存在。我该怎么办?

4 个答案:

答案 0 :(得分:8)

默认情况下,mysqldump对所有涉及的表执行每表锁定。如果有许多表可能超过mysql服务器进程的文件描述符数量。 尝试--skip-lock-tables或锁定是必要的--lock-all-tables http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

--lock-all-tables, -x

Lock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.

答案 1 :(得分:3)

据报道,mysqldump对大型数据库(123)的错误提出了质疑。来自MySQL Bugs的解释和解决方法:

  

[2007年2月3日22:00]谢尔盖Golubchik   这不是一个真正的错误。

     

默认情况下,mysqldump启用了--lock-tables,这意味着它会尝试锁定所有表   在开始转储之前被转储。做LOCK TABLES t1,t2,......非常棒   表的数量将不可避免地耗尽所有可用的文件描述符,因为LOCK需要全部   要开的桌子。

     

解决方法: - skip-lock-tables将完全禁用此类锁定。或者,   --lock-all-tables将使mysqldump使用FLUSH TABLES WITH READ LOCK来锁定所有   所有数据库中的表(不打开它们)。在这种情况下,mysqldump会自动进行   禁用--lock-tables,因为使用--lock-all-tables时没有意义。

编辑:请在下面的评论中查看Dave对InnoDB的解决方法。

答案 2 :(得分:0)

如果您的数据库很大,那么您会遇到一些问题。

  1. 您必须锁定表以转储数据。

  2. mysqldump需要很长时间才能在此期间锁定您的表格。

  3. 在新服务器上导入数据也需要很长时间。

  4. 由于您的数据库在#1和#2发生时基本上无法使用,我实际上建议您停止数据库并使用rsync将文件复制到其他服务器。它比使用mysqldump更快,并且比导入更快,因为你没有添加生成索引的IO和CPU。

    在Linux上的生产环境中,许多人将Mysql数据放在LVM分区上。然后,他们停止数据库,执行LVM快照,启动数据库,并在闲暇时复制已停止数据库的状态。

答案 3 :(得分:0)

我刚刚重新启动了“ MySql”服务器,然后可以完美地使用mysqldump命令。

这可能对您有帮助。