Vor nicht allzu langer Zeit habe ich hier über Deadlock geschrieben: PDOException: SQLSTATE [40001]: Serialisierungsfehler: 1213 Deadlock beim Versuch, eine Sperre zu erhalten;
Trotz allem, was mein Entwicklungsteam versucht, erhalten wir immer noch folgende Fehler:
PDOException: SQLSTATE [40001]: Serialisierungsfehler: 1213 Deadlock beim Versuch, eine Sperre zu erhalten; Versuchen Sie, die Transaktion neu zu starten: INSERT INTO {location_instance} (nid, vid, uid, genid, lid) VALUES (: db_insert_placeholder_0 ,: db_insert_placeholder_1 ,: db_insert_placeholder_2 ,: db_insert_placeholder_3 ,: db_insert_placeholder_4); Array ([: db_insert_placeholder_0] => 1059 [: db_insert_placeholder_1] => 1059 [: db_insert_placeholder_2] => 0 [: db_insert_placeholder_3] => cck: field_item_location: 1059 [: db_insert_placeholder_4] (>) /var/www/website.com/sites/all/modules/location/location.module).
Trotz der spezifischen Tabelle in diesem Beispiel wird dieser Fehler in anderen Tabellen angezeigt.
Hier ist meine Situation. Ich habe ein großes Universitätsprojekt gemacht. Zu jeder Zeit nutzen täglich 50.000 Campusbewohner das System. Darüber hinaus migriere ich Hunderte von Tausenden von Inhalten sowohl manuell als auch über benutzerdefinierten Modulcode (Migration von den alten Universitätsdaten) auf diese neue Drupal 7-Site.
Dieser Fehler bringt uns um, bis zu dem Punkt, an dem wir fast bereit sind, die Arbeit der letzten Jahre zu verschrotten und uns für etwas anderes zu entscheiden, wenn Drupal diese Art von Last nicht bewältigen kann.
Aber das ist mehr oder weniger meine Frage: Wie kann Drupal mit dieser Art von Last umgehen? Wie kann ich meinen Arbeitsablauf organisieren, um so viele Aktivitäten bewältigen zu können? Ist das ein Drupal-Problem? Ein Datenbankproblem?
Insbesondere verwende ich Ubuntu, LAMP Stack 16 GB RAM. Ich bin offen für Vorschläge, ob es sich um Drupal, Datenbank, Serverkonfiguration oder einen anderen Arbeitsablauf handelt, um innerhalb der Funktionen von Drupal zu arbeiten. Wenn Sie Erfahrung mit so vielen Aktivitäten haben, können Sie also gerne Vorschläge machen.
quelle
Antworten:
Ich arbeite für die Stanford University und habe ähnliche Dinge getan. Wir müssen ständig über 100.000 Knoten regelmäßig laden. Wir arbeiten seit 2 Jahren an unserem eigenen benutzerdefinierten Ladecode. Mit pcntl_fork konnten wir den Prozess erheblich beschleunigen. Das einzige, woran Sie denken müssen, ist, alle Socket-Verbindungen zu schließen, bevor Sie die Gabel aufrufen. Zum Beispiel müssen Sie Ihre MySQL-Verbindung, Memcache-Verbindung und sogar Mongo-Verbindung schließen. Drupal erstellt automatisch neue Verbindungen, wenn keine vorhanden ist. Was das Deadlock-Problem angeht, konnten wir dieses Problem durch Putten beheben
innodb_locks_unsafe_for_binlog = 1
.quelle
Die Antwort lautet: Konfigurieren Sie Ihre MySQL my.cnf-Datei korrekt.
Nach etwas mehr als einer Woche Recherche habe ich festgestellt, dass Drupal 7 tatsächlich so viel gleichzeitigen Eingabeverkehr verarbeiten kann.
Diese Deadlock-PDOExceptions waren darauf zurückzuführen, dass die MySQL-Datei my.cnf nicht richtig optimiert wurde. Mit Hilfe der Drupal High Performance-Gruppe und anderer Quellen konnte seit der Implementierung der neuen Konfigurationseinstellungen für MySQL in unserem Team kein einziger Deadlock auftreten. Wir haben unsere Batch-Skripte getestet, um bis zu 500 aktuelle Benutzer zu simulieren, die problemlos Inhalte speichern. Schauen Sie sich den Thread hier an.
http://groups.drupal.org/node/260938
Insbesondere schlug Dalin vor, einen Assistenten zu verwenden, um eine Basiskonfigurationsdatei basierend auf den Serverspezifikationen und Tabellentypen abzurufen. Nachdem dies verwendet wurde, wurden die Deadlocks auch ohne weitere Anpassungen gestoppt. Hier ist ein Link zum Assistenten, wenn Sie ihn ausprobieren möchten: https://tools.percona.com/wizard
Gerne poste ich die Datei my.cnf, wenn jemand sie hilfreich findet.
Obwohl das Deadlock-Problem kein Problem mehr darstellt, wird dieser Fehler jetzt sehr häufig angezeigt:
Könnte dies auch ein MySQL-Konfigurationsproblem sein?
quelle
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html Diese MySQL-Seite schlägt vor, was zu tun ist, wenn Sie auf einen Deadlock stoßen.
Durch die Feinabstimmung Ihrer MySQL-Konfiguration können Sie dieses Problem lösen.
quelle