Warum sind alle MySQL InnoDB-Tabellen fragmentiert?

10

Aus irgendeinem Grund werden alle InnoDB-Tabellen in meinem MySQL-Server als fragmentiert aufgeführt, wenn ich mysqltuner ausführe. Ich habe den Server erst vor einigen Stunden installiert (unter OSX Lion) und er enthält eine Reihe neuer Daten, die aus Batchdateien importiert wurden.

Ich habe versucht, alle Tabellen in einer Datenbank in MYISAM zu konvertieren, und die Anzahl der fragmentierten Tabellen ist mit Sicherheit gesunken. Seltsamerweise stieg die fragmentierte Tabellenanzahl wieder an, sobald ich diese Tabellen wieder in InnoDB konvertierte. Dies steht im Widerspruch zu meiner bisherigen Forschung, die darauf hindeutet, dass das Laufen ALTER TABLE table_name ENGINE=INNODB;die Fragmentierung beheben sollte.

Nach ein bisschen googeln rannte ich:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

Was angeblich alle fragmentierten Tabellen auflistet (es gibt tatsächlich die gleiche Anzahl von Ergebnissen zurück wie mysqltuner-Ausgaben für die Anzahl der fragmentierten Tabellen). Jeder einzelne Eintrag hat genau die gleiche Nummer in der data_free_MBSpalte (derzeit 7.00000000).

Ist das tatsächlich ein echtes Problem oder macht mysqltuner etwas falsch? Wie behebe ich ein Problem, wenn es ein Problem ist?

BEARBEITEN

Ich werde immer misstrauischer, dass ich ein Idiot bin und dass die 7-MB-Fragmentierung für die gesamte Datei gilt, nicht für jede Tabelle. Kann jemand bestätigen, ob dies der Fall wäre?

Clive
quelle
Denken Sie wirklich, dass 7 kostenlose MB ein Problem sind?
David Schwartz
@DavidSchwartz Keine Ahnung, deshalb habe ich gefragt;) Es gibt 2314 Tabellen, jede mit 7 MB frei, und ich weiß nicht, was das bedeutet. Ich bin mir nicht sicher, warum mysqltuner mir diese Zahl zeigen würde, wenn dies kein potenzieller Grund zur Besorgnis wäre. Ich hatte gehofft, jemand hier könnte mir sagen, wie besorgt es ist, die Zahlen zu erhalten, und was ich tun kann, um das Problem zu lindern, da die 'Standard'-Methoden nicht funktionieren
Clive,
Migrieren dieser Frage gemäß der Anforderung des Benutzers in einem Flag.
Daniel Beck
Die meisten Details, die mysqltuner anzeigt, dienen nur zur Information. Nicht alles ist ein Problem. Wenn es ein Problem ist, wird es klar sagen. Wurde dies als Problem angezeigt?
John Gardeniers
@ JohnGardeniers Ich glaube schon, die Nachricht lautet : [!!] Total fragmented tables: 2314, Ich bin mir ziemlich sicher, dass dies auf ein Problem hinweist (mit den doppelten roten Ausrufezeichen)
Clive

Antworten:

5

Gemäß meinen obigen Kommentaren weisen nicht alle Ausgaben von sqltuner auf Fehler hin. Wenn das Skript nicht sehr deutlich angibt, dass es sich um ein Problem handelt, normalerweise in der nächsten Zeile, gefolgt von Korrekturvorschlägen, handelt es sich nur um ein Informationselement.

John Gardeniers
quelle
3

Wenn Sie innodb_file_per_table aktiviert haben , haben Sie lediglich ein Protokoll eingerichtet, damit neue InnoDB-Tabellen in einer externen .ibdDatei erstellt werden. Alle InnoDB-Tabellen, die Sie zuvor erstellt haben, sind weiterhin in ibdata1 eingebettet.

Wenn innodb_file_per_table deaktiviert ist, können Sie es jederzeit ausführen

ALTER TABLE table_name ENGINE=INNODB;

Alles, was es tut, ist, die Daten- und Indexseiten der Tabelle an ibdata1 anzuhängen. Dadurch wird die Tabelle auf zusammenhängenden Seiten vorhanden und die Fragmentierung wird entfernt. Der Nachteil ist, dass ibdata1 schnell wächst.

EMPFEHLUNG

Sie müssen alle Daten exportieren, ibdata1, ib_logfile0, ib_logfile1 entfernen und neu laden.

Ich schrieb auf, wie und warum das so ist

UPDATE 2012-08-15 12:05 EDT

Vielleicht möchten Sie sich das Skript mysqltuner.pl selbst ansehen. IMHO Ich denke, es wird eine alte Formel zur Messung der Fragmentierung verwendet. Stellen Sie sicher, dass Sie die neueste Version von mysqltuner haben.

Bezüglich der Messung der Fragmentierung von extern gespeicherten InnoDB-Tabellen habe ich bereits am 11. April 2012 einen Beitrag darüber geschrieben (siehe das Update unten für den 19. April 2012).

RolandoMySQLDBA
quelle
1
Ahhh ok, die Dinge machen jetzt viel mehr Sinn, danke. innodb_file_per_tableAm Ende habe ich die Daten exportiert, MySQL vollständig gelöscht und dann neu installiert (aber vor dem Starten des Servers und dem erneuten Importieren zur conf-Datei hinzugefügt ). Zuvor hatte ich alle möglichen InnoDB-Fehler (die wirklich schlechten ... die bedeuteten, dass ich innodb_force_recoveryauf Stufe 6 laufen musste , um die Daten herauszuholen!), Und alle möglichen Daten der Protokolldatei sind in die Zukunft!' Fehler. Diese scheinen jetzt aufgehört zu haben, aber ich habe immer noch ein paar fragmentierte Tische. Ich werde es einfach im Auge behalten, nochmals
Clive
genial! das ist sehr informativ. Danke @RolandoMySQLDBA!
Sudhi