Ich habe eine MySQL-Tabelle, die automatisch einmal pro Tag aktualisiert wird. Das Skript, das dieses Update ausführt, funktioniert wie der folgende PHP-Code. Was es grundsätzlich macht, erstellt eine temporäre Tabelle mit der gleichen Struktur, fügt zuerst alle Daten dort ein, schneidet dann die tatsächliche Tabelle ab und fügt die Daten aus der temporären Tabelle ein. schließlich wird der temporäre Tisch zerstört. Diese Methode wird verwendet, da sie die Ausfallzeit der tatsächlichen Tabelle erheblich verringert.Basistabelle oder Ansicht nicht gefunden - obwohl es sollte
Das funktionierte für eine ganze Weile gut. Bis vor kurzem mit dem Debian-Upgrade (von Debian 8 auf Debian 9, was auch den Wechsel von MySQL zu MariaDB bedeutet). Jetzt finde ich häufig diese Fehlermeldung in den Protokolldateien:
[Wed Sep 27 06:03:04.903652 2017] [:error] [pid 27393] [client 127.0.0.1:36794] PHP Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'database.table_temp' doesn't exist in /someFile.php:50\nStack trace:\n#0 /someFile.php(50): PDOStatement->execute()\n#1 {main}\n thrown in /someFile.php on line 50
Dieser Fehler letztlich bewirkt, dass einige der Daten zu fehlen. Wenn ich es richtig verstehe, heißt es, dass der temporäre Tisch zerstört wurde, bevor die Beilagen fertig waren, oder? Wie kann das passieren, wenn man bedenkt, dass dies nicht wirklich ein TEMPORARY TABLE
ist, verwende ich einfach eine echte Tabelle und nenne sie temp
. Verursacht MariaDB INSERTs verzögert, so dass das PHP-Skript den DROP ausführen kann, bevor die INSERTs ausgeführt werden?
Dies ist der cron.d Eintrag, so wird das Skript wirklich nur einmal pro Tag ausgeführt:
1 6 * * * root /usr/bin/wget -q http://www.example.com/someFile.php -O /dev/null
Es ist auch erwähnenswert ist, dass das Skript innerhalb einer Stunde der Ausführung beendet oder zwei, so dass die Ausführung von Der vorherige Tag ist lange beendet und stört nicht.
Dies ist im Grunde der Code:
$dataArray = []; // much data
$db->query("DROP TABLE IF EXISTS `table_temp`;");
$db->query("CREATE TABLE `table_temp` LIKE `table`;");
$tres = $db->prepare("
INSERT INTO `table_temp`
(`field1`, `field2`)
VALUES
(:field1, :field2)
");
foreach($dataArray as $data){
$db->beginTransaction();
$res->execute();
foreach($data as $item){
$tres->bindParam('field1', $item['field1'], PDO::PARAM_INT);
$tres->bindParam('field2', $item['field2']);
$tres->execute(); // line 50
}
$db->commit();
}
$db->query("RENAME TABLE `table` TO `table_old`, `table_temp` TO `table`");
$db->query("DROP TABLE `table_old`");
ist es fast der Fehler, der Ihnen sagt, dass die Tabelle 'table_temp' nicht vor der Vorbereitungsfunktion erstellt wurde ... das ist seltsam, weil PHP auf' $ db-> query ("CREATE TABLE' table_temp' LIKE '" warten sollte) Tabelle ";"); 'hat ausgeführt, das ist normal .. –
Was ist Zeile 50 in Ihrem Code? –
Zeile 50 ist im Code kommentiert. Es ist die Ausführung der Einfügeabfrage – user2015253