qual è un valore ragionevole per max_allowed_packet per Drupal 7 con traffico moderato?


12

Devo conoscere un numero di parco palla per questa variabile per il mio sito drupal 7. Recentemente ho ricevuto un "drupal" PDOException: SQLSTATE [08S01]: Errore collegamento comunicazione: errore 1153 ". Sono un principiante di mysql e sto usando l'hosting condiviso. Probabilmente devo chiedere all'amministratore di farlo per me.

Grazie in anticipo.


1
La mia risposta mostra la mia esperienza con questo, ma potresti trovare risposte migliori su dba.stackexchange.com da coloro che mantengono la vita di MySQL.
mpdonadio

Risposte:


12

Ho visto una risposta interessante a una domanda sul BLOB più grande che potresti avere. Ecco la dichiarazione che ho visto in ServerFault: innodb_log_file_size e innodb_log_buffer_size combinati devono essere più grandi di dieci volte il tuo oggetto BLOB più grande se ne hai molti di grandi .

Sulla base di quel post ServerFault di Nils-Anders Nøttseter , dovresti interrogare la tabella e scoprire quale BLOB è il più grande, moltiplicare quel numero per 11 o più e usare quella risposta come max_allowed_packet andando avanti.

È divertente che abbia rivolto un'altra domanda in cui ho suggerito di ridimensionare il pacchetto max_allowed per risolvere il problema .

AVVERTIMENTO

Secondo il libro

TheBookImage

Ecco cosa dicono i pacchetti MySQL:

Il codice di comunicazione della rete MySQL è stato scritto partendo dal presupposto che le query sono sempre ragionevolmente brevi e pertanto possono essere inviate ed elaborate dal server in un unico blocco, che viene chiamato pacchetto nella terminologia MySQL. Il server alloca la memoria per un buffer temporaneo per archiviare il pacchetto e richiede abbastanza per adattarlo interamente. Questa architettura richiede una precauzione per evitare che il server esaurisca la memoria, ovvero un limite alla dimensione del pacchetto, che questa opzione consente.

Il codice di interesse in relazione a questa opzione si trova in sql / net_serv.cc . Dai un'occhiata a my_net_read () , quindi segui la chiamata a my_real_read () e presta particolare attenzione a net_realloc () .

Questa variabile limita anche la lunghezza di un risultato di molte funzioni stringa. Vedi sql / field.cc e sql / intem_strfunc.cc per i dettagli.

Sapere questo sui pacchetti MySQL consente a un DBA di dimensionarli per adattarsi a più BLOB all'interno di un pacchetto MySQL, anche se sono eccessivamente grandi.

Per quanto riguarda la tua situazione, dovresti scoprire qual è il BLOB più grande nel tuo database, moltiplicare quel numero per 11 e impostare max_allowed_packet su quel numero. Dovresti essere in grado di impostarlo per il server senza un riavvio mysql (Personalmente, lo imposterei 256M perché affronterebbe altri problemi riguardanti la migrazione e la replica, che va oltre lo scopo di questo forum). Per impostarlo su 256 M per il database per tutte le connessioni in entrata, eseguire questo:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Successivamente, aggiungi questa impostazione a my.cnf nella [mysqld]sezione:

[mysqld]
max_allowed_packet = 256M

Il pacchetto massimo consentito non influirebbe anche sulla dimensione delle istruzioni di inserimento?
Buttle Butkus,

@ButtleButkus Certo. Questo è il motivo per cui i pacchetti MySQL più grandi funzionano bene con gli INSERTI. Si noti che 1G è la dimensione massima per max_allowed_packet. Si noti inoltre che l'impostazione max_allowed_packet su 256M non alloca 256M in anticipo. Secondo dev.mysql.com/doc/refman/5.6/en/… , mysqld alloca qualunque net_buffer_length sia la dimensione iniziale del pacchetto MySQL. Il pacchetto aumenta gradualmente alla dimensione impostata da max_allowed_packet. Pertanto, è OK impostare un max_allowed_packet di grandi dimensioni. Gli INSERTI ti adoreranno per questo.
RolandoMySQLDBA

Non ho mai impostato nulla di simile a quella dimensione, anche se abbiamo un paio di macchine con 32G di RAM. Un'applicazione è soffocata, però, e l'ho aumentata a 32 M dall'impostazione predefinita (1 M?) E ha funzionato. Forse lo aumenterò ulteriormente, se non farà male. Ma, le applicazioni dovrebbero controllare max_allowed_packet e suddividere gli inserti in blocchi per evitare di raggiungere quel limite? Qual è il lato negativo di questo approccio? Forse dovrei pubblicare quella domanda sul sito dello stack dba.
Buttle Butkus,

Potresti approfondire un po 'di più sul perché dovremmo moltiplicare per 11? Il post collegato riguarda i buffer innodb: in che modo è correlato alla dimensione del pacchetto?
SystemParadox,

4

Tratto dalla pagina Requisiti del server database di Drupal :

Potrebbe essere necessario impostare la variabile di sistema max_allowed_packet su almeno 16M. Alcuni piani di hosting economici impostano questo valore troppo basso (il valore predefinito di MySQL è solo 1M). In tal caso, potrebbe essere necessario scegliere un piano di hosting migliore. Un valore di 1M può essere sufficiente per Drupal 5.

Dovrebbe andare bene per un sito su hosting condiviso.


1
Wow!! I requisiti del server Drupal dicono ufficialmente che sono 16 milioni !! Non me ne sono mai accorto. Lo terrò a mente la prossima volta. Grazie mille per aver condiviso queste informazioni. Vorrei poter contrassegnare la migliore risposta !!
Shivams,

2

Può essere un po 'complicato da impostare max_allowed_packet. Devo ancora imbattermi in un metodo per calcolare quel valore. In genere, mi imbatto in esso quando provo a ripristinare uno snapshot del database che include righe dalle {cache}tabelle.

Quando ho questo problema, sceglierò un valore tra 4M e 8M. Continuo a aumentare il valore fino a quando non si ferma. Tuttavia, non so se un host condiviso cambierà questo valore per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.