Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    problema svuotamento tabella mysql

    Salve,
    ho creato uno script che si occupa di cancellare il contenuto di una tabella con poco più di 26000 righe.
    Fatto ciò la ripopola prelevando i dati da un csv.

    Per effettuare le query utilizzo PDO.

    di seguito il codice che utilizzo per effettuare la cancellazione:
    codice:
    $pdo->query("DELETE FROM nome-tabella);
    c'è un problema però .... 7 volte su 10 il server mi produce un errorlog all'esecuzione di questa riga:
    codice:
    PHP Warning: Error while sending QUERY packet. PID=90668 in /script.php on line 53
    Il mio mantainer mi ha suggerito di cancellare il contenuto della tabella in più step, così ho trasformato il codice nel seguente modo:
    codice:
    delete:
    $pdo->query("DELETE FROM nome-tabella WHERE 1 = 1 LIMIT 200"); //riga 53
    
    $q = "select id from nome-tabella";
    $result = $pdo->query($q);
    $codice2 = $result->fetchColumn();
    
    if (!empty($codice2))
    {
    sleep(1);
    goto delete;
    }
    Purtroppo non ho ottenuto risultati positivi.
    Ho provato anche a distruggere e ricreare la tabella, ma niente di fatto.

    Il mantainer mi ha detto che il valore impostato del "max_allowed_packet" è a 64MB e non può essere aumentato poiché si tratta di uno spazio condiviso.

    Possibile che la semplice operazione di svuotamento di una tabella mi crea questi problemi?
    Conoscete un metodo alternativo per risolvere la questione?

    Ringrazio in anticipo per ogni possibile suggerimento!

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Hai provato ad usare la TRUNCATE TABLE (sempre se puoi) invece che la DELETE ?

  3. #3
    Non ho mai usato TRUNCATE, provo e ti faccio sapere.
    Grazie del suggerimento!

  4. #4
    purtroppo ottengo lo stesso errore.
    Lo script ha superato il punto critico 3 volte su 6 per ora

  5. #5
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ma il problema è sempre lo stesso, qualunque cosa tu faccia ?.
    Codice PHP:
    do{
     
    $pdo->query("DELETE FROM tabella WHERE 1=1 LIMIT 100");
     
    $result $pdo->query("SELECT id FROM tablella LIMIT 1");
     
    $n $result->fetchColumn();
     if(
    $n 0){
        
    sleep(1); // Secondo me potrebbe anche non servire lo sleep
                      // In fondo si "lamenta" della dimensione
     

    }while(
    $n 0); 
    Se continui ad avere problemi, prova a fare un test:
    - solo una delete con un limit abbastanza grande. Prova n volte lo script, se fallisce abbassa il limit finchè non ne trovi uno che vada bene.

  6. #6
    Ho abbassato il limite fino a 50 record per volta ma l'errore è sempre lo stesso.
    Effettivamente con il truncate sembra che vada meglio.
    Questo processo è schedulato in un cron che parte ogni ora.
    Da quando ho seguito il tuo suggerimento ad ora, il risultato è di 11 success su 21 esecuzioni.
    L'errore che trovo nell'error_log è sempre lo stesso:
    codice:
    
    PHP Warning: Error while sending QUERY packet. ...
    Sospetto che il problema sia questo max_allowed_packet = 64M
    Il mio progetto è su un hosting condiviso e non vorrei che quando fallisce è perché altri siti sullo stesso server in quel momento stanno occupando parecchie risorse mysql.
    Non lo so ... la mia è solo un'ipotesi; anche perché se il problema fosse nel mio script, i fallimenti sarebbero dovuti essere 21 su 21

    Che ne pensi?

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quando riscontro un errore da me sconociuto, copio e incollo il messaggio nel browser.
    Nel tuo caso sembra essere proprio un problema di max_allowed_packet.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    E' possibile...però dovresti sentire l'assistenza. Però mi pare strano che dipenda da max_allowed_packet. Stando al manuale di mysql:

    A communication packet is a single SQL statement sent to the MySQL server, a single row that is sent to the client, or a binary log event sent from a master replication server to a slave.

    A me non pare che facendo quelle operazioni puoi superare quel valore

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    In effetti anche a me sembra molto strana questa cosa. Siamo sicuri che PDO non modifichi il codice sql in qualche modo? Riesci a vedere il comando sql effettivamente lanciato sul server?

  10. #10
    Quello che mi manda fuori di cervello è il fatto che ad esempio 11 volte su 20 funziona regolarmente.
    Ciò mi fa pensare che il problema (se così lo vogliamo chiamare) possa essere lato server.
    Provo a connettermi al mysql nel modo classico e vediamo che succede?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.