Cosa controlla effettivamente l'impostazione "max_allowed_packet" di MySQL?


8

Abbiamo mysqldumprisolto i problemi del database nelle ultime quattro ore, grazie a un guasto che non è stato sufficientemente corretto. Abbiamo riscontrato questi errori:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

Che diamine fa quell'impostazione? Ovviamente non è la dimensione del pacchetto IP, poiché ora l'ho impostato su 32M. Perché esiste?

Risposte:


7

Secondo la pagina 99 di "Comprensione di MySQL Internals" (ISBN 0-596-00957-7) , ecco i paragrafi 1-3 che lo spiegano:

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

Questa è probabilmente la spiegazione più completa di max_allowed_packet che abbia mai visto. Ho scritto quei 3 paragrafi direttamente dal libro.


Grazie per averlo pubblicato. Sembra suggerire che "pacchetto" significa "pacchetto IP".
Randolf Richardson,

Bella risposta. Immagino che questo sia il più vicino possibile a una vera risposta. (Sono ancora abbastanza sicuro che questo non si riferisca ai pacchetti IP. Non menziona IP da nessuna parte, e credo che 65535 byte sia in genere il limite del mondo reale per pacchetti IP anche frammentati.)
Plutor

1

La documentazione lo spiega in dettaglio qui:

"La dimensione massima di un pacchetto o di qualsiasi stringa generata / intermedia. ..."

La documentazione continua anche a trattare i BLOB e come questa impostazione si lega a loro.


Questo non risponde davvero alla mia domanda. Che cos'è un pacchetto in questo contesto? In realtà è un pacchetto IP? Non esiste un modo migliore di un semplice limite di byte per rilevare dati non validi?
Plutor,

A meno che non definiscano "pacchetto" come qualcos'altro (cosa che non sembrano fare nella documentazione), è ragionevole aspettarsi che "pacchetto" si riferisca a un pacchetto IP.
Randolf Richardson,

Ho trovato la definizione in un libro che ho. Ho aggiunto un estratto da quel libro come mia risposta.
RolandoMySQLDBA
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.