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_MB
Spalte (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?
[!!] Total fragmented tables: 2314
, Ich bin mir ziemlich sicher, dass dies auf ein Problem hinweist (mit den doppelten roten Ausrufezeichen)Antworten:
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.
quelle
Wenn Sie innodb_file_per_table aktiviert haben , haben Sie lediglich ein Protokoll eingerichtet, damit neue InnoDB-Tabellen in einer externen
.ibd
Datei 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
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
Oct 29, 2010
: Howto: Bereinigen Sie eine MySQL-InnoDB-Speicher-Engine?Jul 05, 2012
: Verschieben Sie ibdata1, setzen Sie innodb_data_file_pathUPDATE 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).
quelle
innodb_file_per_table
Am 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 ichinnodb_force_recovery
auf 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