我有一个RHEL 5系统,带有一个全新的硬盘,我专门用于MySQL服务器。为了开始,我使用了“mysqldump --host otherhost -A | mysql”,尽管我注意到manpage从未明确地建议尝试这个(mysqldump进入文件是不行的。我们正在谈论500G的数据库)。
此过程以随机间隔失败,抱怨打开的文件太多(此时mysqld获取相关信号,并且死亡和重生)。
我尝试在sysctl和ulimit上增加它,但问题仍然存在。我该怎么办?
答案 0 :(得分:8)
默认情况下,mysqldump对所有涉及的表执行每表锁定。如果有许多表可能超过mysql服务器进程的文件描述符数量。 尝试--skip-lock-tables或锁定是必要的--lock-all-tables http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
--lock-all-tables, -xLock 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)
[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)
如果您的数据库很大,那么您会遇到一些问题。
您必须锁定表以转储数据。
mysqldump需要很长时间才能在此期间锁定您的表格。
在新服务器上导入数据也需要很长时间。
由于您的数据库在#1和#2发生时基本上无法使用,我实际上建议您停止数据库并使用rsync将文件复制到其他服务器。它比使用mysqldump更快,并且比导入更快,因为你没有添加生成索引的IO和CPU。
在Linux上的生产环境中,许多人将Mysql数据放在LVM分区上。然后,他们停止数据库,执行LVM快照,启动数据库,并在闲暇时复制已停止数据库的状态。
答案 3 :(得分:0)
我刚刚重新启动了“ MySql”服务器,然后可以完美地使用mysqldump
命令。
这可能对您有帮助。