2008-09-29 15 views
11

mysql5.0 mit einem Paar Datenbanken "A" und "B", beide mit großen innodb Tabellen. "drop Datenbank A;" friert die Datenbank "B" für ein paar Minuten ein. Nichts benutzt "A" an diesem Punkt, also warum ist das eine so intensive Operation?mysql "Drop-Datenbank" braucht Zeit - warum?

Bonuspunkte: Da wir "A" verwenden, Daten in "B" hochladen und dann zu "B" wechseln, wie können wir das schneller machen? Das Löschen von Datenbanken ist nicht die Art von Dingen, die man normalerweise tun muss, also ist das ein bisschen außerhalb der Charts.

+0

Ich hatte ein ähnliches Problem, aber die anderen Datenbanken waren betriebsbereit. Die Lösung bestand darin, alle anderen Prozesse, die diese Datenbank verwendeten, zu beenden, weil sie sie blockierten (wahrscheinlich implizit, indem diese Datenbank nur ausgewählt wurde, während sie schlief). – GDR

Antwort

13

Also ich bin mir nicht sicher Matt Rogish's answer wird 100% helfen.

Das Problem ist, dass MySQL * ein Mutex hat (sich gegenseitig ausschließende Sperre) um das Öffnen und Schließen Tabellen, so dass im Grunde das bedeutet, dass, wenn eine Tabelle in dem Prozess der in die geschlossene/gelöscht wird, keine anderen Tabellen geöffnet werden kann, .

Dies wird durch einen Kollegen von mir hier beschrieben: http://www.mysqlperformanceblog.com/2009/06/16/slow-drop-table/

Eine ausgezeichnete Schlagbekämpfungsstrategie ein Dateisystem wie XFS zu verwenden ist.

Die Problemumgehung ist hässlich. Sie müssen im Wesentlichen alle Daten in den Tabellen knabbern, bevor Sie sie löschen (siehe Kommentar 11 im obigen Link).

+0

Also hast du den Schließmechanismus erklärt und es macht alles Sinn ... aber das 'Warum' wurde noch nicht beantwortet. Es dauert nicht lange, eine Reihe von Dateien in Linux zu löschen. Ich vermute also, dass unter der Haube etwas viel Komplexeres passiert. Wenn ja, warum tut es das so, dass es seine Dateien in ein paar Sekunden einfach löscht und alle Bingo-Tabellen fallen gelassen werden? – Jeach

+1

Es gibt noch einen weiteren Grund neben dem langsamen Löschen von fs - wenn ein sehr großer Pufferpool vorhanden ist, kann ein Einfrieren auftreten, bei dem versucht wird, alle Seiten, die zu der Tabelle gehören, zu löschen. Dies wurde in vielleicht 5.5/5.6 mit einer "faulen" freien Methode verbessert. –

6

Standardmäßig verwenden alle innodb-Datenbanken in einer gegebenen mysql-Serverinstallation den gleichen physischen Pool von Datendateien, so dass "drop database A" möglicherweise Datenbank B betrifft. Da "drop database" wahrscheinlich eine starke Neuordnung der innodb data files ist es denkbar, dass es sich um eine blockierende Operation handelt, entweder wegen der Intensität der Operation oder aufgrund des Designs.

Ich denke jedoch, dass Sie jede Datenbank verwenden können verschiedene physische Dateien verwenden, obwohl ich das selbst nicht versucht habe, so müssen Sie die Besonderheiten für sich selbst herausfinden. Wenn dies nicht gelingt, müssen Sie möglicherweise zwei verschiedene mysql-Installationen nebeneinander auf derselben Maschine verwenden, was vollkommen machbar ist.

11

weg von skaffman Folgende:

Ändern Sie Ihre my.cnf (und starten Sie MySQL) enthalten:

innodb_file_per_table = 1 

(http://mysqldba.blogspot.com/2006/12/innodbfilepertable.html)

Diese Datenbanken gewidmet Dateispeicher geben und nehmen es aus dem geteilten Pool. So können Sie beispielsweise die Tabellen/Indizes auf verschiedenen physischen Festplatten platzieren, um E/A noch weiter aufzuteilen und die Leistung zu verbessern.

Beachten Sie, dass vorhandene Tabellen nicht geändert werden. Sie müssen arbeiten, um sie in ihre eigene Datei zu bekommen (http://capttofu.livejournal.com/11791.html).

+1

Ich denke, Sie übertreiben die Nützlichkeit der Verwendung von innodb_file_per_table = 1 zu teilen I/O - RAID ist eine bessere Option. Warum: Die CREATE TABLE-Option namens DATA DIRECTORY wird von InnoDB nicht unterstützt. Ich möchte eine einzelne Tabelle auf eine andere Partition verschieben, ich muss Symlink zurück zum ursprünglichen Speicherort verwenden. Sobald Sie einen ALTER TABLE-Befehl ausführen, wird der Symlink zerstört und die Tabelle wird zurück an den ursprünglichen Speicherort verschoben. –

+0

Ich bin überrascht, dass diese einzige Option einen so großen Unterschied macht. Du bist ein Lebensretter! –

Verwandte Themen