2008-09-17 9 views
3

Ich habe ein RHEL 5 System mit einer frischen neuen Festplatte, die ich nur dem MySQL-Server gewidmet habe. Um die Dinge zu starten, habe ich "mysqldump --host otherhost -A | mysql" verwendet, obwohl ich bemerkt habe, dass die Manpage niemals explizit das probiert (mysqldump in eine Datei ist ein No-Go. Wir sprechen 500G der Datenbank).mysqldump | mysql gibt 'zu viele offene Dateien' Fehler. Warum?

Dieser Prozess schlägt in zufälligen Intervallen fehl und beschwert sich, dass zu viele Dateien geöffnet sind (zu diesem Zeitpunkt erhält mysqld das entsprechende Signal und stirbt und antwortet erneut).

Ich habe versucht, es bei sysctl und ulimit, aber das Problem besteht weiterhin. Was mache ich dagegen?

Antwort

6

mysqldump führt standardmäßig eine Sperre pro Tabelle für alle beteiligten Tabellen aus. Wenn Sie viele Tabellen haben, die die Anzahl der Dateideskriptoren des MySQL-Serverprozesses überschreiten können. Probieren Sie --skip-lock-tables aus oder wenn das Sperren zwingend erforderlich ist - 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 wurde für größere Datenbanken (1, 32,) zu Yeld dieser Fehler gemeldet. Erläuterung und Abhilfe von MySQL Bugs:

[3. Februar 2007 22.00 Uhr] Sergei Golubtschik Das ist nicht wirklich ein Problem ist.

mysqldump hat standardmäßig --lock-tables aktiviert, was bedeutet, dass versucht wird, alle Tabellen zu zu sperren, bevor der Dump gestartet wird. Und die LOCK TABLES t1, t2, ... für wirklich große Tabellen werden unweigerlich alle verfügbaren Dateideskriptoren erschöpfen, da LOCK alle Tabellen öffnen muss.

Problemumgehungen: --skip-lock-tables wird eine solche Sperre vollständig deaktivieren. Alternativ kann --lock-all-tables mysqldump veranlassen, FLUSH TABLES WITH READ LOCK zu verwenden, das alle Tabellen in allen Datenbanken sperrt (ohne sie zu öffnen). In diesem Fall wird mysqldump automatisch --lock-Tabellen deaktivieren, da es keinen Sinn ergibt, wenn --lock-all-tables verwendet wird.

bearbeiten: Bitte überprüfen Abhilfe Dave für InnoDB im Kommentar unten.

+0

Oder wenn Sie innodb Tabellen verwenden versuchen Sie - Single-Transaktion, die sowohl das Problem der Ausführung von Dateihandles vermeidet, und alle Ihre Tabellen sperren –

0

Wenn Ihre Datenbank so groß ist, haben Sie ein paar Probleme.

  1. Sie müssen die Tabellen sperren, um die Daten auszugeben.

  2. mysqldump wird sehr lange dauern und Ihre Tabellen müssen während dieser Zeit gesperrt werden.

  3. Das Importieren der Daten auf dem neuen Server dauert ebenfalls sehr lange.

Da Ihre Datenbank sein, im Wesentlichen unbrauchbar wird, während # 1 und # 2 passieren würde mir wirklich empfehlen, die Datenbank zu stoppen und mit rsync die Dateien auf den anderen Server zu kopieren. Es ist schneller als das Verwenden von mysqldump und viel schneller als das Importieren, da Sie nicht die zusätzliche E/A und CPU zum Generieren von Indizes haben.

In Produktionsumgebungen unter Linux setzen viele Leute Mysql-Daten auf eine LVM-Partition. Dann stoppen sie die Datenbank, machen einen LVM-Snapshot, starten die Datenbank und kopieren den Zustand der gestoppten Datenbank in Ruhe.

Verwandte Themen