2016-06-01 6 views
0

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?

+2

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. –

+0

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

+0

Sind die IDs in 'maintable' wirklich mit den IDs in' servertable' korreliert? – Barmar

Antwort

0

Zuerst ersetzen Sie Ihre Abfrage $sql = "SELECT * FROM maintable ORDER BY ID DESC LIMIT 1"; durch diese $sql = "SELECT MAX(ID) as ID FROM maintable"; für eine bessere Leistung.

Ihr Problem hier ist, dass Sie wahrscheinlich eine Abfrage haben, die false zurückgibt, dann Ihre Anwendung stirbt. Angenommen, Ihre Schleife versucht, ID=3 abzufragen, aber in Ihrer Datenbank befindet sich keine Zeile mit dieser ID. Dann löst die nächste Zeile eine Ausnahme aus, die Sie nicht sehen. Sie könnten Set display_errors=On in Ihrem Dev-Gerät php.ini verwenden.

verwenden zu überprüfen, ob Ihre Ergebnisse haben zu holen:

.... 
for($var=2; $var <= $ID->ID; $var++){ 
    $sql1 = "SELECT * FROM servertable WHERE ID = '$var'"; 
    $result1 = mysqli_query($conn, $sql1); 

    if($result) { 
     $values = mysqli_fetch_object($result1); 

     $id = $values->ID; 
     $ip = $values->IP; 
     .... 
+0

Würde dies nicht für einen Verlust von Datensätzen ermöglichen? Es gibt (garantiert) einen Rekord für jede Zahl zwischen 2 und 52.000+. Wenn es bei einem von denen ein falsches gibt, gibt es ein Problem und ich würde es vorziehen, wenn es ganz aufhörte und mir erlaubte, herauszufinden, warum. Stattdessen treibt es nur vorwärts, obwohl fast 10k Rekorde übersprungen werden. – KM529

+0

Wenn Sie aufhören müssen, fügen Sie am Ende ein "else" hinzu und tun Sie, was Sie denken, es ist besser zu tun, vielleicht senden Sie eine Benachrichtigung, setzen Sie einen 'Würfel ('Lücke hier');' oder etwas. Versuchen Sie zumindest meine Lösung und prüfen Sie, ob dies Ihr Problem ist. –

Verwandte Themen