2008-09-17 27 views
3

我有一個RHEL 5系統,有一個新的硬盤驅動器,我只是專用於MySQL服務器。爲了讓事情開始,我使用了「mysqldump --host otherhost -A | mysql」,儘管我注意到manpage從未明確推薦嘗試這種方式(mysqldump到文件中是一個禁止行爲,我們正在談論500G的數據庫)。mysqldump | mysql會產生「太多打開的文件」的錯誤。爲什麼?

這個過程會隨機失敗,抱怨打開了太多文件(在這一點mysqld獲取相關信號,並死亡和重新生成)。

我試着把它放在sysctl和ulimit上,但問題依然存在。我該怎麼做呢?

回答

6

默認情況下,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.

3

mysqldump的已報道yeld該誤差較大的數據庫(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的解決方法在下面的評論。

+0

或者,如果您使用的是innodb表,請嘗試--single-transaction,它避免了文件句柄的運行問題以及鎖定所有表 – 2008-09-17 13:52:08

0

如果你的數據庫很大,你有幾個問題。

  1. 您必須鎖定表才能轉儲數據。

  2. mysqldump將需要非常長的時間,並且在此期間您的表格需要鎖定。

  3. 導入新服務器上的數據也需要很長時間。

因爲你的數據庫將是基本無法使用,而#1和#2正在發生我真的建議停止數據庫,並使用rsync將文件複製到其他服務器。它比使用mysqldump更快,而且比導入要快得多,因爲你沒有添加生成索引的IO和CPU。

在Linux上的生產環境中,許多人將Mysql數據放在LVM分區上。然後,他們停止數據庫,執行LVM快照,啓動數據庫,並在閒暇時拷貝停止的數據庫的狀態。

相關問題