«Λάθη» των προγραμματιστών: Ο διακομιστής MySQL έχει φύγει από τη φιλοξενία. Οδηγός αναφοράς MySQL Μεγάλο ή λανθασμένο πακέτο

SpoilerTarget">Spoiler

A.2.2 Σφάλμα διακοπής του διακομιστή MySQL

Όλα όσα αναφέρονται σε αυτήν την ενότητα ισχύουν επίσης για το σχετικό σφάλμα Χάθηκε η σύνδεση με τον διακομιστή κατά τη διάρκεια του ερωτήματος.
Τις περισσότερες φορές, το σφάλμα έχει εξαφανιστεί ο διακομιστής MySQL παρουσιάζεται ως αποτέλεσμα του χρονικού ορίου λήξης της σύνδεσης και του κλείσιμου από τον διακομιστή. Από προεπιλογή, ο διακομιστής κλείνει τη σύνδεση μετά από 8 ώρες αδράνειας. Μπορείτε να αλλάξετε το χρονικό όριο ορίζοντας τη μεταβλητή wait_timeout κατά την εκκίνηση του mysqld.
Ένας άλλος συνηθισμένος λόγος για το σφάλμα εξαφάνισης του διακομιστή MySQL είναι η έκδοση μιας εντολής "close" σε μια σύνδεση MySQL και στη συνέχεια η προσπάθεια εκτέλεσης ενός ερωτήματος στην κλειστή σύνδεση.
Εάν αυτό ληφθεί στο σενάριο, τότε απλώς επαναλάβετε το αίτημα από τον πελάτη, ώστε η σύνδεση να αποκατασταθεί αυτόματα.
Συνήθως, σε αυτήν την περίπτωση εκδίδονται οι ακόλουθοι κωδικοί σφάλματος (ποιοι λαμβάνετε εξαρτάται από το λειτουργικό σύστημα
Κωδικός λάθους Περιγραφή
CR_SERVER_GONE_ERROR Ο πελάτης δεν μπορεί να στείλει αίτημα στον διακομιστή.
CR_SERVER_LOST Ο πελάτης δεν έλαβε σφάλμα κατά την αποστολή του αιτήματος στον διακομιστή, αλλά δεν έλαβε επίσης πλήρη απάντηση (ή τουλάχιστον οποιαδήποτε απάντηση) στο αίτημα.
Θα παρουσιαστεί επίσης σφάλμα εάν κάποιος σκοτώσει ένα νήμα που τρέχει χρησιμοποιώντας τον αριθμό νήματος kill.
Μπορείτε να ελέγξετε ότι η MySQL εκτελείται εκτελώντας την έκδοση mysqladmin και ελέγχοντας το χρόνο λειτουργίας. Εάν το πρόβλημα είναι η κατάρρευση του mysqld, τότε πρέπει να εστιάσετε στην εύρεση της αιτίας της συντριβής. Σε αυτήν την περίπτωση, θα πρέπει πρώτα να ελέγξετε εάν η MySQL θα σκοτωθεί ξανά κατά την επανέκδοση του ερωτήματος (βλ. ενότητα).
Αυτά τα σφάλματα θα εμφανίζονται επίσης όταν αποστέλλεται ένα μη έγκυρο ή πολύ μεγάλο αίτημα στον διακομιστή. Εάν το mysqld λάβει ένα λανθασμένο ή πολύ μεγάλο πακέτο, ο διακομιστής υποθέτει ότι κάτι δεν πάει καλά με τον πελάτη και κλείνει τη σύνδεση. Εάν χρειάζεται να εκτελέσετε μεγάλα ερωτήματα (για παράδειγμα, όταν εργάζεστε με μεγάλες στήλες BLOB), μπορείτε να αυξήσετε το όριο μεγέθους ερωτήματος εκτελώντας το mysqld με την επιλογή -O max_allowed_packet=# (προεπιλογή 1 MB). Πρόσθετη μνήμη εκχωρείται κατόπιν ζήτησης, επομένως το mysqld θα χρησιμοποιεί περισσότερη μνήμη μόνο όταν εκδίδεται ένα μεγάλο ερώτημα ή όταν το mysqld πρέπει να επιστρέψει μια μεγάλη σειρά αποτελεσμάτων!
Εάν θέλετε να υποβάλετε μια αναφορά σφάλματος για αυτό το ζήτημα, φροντίστε να συμπεριλάβετε τις ακόλουθες πληροφορίες:

  • Πληροφορίες σχετικά με το εάν η MySQL έχει καταρρεύσει ή όχι (αυτό μπορεί να προσδιοριστεί από το αρχείο hostname.err (βλ. ενότητα A.4.1 Τι πρέπει να κάνετε εάν η MySQL διακόπτεται συνεχώς).
  • Εάν ένα συγκεκριμένο ερώτημα καταστρέφει το mysqld και οι πίνακες που χρησιμοποιεί ελέγχθηκαν με τον ΠΙΝΑΚΑ ΕΛΕΓΧΟΥ πριν από την εκτέλεση του ερωτήματος, τότε συνιστάται να γράψετε μια δοκιμαστική περίπτωση (βλ. ενότητα Ε.1.6 Δημιουργία δοκιμαστικής περίπτωσης για καταστροφή πίνακα).
  • Η τιμή της μεταβλητής wait_timeout στον διακομιστή (αυτή η τιμή εξάγεται από τις μεταβλητές mysqladmin).
  • Πληροφορίες σχετικά με το εάν δοκιμάσατε να εκτελέσετε το mysqld με --log και να ελέγξετε εάν το ερώτημα που εκδόθηκε εμφανίζεται στο αρχείο καταγραφής.

Αυτό το άρθρο μπορεί να είναι χρήσιμο για όσους εισάγουν μεγάλες βάσεις δεδομένων Denwer(ή στον αποκλειστικό διακομιστή σας). Ας πούμε το μέγεθος της βάσης σας 50 MB. Απλά εισάγοντας ένα ερώτημα σε phpMyAdminστο κεφάλαιο " SQL"Τίποτα δεν θα λειτουργήσει - το πρόγραμμα περιήγησης απλώς θα κολλήσει. Επομένως, η μόνη διέξοδος είναι να χρησιμοποιήσετε εισαγωγή αρχείου SQL. Αλλά εδώ θα σας περιμένει σφάλμα #2006 ή ο διακομιστής έχει εξαφανιστεί. Θα μιλήσω για τη λύση αυτού του προβλήματος σε αυτό το σύντομο άρθρο.

Το πρώτο πράγμα που πρέπει να κάνετε είναι ρυθμίστε την PHPΓια . Χωρίς αυτό από προεπιλογή δεν θα μπορείτε να ανεβάσετε αρχεία μεγέθους π.χ. 50 MB.

Στη συνέχεια, πρέπει να μεταβείτε στις ρυθμίσεις MySQL(στο Denwer είναι " usr\local\mysql-5.5\my.ini") και εκεί αλλάξτε την τιμή της παραμέτρου " max_allowed_packet«για παράδειγμα, 100 Μ, που αντιστοιχεί σε 100 MB:

Max_allowed_packet = 100M

Μετά από όλα αυτά, κάντε επανεκκίνηση MySQLDenwer), κι αλλα σφάλματα 2006 ή ο διακομιστής έχει φύγειδεν θα προκύψει. Εκτός αν, φυσικά, θέλετε να εισαγάγετε μια βάση δεδομένων μεγέθους 150 MB, τότε θα πρέπει να αυξήσετε ξανά τις απαραίτητες παραμέτρους Ρυθμίσεις PHP και MySQL.

Όλα όσα αναφέρονται σε αυτήν την ενότητα ισχύουν επίσης για το σχετικό σφάλμα Χάθηκε η σύνδεση με τον διακομιστή κατά τη διάρκεια του ερωτήματος.

Τις περισσότερες φορές, το σφάλμα έχει εξαφανιστεί ο διακομιστής MySQL παρουσιάζεται ως αποτέλεσμα του χρονικού ορίου λήξης της σύνδεσης και του κλείσιμου από τον διακομιστή. Από προεπιλογή, ο διακομιστής κλείνει τη σύνδεση μετά από 8 ώρες αδράνειας. Μπορείτε να αλλάξετε το χρονικό όριο ορίζοντας τη μεταβλητή wait_timeout κατά την εκκίνηση του mysqld.

Ένας άλλος συνηθισμένος λόγος για το σφάλμα εξαφάνισης του διακομιστή MySQL είναι η έκδοση μιας εντολής "close" σε μια σύνδεση MySQL και στη συνέχεια η προσπάθεια εκτέλεσης ενός ερωτήματος στην κλειστή σύνδεση.

Εάν αυτό ληφθεί στο σενάριο, τότε απλώς επαναλάβετε το αίτημα από τον πελάτη, ώστε η σύνδεση να αποκατασταθεί αυτόματα.

Συνήθως, σε αυτήν την περίπτωση, θα εκδοθούν οι ακόλουθοι κωδικοί σφάλματος (ποιοι λαμβάνετε εξαρτάται από το λειτουργικό σύστημα):

Θα παρουσιαστεί επίσης σφάλμα εάν κάποιος σκοτώσει ένα νήμα που τρέχει χρησιμοποιώντας το killthreadnumber.

Μπορείτε να ελέγξετε ότι η MySQL εκτελείται εκτελώντας την έκδοση mysqladmin και ελέγχοντας το χρόνο λειτουργίας. Εάν το πρόβλημα είναι ένα σφάλμα mysqld, τότε πρέπει να εστιάσετε στην εύρεση της αιτίας της συντριβής. Σε αυτήν την περίπτωση, θα πρέπει πρώτα να ελέγξετε εάν η MySQL θα σκοτωθεί ξανά κατά την επανέκδοση του ερωτήματος (βλ. ενότητα).

Αυτά τα σφάλματα θα εμφανίζονται επίσης όταν αποστέλλεται ένα μη έγκυρο ή πολύ μεγάλο αίτημα στον διακομιστή. Εάν το mysqld λάβει ένα λανθασμένο ή πολύ μεγάλο πακέτο, ο διακομιστής υποθέτει ότι κάτι δεν πάει καλά με τον πελάτη και κλείνει τη σύνδεση. Εάν χρειάζεται να εκτελέσετε μεγάλα ερωτήματα (για παράδειγμα, όταν εργάζεστε με μεγάλες στήλες BLOB), μπορείτε να αυξήσετε το όριο μεγέθους ερωτήματος εκτελώντας το mysqld με την επιλογή -O max_allowed_packet=# (προεπιλογή 1 MB). Πρόσθετη μνήμη εκχωρείται κατόπιν ζήτησης, επομένως το mysqld θα χρησιμοποιεί περισσότερη μνήμη μόνο όταν εκδίδεται ένα μεγάλο ερώτημα ή όταν το mysqld πρέπει να επιστρέψει μια μεγάλη σειρά αποτελεσμάτων!

Εάν θέλετε να υποβάλετε μια αναφορά σφάλματος για αυτό το ζήτημα, φροντίστε να συμπεριλάβετε τις ακόλουθες πληροφορίες:

  • Πληροφορίες σχετικά με το εάν η MySQL έχει καταρρεύσει ή όχι (αυτό μπορεί να προσδιοριστεί από το αρχείο hostname.err (βλ. ενότητα A.4.1 Τι πρέπει να κάνετε εάν η MySQL διακόπτεται συνεχώς).
  • Εάν ένα συγκεκριμένο ερώτημα καταστρέφει το mysqld και οι πίνακες που χρησιμοποιεί ελέγχθηκαν με τον ΠΙΝΑΚΑ ΕΛΕΓΧΟΥ πριν από την εκτέλεση του ερωτήματος, συνιστάται να γράψετε μια δοκιμαστική περίπτωση (βλ. ενότητα Ε.1.6 Δημιουργία δοκιμαστικής περίπτωσης για καταστροφή πίνακα).
  • Η τιμή της μεταβλητής wait_timeout στον διακομιστή (αυτή η τιμή εξάγεται από τις μεταβλητές mysqladmin).
  • Πληροφορίες σχετικά με το εάν δοκιμάσατε να εκτελέσετε το mysqld με --log και να ελέγξετε εάν το ερώτημα που εκδόθηκε εμφανίζεται στο αρχείο καταγραφής.

Το σφάλμα MySQL Server has Gone Away (σφάλμα 2006) μπορεί να προκύψει σε δύο περιπτώσεις.

Λήξη χρονικού ορίου σύνδεσης

Το πιο συνηθισμένο πρόβλημα είναι ότι η σύνδεση λήγει, με αποτέλεσμα ο διακομιστής να την κλείσει. Η λύση είναι πολύ ασήμαντη - αυξήστε το χρονικό όριο wait_timeout στο αρχείο διαμόρφωσης my.cnf. Για να το κάνετε αυτό στο Debian πρέπει να εκτελέσετε:

Sudo nano /etc/mysql/my.cnf

# Άνοιγμα αρχείου ρυθμίσεων MySQL

Στη συνέχεια, ορίστε το χρονικό όριο αναμονής:

Wait_timeout = 600

# Χρόνος αναμονής σε δευτερόλεπτα, μπορεί να ρυθμιστεί έως και 28800 s (8 ώρες)

Μην ξεχάσετε να φορτώσετε ξανά τη βάση δεδομένων:

Επανεκκίνηση Sudo /etc/init.d/mysql

Μερικές φορές, κατά την εκτέλεση μακροχρόνιων προγραμματισμένων εργασιών, μπορεί επίσης να εμφανιστεί το σφάλμα MySQL Server Has Gone Away, και όλα αυτά λόγω του ίδιου χρονικού ορίου σύνδεσης. Σε αυτήν την περίπτωση, το χρονικό όριο δεν μπορεί να αυξηθεί σημαντικά (έως πολλές ώρες το πολύ), καθώς αυτό μπορεί να οδηγήσει στο γέμισμα του buffer με συνδέσεις αναμονής.

Επομένως, είναι καλύτερο να ελέγξετε τη σύνδεση και, εάν είναι απαραίτητο, να επανασυνδεθείτε.

$link = mysql_connect("localhost","root","root"); # Εδώ θα υπάρχουν cron jobs if(!mysql_ping($link)) $link = mysql_connect("localhost","root","root", true);

# Συνδέστε τη βάση δεδομένων και επανασυνδέστε εάν χρειάζεται

Μεγάλη ή λανθασμένη συσκευασία

Το δεύτερο κοινό πρόβλημα είναι ότι ο διακομιστής λαμβάνει ένα μεγάλο ή μη έγκυρο πακέτο και το απορρίπτει. Σε αυτήν την περίπτωση, ο διακομιστής υποθέτει ότι το πρόβλημα βρίσκεται στην πλευρά του πελάτη και κλείνει τη σύνδεση. Για να το λύσετε λοιπόν, πρέπει να αυξήσετε το όριο στο μέγιστο μέγεθος πακέτου, όλα στο ίδιο αρχείο διαμόρφωσης:

Max_allowed_packet = 64M ...

# Αυξήστε το όριο μεγέθους του εισερχόμενου πακέτου, σε MB

Επίσης, μην ξεχάσετε να φορτώσετε ξανά τη βάση δεδομένων.

Το πιο σημαντικό

Αφού επιλύσετε το σφάλμα MySQL Server Has Gone Away, παίξτε με τις παραμέτρους wait_timeout και max_allowed_packet για να λάβετε τα βέλτιστα όρια.


Όλα όσα αναφέρονται σε αυτήν την ενότητα ισχύουν επίσης για το σχετικό σφάλμα Χάθηκε η σύνδεση με τον διακομιστή κατά τη διάρκεια του ερωτήματος.

Τις περισσότερες φορές, το σφάλμα έχει εξαφανιστεί ο διακομιστής MySQL παρουσιάζεται ως αποτέλεσμα του χρονικού ορίου λήξης της σύνδεσης και του κλείσιμου από τον διακομιστή. Από προεπιλογή, ο διακομιστής κλείνει τη σύνδεση μετά από 8 ώρες αδράνειας. Μπορείτε να αλλάξετε το χρονικό όριο ορίζοντας τη μεταβλητή wait_timeout κατά την εκκίνηση του mysqld.

Ένας άλλος συνηθισμένος λόγος για το σφάλμα εξαφάνισης του διακομιστή MySQL είναι η έκδοση μιας εντολής "close" σε μια σύνδεση MySQL και στη συνέχεια η προσπάθεια εκτέλεσης ενός ερωτήματος στην κλειστή σύνδεση.

Εάν αυτό ληφθεί στο σενάριο, τότε απλώς επαναλάβετε το αίτημα από τον πελάτη, ώστε η σύνδεση να αποκατασταθεί αυτόματα.

Συνήθως, σε αυτήν την περίπτωση, θα εκδοθούν οι ακόλουθοι κωδικοί σφάλματος (ποιοι λαμβάνετε εξαρτάται από το λειτουργικό σύστημα):

Θα παρουσιαστεί επίσης σφάλμα εάν κάποιος σκοτώσει ένα νήμα που τρέχει χρησιμοποιώντας τον αριθμό νήματος kill.

Μπορείτε να ελέγξετε ότι η MySQL εκτελείται εκτελώντας την έκδοση mysqladmin και ελέγχοντας το χρόνο λειτουργίας. Εάν το πρόβλημα είναι ένα σφάλμα mysqld, τότε πρέπει να εστιάσετε στην εύρεση της αιτίας της συντριβής. Σε αυτήν την περίπτωση, θα πρέπει πρώτα να ελέγξετε εάν η MySQL θα σκοτωθεί ξανά κατά την επανέκδοση του query().

Αυτά τα σφάλματα θα εμφανίζονται επίσης όταν αποστέλλεται ένα μη έγκυρο ή πολύ μεγάλο αίτημα στον διακομιστή. Εάν το mysqld λάβει ένα λανθασμένο ή πολύ μεγάλο πακέτο, ο διακομιστής υποθέτει ότι κάτι δεν πάει καλά με τον πελάτη και κλείνει τη σύνδεση. Εάν χρειάζεται να εκτελέσετε μεγάλα ερωτήματα (για παράδειγμα, όταν εργάζεστε με μεγάλες στήλες BLOB), μπορείτε να αυξήσετε το όριο μεγέθους ερωτήματος εκτελώντας το mysqld με την επιλογή -O max_allowed_packet=# (προεπιλογή 1 Mb). Πρόσθετη μνήμη εκχωρείται κατόπιν ζήτησης, επομένως το mysqld θα εκχωρεί περισσότερη μνήμη μόνο όταν εκδίδεται ένα μεγάλο ερώτημα ή όταν το mysqld πρέπει να επιστρέψει μια μεγάλη σειρά αποτελεσμάτων!

Μπορεί επίσης να λάβετε πτώση σύνδεσης εάν στείλατε ένα πακέτο μεγαλύτερο από 16 Mb, εάν ο πελάτης σας είναι παλαιότερος από 4.0.8 και ο διακομιστής σας είναι 4.0.8 ή νεότερος.

Εάν θέλετε να υποβάλετε μια αναφορά σφάλματος για αυτό το ζήτημα, φροντίστε να συμπεριλάβετε τις ακόλουθες πληροφορίες:

    Πληροφορίες σχετικά με το εάν η MySQL έχει καταρρεύσει ή όχι (αυτό μπορεί να προσδιοριστεί από το αρχείο hostname.err()).

    Εάν ένα συγκεκριμένο ερώτημα καταστρέφει το mysqld και οι πίνακες που χρησιμοποιεί ελέγχθηκαν χρησιμοποιώντας το CHECK TABLE πριν από την εκτέλεση του ερωτήματος, τότε συνιστάται να γράψετε ένα έλεγχο ελέγχου ().

    Η τιμή της μεταβλητής wait_timeout στον διακομιστή (αυτή η τιμή εξάγεται από τις μεταβλητές mysqladmin).

    Πληροφορίες σχετικά με το εάν δοκιμάσατε να εκτελέσετε το mysqld με --log και να ελέγξετε εάν το ερώτημα που εκδόθηκε εμφανίζεται στο αρχείο καταγραφής.



Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: