Findet das Magento-Datenbank-Upgrade in einer „Transaktion“ statt?

12

Wir haben dieses Problem atm:

Ein Kunde erhält ein Upgrade seines Shops von CE 1.4 auf CE 1.8. Das Datei-Upgrade verlief gut, und das Datenbank-Upgrade verlief auch auf unserer Entwicklungsmaschine gut.

Wenn wir versuchen, die Live-Datenbank des Kunden auf seiner Live-Maschine zu aktualisieren (verbinden Sie das 1.8-Magento mit der Datenbank und öffnen Sie es im Browser), scheint der Prozess eine Weile zu laufen und endet mit einem 500-Fehler.

Das PHP-Fehlerprotokoll ist leer. Da es sich um einen gemeinsam genutzten Host handelt, können wir die Apache- oder MySQL-Einstellungen nicht ändern. Der Hoster, obwohl "spezialisiert im Magento Hosting", ist nicht bereit, die Einstellungen zu ändern und sagt mir, dass ich das Datenbank-Upgrade abschließen könnte, indem ich das Browser-Fenster wiederholt aktualisiere, wenn der 500-Fehler auftritt, da Magento dann in kleinen Schritten aktualisiert wird . Dies kann stundenlang dauern.

Meine Frage ist jetzt:
- Ist das wahr? Ich dachte, die SQL-Anweisungen für Datenbank-Upgrades würden in eine Transaktion eingeschlossen, sodass sie zurückgesetzt werden könnten, wenn etwas schief geht.
- Könnte die Antwort einen Hinweis geben, wo ich im Code nachsehen könnte, um die Antwort auf diese Frage zu finden?

Vielen Dank für Ihre Zeit!

Simonthesorcerer
quelle
2
Möglicherweise relevant: Ein neuer n98-magenrun-Befehl, mit dem Sie Migrationsskripten einzeln ausführen können. github.com/netz98/n98-magerun/pull/274
Alan Storm

Antworten:

8

Ist das wahr? Ich dachte, die SQL-Anweisungen für Datenbank-Upgrades würden in eine Transaktion eingeschlossen, sodass sie zurückgesetzt werden könnten, wenn etwas schief geht.

Ihre technischen Instinkte sind solide, aber was in der realen Welt der Unternehmensgründung passiert, ist komplizierter / hässlicher.

Das Setup-Ressourcensystem von Magento funktioniert nicht einzelnen Skripte in eine Transaktion ein. Es gibt viele Gründe dafür, aber ich bin immer davon ausgegangen, dass Magento ursprünglich explizit an MySQL gebunden war und dass viele / die meisten Datendefinitionsanweisungen ( ALTER TABLEusw.) in MySQL ein implizites Commit verursachen .

Während Sie einzelne Setup-Ressourcen finden, verwenden Sie manchmal Transaktionen.

#File: app/code/core/Mage/Sales/sql/sales_setup/mysql4-upgrade-1.3.99-1.4.0.0.php
$installer->getConnection()->beginTransaction();
$installer->run("
        UPDATE {$installer->getTable('sales_flat_order')} AS o, {$installer->getTable('sales_order_entity_varchar')} AS od
    //...    

Das System selbst führt nur die Skripte aus und hofft auf das Beste.

Wenn Sie an dem Code interessiert sind, der diese Ressourcen ausführt, ist der beste Ausgangspunkt wahrscheinlich hier

#File: app/code/core/Mage/Core/Model/Resource/Setup.php
protected function _modifyResourceDb($actionType, $fromVersion, $toVersion)
{
    //...
}

Die _modifyResourceDbMethode enthält die eigentlichen Setup-Ressourcenskripts

#File: app/code/core/Mage/Core/Model/Resource/Setup.php
case 'php':
    $conn   = $this->getConnection();
    $result = include $fileName;
    break;
case 'sql':
    $sql = file_get_contents($fileName);
    if (!empty($sql)) {

        $result = $this->run($sql);
    } else {
        $result = true;
    }
    break;

Eine sehr hackige Lösung für Ihr Problem wäre ein temporärer Core-Hack / Code-Pool-Override, der explizit nach 5-10 include beendet wird, und führen Sie ihn erneut aus. Dies würde die Wahrscheinlichkeit verringern, dass ein Setup-Ressourcenskript nach der Hälfte des Zeitraums nicht mehr verfügbar ist.

Eine bessere Lösung und eines meiner persönlichen "Vielleicht eines Tages" -Projekte wäre ein benutzerdefiniertes Skript, das mithilfe von Magento-Kernmethoden die anzuwendenden Updates prüft, auflistet und die Benutzer einzeln ausführen lässt.

Alan Storm
quelle
Tolle Antwort & tolle Einsicht, danke; auch für den tipp wie man mein problem löst. Am Ende habe ich die Datenbank auf dem Dev.-Server aktualisiert und die "ready" -DB in das neue System importiert.
Simonthesorcerer
2
FWIW, dieses "vielleicht eines Tages" -Projekt wurde zum System: setup: incremental command in n98-magerun magerun.net
Alan Storm
Lass es mich wissen, wenn du das Skript fertig hast @AlanStorm;)
fkoessler