Ich versuche, ~ 55K Datensätze von einem MySQL-Server zu MongoDB zu migrieren. Ich kann dies nicht über eine der leicht zugänglichen Methoden wie JSON/CSV-Import tun, da die Datenspeichermethode (so wie sie strukturiert ist) sehr unterschiedlich sein wird. Aus diesem Grund habe ich ein Skript in PHP erstellt, das dafür entwickelt wurde. Das Problem, mit dem ich dabei gelandet bin, ist, dass über große Datenmengen (die mit kleineren Datensätzen nicht reproduzierbar sind, selbst wenn der kleinere Satz Problemeinträge enthält) die Abfragen gelegentlich trotz des vorhandenen Eintrags keine Daten melden. Es existiert absolut, denn wenn php direkt auf diesen spezifischen Eintrag zugreift oder in einem kleineren Datensatz enthalten ist, funktioniert es gut. Zum Beispiel, in den Import in eine Textdatei, erhielt ich nur ~ 42k/54k Datensätze.Warum gibt mySQL in PHP null Ergebnisse zurück?
In dem Echo, das ich über die URL empfange, wird die php-Datei durchgerufen, ich zeige, dass die Abfrage die richtige Anzahl von Malen aufgerufen wird, aber es gibt viele Datensätze, die nicht vorhanden sind, also das antwortende Echo ist leer. Der Code ist unten enthalten:
//Makes a connection to the database
$conn = makeConnection();
$filename = '/home/dbserverdownload.txt';
$file = fopen($filename, 'a');
$sql = "SELECT * FROM maintable ORDER BY ID DESC LIMIT 1";
$resultID = mysqli_query($conn, $sql);
$ID = mysqli_fetch_object($resultID);
echo $ID->ID;
//loops through the database and appends the data to the file as it goes
for($var=2; $var <= $ID->ID; $var++){
$sql1 = "SELECT * FROM servertable WHERE ID = '$var'";
$result1 = mysqli_query($conn, $sql1);
$values = mysqli_fetch_object($result1);
$id = $values->ID;
$ip = $values->IP;
$port = $values->port;
$running = $values->running;
$afk = $values->afk;
$gamemode = $values->gamemode;
$maxplayers = $values->maxplayers;
$spawnprotection = $values->spawnprotection;
$whitelist = $values->whitelist;
$enablequery = $values->enablequery;
$enablercon = $values->enablercon;
$rconpassword = $values->rconpassword;
$motd = $values->motd;
$achievements = $values->announceplayerachievements;
$allowflight = $values->allowflight;
$spawnanimals = $values->spawnanimals;
$spawnmobs = $values->spawnmobs;
$forcegamemode = $values->forcegamemode;
$hardcore = $values->hardcore;
$pvp = $values->pvp;
$difficulty = $values->difficulty;
$generatorsettings = $values->generatorsettings;
$levelname = $values->levelname;
$levelseed = $values->levelseed;
$leveltype = $values->leveltype;
$autosave = $values->autosave;
if($ip == "148.57.44.10"){
//if the server is server1
$servername = "server1".$port;
} else if ($ip == "165.108.22.199"){
//if the server is server2
$servername = "server2".$port;
} else{
$servername = "";
}
//Adds all content that was already gained to the JSON string
$startingContent = "{\"_id\":\"$servername\",
\"ip\":\"$ip\",
\"port\":\"$port\",
\"running\":\"$running\",
\"afk\":\"$afk\",
\"gamemode\":\"$gamemode\",
\"maxplayers\":\"$maxplayers\",
\"spawnprotection\":\"$spawnprotection\",
\"whitelist\":\"$whitelist\",
\"enablequery\":\"$enablequery\",
\"enablercon\":\"$enablercon\",
\"rconpassword\":\"$rconpassword\",
\"motd\":\"$motd\",
\"announceplayerachievements\":\"$achievements\",
\"allowflight\":\"$allowflight\",
\"spawnanimals\":\"$spawnanimals\",
\"spawnmobs\":\"$spawnmobs\",
\"forcegamemode\":\"$forcegamemode\",
\"hardcore\":\"$hardcore\",
\"pvp\":\"$pvp\",
\"difficulty\":\"$difficulty\",
\"generatorsettings\":\"$generatorsettings\",
\"levelname\":\"$levelname\",
\"levelseed\":\"$levelseed\",
\"leveltype\":\"$leveltype\",
\"autosave\":\"$autosave\"
}";
echo $startingContent."<br/>";
//This is the JSON data that will be passed to mongo
if(strlen($ip)>6){
if (fwrite($file, $startingContent) === FALSE) {
echo "Cannot write to file ($filename) with $startingContent";
exit;
}
}
}
ich auch dies mit einer Abfrage versucht habe, die eine bedeutende Zahl zieht (alle, die Hälfte, ein Viertel, etc.) der Ergebnisse in einem Klumpen statt Tonnen einzelner Abfragen. Das Endergebnis dieses Experiments war, dass bei jeder Ausführung eine variable Anzahl von Datensätzen aktualisiert wurde (normalerweise eine scheinbar zufällige Zahl zwischen 400 und 4000). Hat jemand eine Idee, warum dies passieren könnte? Wenn nicht, sollte ich mein eigenes Programm erstellen, um über die CSVs zu iterieren, die ich aus mySQL exportieren kann?
Haben Sie einen bestimmten Grund haben die 'SELECT' Aussagen einzeln in einem Inkrementieren' for' Schleife auszuführen, anstatt Abfrage sie nur alle auf einmal und handle auf ihnen, während du in einer Schleife gehst? Hast du 'display_errors' aktiviert? Oben im Skript 'error_reporting (E_ALL); ini_set ('display_errors', 1); 'falls es zu Timeouts kommt. Schließlich wäre es ratsam, 'json_encode()' in einem assoziativen Array zu verwenden, anstatt die JSON-Zeichenfolge manuell zu erstellen. Diese sehen aus wie minecraft params und ich nehme an, dass es sich um einfache Strings handelt, aber Dinge wie unangebrachte Zitate in ihnen können Probleme verursachen. –
Ihr Code scheint davon auszugehen, dass es keine Lücken in der ID-Sequenz in "servertierbar" gibt. Wenn Sie jemals eine Zeile aus der Tabelle gelöscht haben, werden Lücken bleiben. – Barmar
Sind die IDs in 'maintable' wirklich mit den IDs in' servertable' korreliert? – Barmar