Plötzlich habe ich meine Website heruntergefahren (Drupal 6.19) und konnte MySQL nicht starten (zu viele Tabellen sind abgestürzt). Durch Überprüfen von df -h stellte ich fest, dass die MySQL-Partition aufgrund sehr großer binärer Protokolldateien voll ist (ich behalte binäre Protokolle nur für einen Tag, expire_logs_days = 1 ). Durch Überprüfen von mysqlbinlog auf eines der bin-Protokolle stellte ich fest, dass die meisten Einträge für Cache-Tabellen (cache_form, boost_cache, boost_cache_relationships, cache_content usw.) und für Sitzungstabellen bestimmt sind. Einige der Daten werden viele Male wiederholt. Übrigens habe
ich watch ls -lh und die bin-log Dateien wurden exponentiell größer (alle ein oder zwei Minuten habe ich eine neue binlog Datei mit 100M Dateigröße !!)
Haben Sie eine Vorstellung davon, was dies verursacht? Wie kann ich dieses Problem beheben?
Antworten:
Ich denke, eine offensichtliche Verbesserung wäre die Verwendung eines anderen Cache-Backends.
Wenn Sie einen einzelnen Server und genügend Speicher haben, können Sie ein APC-Backend (D6: http://drupal.org/project/cacherouter , D7: http://drupal.org/project/apc ) verwenden, um verschiedene zu haben häufig verwendete Caches direkt im Shared Memory. Das ist wahrscheinlich die schnellste Cache-Lösung, die Sie bekommen können.
Eine andere Alternative ist Memcached. Dies ist besonders interessant, wenn Sie mehrere Server haben, die einen Cache gemeinsam nutzen sollen.
Beachten Sie, dass Sie das cache_form nicht verschieben können, da es Informationen zu aktuell angezeigten Formularen enthält und kein Cache ist, da es eindeutige Informationen enthält, nicht nur aggregierte Dinge wie die anderen, die jederzeit gelöscht werden können. Einige andere Caches, insbesondere cache_update, möchten Sie möglicherweise in der Datenbank behalten, da dies nicht wie der Rest gelöscht werden sollte, da es Informationen zu Aktualisierungsinformationen Ihrer verwendeten Module enthält, was sich nicht so oft ändert und kann Seien Sie sehr langsam beim erneuten Abrufen, wenn Sie viele davon haben.
Sie können die Sitzungsinformationen auch aus der Datenbank verschieben, z. B. in MongoDB , und es gibt wahrscheinlich auch andere.
quelle
Haben Sie das Datum Ihrer Papierkorbprotokolle überprüft? Die Einstellung expire_logs_days ist nicht "auto-magic". Dies wird nur wirksam,
flush_logs
wenn MySQL neu gestartet wird oder wenn der Befehl ausgeführt wird oder wenn max_binlog_size erreicht ist.Dann sollte MySQL die aktuelle Protokolldatei drehen (eine neue erstellen) und die Dateien löschen, die älter als 1 Tag sind (in Ihrem Fall).
Versuchen Sie, diese letzte Einstellung in Ihrer my.cnf einzurichten, und prüfen Sie, ob sie in Kombination mit expire_log_days funktioniert .
quelle