15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
09.10.2024

Eroare MySQL: Serverul s-a Oprit Fără a Actualiza Fișierul PID — Ghid Complet de Diagnosticare și Remediere

Eroarea "The server quit without updating PID file" înseamnă că MySQL s-a oprit înainte de a putea scrie identificatorul său de proces în fișierul `.pid` configurat — o oprire bruscă care împiedică daemonul să accepte conexiuni. Această eroare este aproape întotdeauna simptomul unei probleme mai profunde: o configurare greșită în `my.cnf`, o nepotrivire a permisiunilor pe directorul de date, o partiție de disc plină, corupție la nivel de tabel sau un conflict de port cu o a doua instanță MySQL sau MariaDB.

Acest ghid parcurge fiecare cauză rădăcină confirmată, oferă comenzi shell exacte pentru a diagnostica și repara fiecare problemă și acoperă cazuri limită pe care tutorialele generice le omit în mod obișnuit.

Ce face de fapt fișierul PID și de ce absența sa contează

MySQL scrie ID-ul său de proces (PID) într-un fișier text simplu — de obicei `/var/run/mysqld/mysqld.pid` — imediat după inițializarea daemonului. Sistemele init, managerii de servicii (systemd, SysVinit) și instrumentele de monitorizare citesc acest fișier pentru a trimite semnale procesului corect. Dacă MySQL se blochează, iese anormal sau întâlnește o eroare fatală în timpul pornirii, nu ajunge niciodată la punctul de a scrie acel fișier. Managerul de servicii raportează apoi mesajul "quit without updating PID file".

Înțelegerea acestei secvențe este esențială: eroarea fișierului PID este o *consecință*, nu cauza rădăcină. Urmărirea fișierului PID în sine fără a citi mai întâi jurnalul de erori este cea mai frecventă greșeală pe care o fac administratorii.

Cauze rădăcină comune la o privire de ansamblu

Cauza rădăcinăSimptom tipic în jurnalul de eroriSisteme afectate
Cale `pid-file` greșită în `my.cnf``Can't start server: can't create PID file`Toate distribuțiile
Proprietate incorectă pe `/var/run/mysqld``Permission denied` pe directorul PIDDebian/Ubuntu după actualizări
Disc plin sau epuizare inode`No space left on device`Orice server cu `/var` mic
`ibdata1` corupt sau jurnale redo InnoDB`InnoDB: Corruption detected`MySQL 5.7, 8.0, MariaDB
Fișier `.pid` rămas dintr-un crash anterior`A mysqld process already exists`Orice sistem după o repornire forțată
Portul 3306 deja în uz`Can't start server: Bind on TCP/IP port`Configurații cu instanțe multiple
Refuz de politică AppArmor sau SELinux`apparmor="DENIED"` în syslogUbuntu, RHEL/CentOS
`datadir` nepotrivit după actualizarea pachetului`[ERROR] Fatal error: Can't open and lock privilege tables`Actualizări de versiune majoră

Pasul 1 — Citiți mai întâi jurnalul de erori MySQL

Fiecare alt pas depinde de ce spune jurnalul de erori. Nu săriți peste acest pas.

“`bash

Debian/Ubuntu default path

sudo tail -100 /var/log/mysql/error.log

RHEL/CentOS/AlmaLinux default path

sudo tail -100 /var/log/mysqld.log

If you are unsure of the path, query the running config

mysqld –verbose –help 2>/dev/null | grep "log-error"

“`

Căutați linii care conțin `[ERROR]`, `[FATAL]`, `Aborting` sau `InnoDB`. Prima intrare `[ERROR]` din secvența de pornire este aproape întotdeauna cauza reală.

Pasul 2 — Verificați și corectați directorul fișierului PID

Directorul PID este adesea recreat cu proprietarul `root` după o repornire a sistemului, deoarece `/var/run` este o montare `tmpfs` pe distribuțiile Linux moderne. Aceasta este una dintre cauzele cel mai frecvent trecute cu vederea pe Ubuntu 20.04+ și Debian 11+.

“`bash

Check current ownership

ls -ld /var/run/mysqld

Recreate the directory with correct ownership

sudo mkdir -p /var/run/mysqld

sudo chown mysql:mysql /var/run/mysqld

sudo chmod 755 /var/run/mysqld

“`

Pentru a face aceasta persistentă la reporniri pe sistemele systemd, creați o regulă `tmpfiles.d`:

“`bash

echo "d /var/run/mysqld 0755 mysql mysql -" | sudo tee /etc/tmpfiles.d/mysqld.conf

“`

Confirmați că calea PID configurată în `my.cnf` corespunde directorului pe care tocmai l-ați creat:

“`bash

sudo grep -i "pid" /etc/mysql/my.cnf /etc/mysql/mysql.conf.d/*.cnf 2>/dev/null

“`

Pasul 3 — Auditați proprietatea și permisiunile directorului de date

Directorul de date al MySQL trebuie să fie deținut în întregime de utilizatorul de sistem `mysql`. Actualizările de pachete, copierile manuale de fișiere sau restaurările din backup strică frecvent acest lucru.

“`bash

Correct ownership recursively

sudo chown -R mysql:mysql /var/lib/mysql

Correct permissions — directories 750, files 640 is more secure than 755/644

sudo find /var/lib/mysql -type d -exec chmod 750 {} ;

sudo find /var/lib/mysql -type f -exec chmod 640 {} ;

“`

Caz limită important: Dacă ați restaurat un backup folosind `rsync` sau `cp` ca `root`, fișierul socket `/var/lib/mysql/mysql.sock` poate fi de asemenea deținut de root. Ștergeți-l — MySQL îl va recrea la pornire:

“`bash

sudo rm -f /var/lib/mysql/mysql.sock

sudo rm -f /var/run/mysqld/mysqld.sock

“`

Pasul 4 — Verificați spațiul pe disc și disponibilitatea inode

Un disc plin împiedică în mod silențios MySQL să scrie orice fișier, inclusiv fișierul PID și jurnalele binare.

“`bash

Check disk space

df -h

Check inode usage — often overlooked

df -i

Find the largest directories consuming space

sudo du -sh /var/lib/mysql/* | sort -rh | head -20

“`

Dacă partiția este plină, vinovații obișnuiți sunt jurnalele binare (`mysql-bin.000*`), jurnalele generale de interogări lăsate activate accidental sau fișierele core dump. Pentru a purja în siguranță jurnalele binare vechi din MySQL:

“`bash

mysql -u root -p -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"

“`

Pasul 5 — Eliminați fișierele PID rămase și procesele conflictuale

După o panică de kernel, pierdere de curent sau `kill -9`, un fișier PID rămas poate rămâne pe disc. MySQL refuză să pornească dacă găsește unul.

“`bash

Check for a stale PID file

cat /var/run/mysqld/mysqld.pid

Verify whether that PID is actually running

ps aux | grep mysqld

If the process is not running but the file exists, remove it

sudo rm -f /var/run/mysqld/mysqld.pid

“`

Dacă o altă instanță MySQL sau MariaDB rulează efectiv și ocupă portul 3306:

“`bash

sudo ss -tlnp | grep 3306

sudo systemctl stop mariadb

sudo systemctl stop mysql

sudo killall -9 mysqld mysqld_safe

“`

Așteptați trei secunde după oprirea proceselor înainte de a încerca o repornire pentru a permite stărilor TIME_WAIT ale socket-ului kernel să se curețe.

Pasul 6 — Verificați politicile AppArmor și SELinux

Această cauză nu este aproape niciodată menționată în tutorialele de bază, totuși este responsabilă pentru un procent semnificativ din erorile fișierului PID pe sistemele Ubuntu și din familia RHEL.

Ubuntu / AppArmor:

“`bash

sudo dmesg | grep -i apparmor | grep -i mysql

sudo grep -i "DENIED" /var/log/syslog | grep mysql

“`

Dacă AppArmor blochează MySQL, fie actualizați profilul, fie setați-l temporar în modul complain pentru diagnosticare:

“`bash

sudo aa-complain /usr/sbin/mysqld

“`

RHEL / CentOS / AlmaLinux — SELinux:

“`bash

sudo ausearch -c 'mysqld' –raw | audit2why

sudo sealert -a /var/log/audit/audit.log | grep mysqld

“`

O remediere comună pentru problemele de context SELinux după mutarea directorului de date:

“`bash

sudo semanage fcontext -a -t mysqld_db_t "/new/datadir(/.*)?"

sudo restorecon -Rv /new/datadir

“`

Pasul 7 — Diagnosticați și reparați corupția InnoDB

Dacă jurnalul de erori conține mesaje precum `InnoDB: Corruption detected`, `[ERROR] InnoDB: Unable to lock ./ibdata1` sau referințe la inconsistențe ale jurnalului redo, spațiul de tabele InnoDB în sine este deteriorat.

Pentru tabelele MyISAM, utilizați `mysqlcheck`:

“`bash

sudo mysqlcheck –all-databases –repair –user=root –password

“`

Pentru corupția InnoDB, `mysqlcheck` este insuficient. Abordarea corectă este să activați modul de recuperare forțată InnoDB în `my.cnf`:

“`ini

[mysqld]

innodb_force_recovery = 1

“`

Porniți MySQL cu această setare, exportați imediat toate bazele de date, apoi reconstruiți:

“`bash

mysqldump –all-databases –single-transaction -u root -p > full_backup.sql

“`

Incrementați `innodb_force_recovery` de la 1 la 6 doar dacă valorile mai mici nu reușesc să pornească serverul. La nivelul 4 și mai sus, pierderea de date este posibilă — tratați instanța ca doar-citire și exportați imediat.

După un export reușit:

“`bash

sudo systemctl stop mysql

sudo rm -rf /var/lib/mysql/ib_logfile* # Remove corrupt redo logs

Remove innodb_force_recovery from my.cnf

sudo systemctl start mysql

mysql -u root -p < full_backup.sql

“`

Pasul 8 — Izolați erorile de configurare din my.cnf

O singură greșeală de tastare sau o directivă invalidă în `my.cnf` va anula pornirea înainte ca fișierul PID să fie scris. MySQL 8.0+ este mai strict în privința opțiunilor necunoscute decât era 5.7.

“`bash

Validate configuration without starting the server

mysqld –validate-config

Or test with verbose output

mysqld –verbose –help > /dev/null

“`

Faceți o copie de rezervă și reduceți configurația la valorile implicite:

“`bash

sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak.$(date +%F)

“`

Directivele problematice comune după actualizările de versiune majoră includ opțiuni depreciate precum `query_cache_size`, `query_cache_type`, `innodb_file_format` și `innodb_large_prefix` — toate eliminate în MySQL 8.0.

Pasul 9 — Reporniți MySQL și validați

“`bash

sudo systemctl restart mysql

Check service status

sudo systemctl status mysql

Confirm the PID file was written

cat /var/run/mysqld/mysqld.pid

Confirm MySQL is accepting connections

mysqladmin -u root -p status

“`

Pasul 10 — Reinstalarea MySQL (Ultimă soluție cu păstrarea datelor)

Reinstalarea ar trebui să aibă loc doar după epuizarea fiecărui pas de diagnosticare de mai sus. Înainte de a continua, faceți o copie de rezervă a tuturor datelor:

“`bash

If MySQL can start in recovery mode, dump first

mysqldump –all-databases -u root -p > /backup/full_$(date +%F).sql

Copy raw data directory as a secondary backup

sudo rsync -av /var/lib/mysql/ /backup/mysql_datadir_$(date +%F)/

“`

Apoi eliminați și reinstalați:

“`bash

sudo systemctl stop mysql

sudo apt-get remove –purge mysql-server mysql-client mysql-common

sudo apt-get autoremove && sudo apt-get autoclean

sudo rm -rf /var/lib/mysql /etc/mysql

sudo apt-get install mysql-server

sudo mysql_secure_installation

“`

Restaurați din export:

“`bash

mysql -u root -p < /backup/full_$(date +%F).sql

“`

Alegerea mediului de hosting potrivit pentru a preveni recurența

Multe dintre aceste erori — epuizarea discului, resetarea permisiunilor după reporniri, contența de resurse de la serviciile co-găzduite — sunt probleme de infrastructură la fel de mult ca probleme MySQL. Rularea unei baze de date de producție pe un server corect provizionat cu resurse dedicate elimină categorii întregi din aceste erori.

Dacă gestionați o aplicație susținută de MySQL, un mediu de VPS Hosting vă oferă acces root complet, resurse izolate și posibilitatea de a configura `tmpfiles.d`, profiluri AppArmor și suprascrierea unităților systemd fără restricții. Pentru bazele de date cu trafic ridicat care necesită IOPS și RAM garantate, Serverele Dedicate elimină complet orice preocupare legată de partajarea resurselor.

Pentru echipele care preferă un panou de control gestionat în locul administrării directe prin CLI, VPS cu cPanel oferă interfețe de gestionare MySQL alături de acces la nivel de server. Dacă stiva dvs. necesită și configurarea domeniului și DNS, Înregistrarea Domeniilor și Certificatele SSL pot fi gestionate de la același furnizor, reducând costurile operaționale.

Matrice de decizie: Ce remediere să aplicați mai întâi

Simptom în jurnalul de eroriPrima acțiuneTimp estimat de rezolvare
`Permission denied` pe directorul PID sau de dateCorectați proprietatea cu `chown mysql:mysql`2 minute
`No space left on device`Purjați jurnalele binare, extindeți discul5–30 minute
`A mysqld process already exists`Ștergeți fișierul PID rămas, opriți procesul orfan2 minute
`Bind on TCP/IP port: Address already in use`Opriți instanța conflictuală, verificați `ss -tlnp`5 minute
`InnoDB: Corruption detected`Activați `innodb_force_recovery`, exportați, reconstruiți30 minute până la câteva ore
`apparmor="DENIED"` în syslogActualizați profilul AppArmor sau setați modul complain10 minute
`unknown variable` în jurnalRulați `mysqld –validate-config`, corectați `my.cnf`5 minute
Nicio eroare specifică, toate celelalte au eșuatReinstalați MySQL, restaurați din backup1–2 ore

Listă de verificare a punctelor tehnice cheie

  • Citiți întotdeauna `/var/log/mysql/error.log` sau `/var/log/mysqld.log` înainte de a atinge orice fișier — prima linie `[ERROR]` identifică cauza reală.
  • Pe sistemele systemd cu `tmpfs` pe `/var/run`, creați o regulă persistentă `/etc/tmpfiles.d/mysqld.conf` pentru a preveni resetarea permisiunilor la fiecare repornire.
  • După orice `rsync` sau restaurare manuală din backup, rulați `chown -R mysql:mysql /var/lib/mysql` înainte de a încerca să porniți MySQL.
  • Verificați `df -i` (utilizarea inode) alături de `df -h` (spațiu pe disc) — un tabel inode plin produce simptome identice cu un disc plin.
  • Pentru corupția InnoDB, utilizați `innodb_force_recovery` incremental de la 1 în sus; nu săriți direct la nivelul 6.
  • Validați sintaxa `my.cnf` cu `mysqld –validate-config` înainte de repornire — aceasta detectează greșelile de tastare fără o tentativă de pornire eșuată.
  • Eliminați directivele depreciate din MySQL 5.7 (`query_cache_*`, `innodb_file_format`) înainte de actualizarea la MySQL 8.0.
  • Pe Ubuntu, verificați refuzurile AppArmor în `/var/log/syslog`; pe RHEL/AlmaLinux, verificați SELinux cu `ausearch -c mysqld`.

Întrebări frecvente

Care este cel mai rapid mod de a afla de ce MySQL nu a reușit să pornească?

Rulați `sudo tail -50 /var/log/mysql/error.log` și căutați prima linie care conține `[ERROR]` sau `[FATAL]`. Acea singură linie identifică cauza rădăcină în marea majoritate a cazurilor și determină ce remediere să aplicați.

De ce directorul PID pierde permisiunile după o repornire?

Pe distribuțiile Linux care utilizează `tmpfs` pentru `/var/run` (care include Ubuntu 18.04+ și Debian 10+), întregul arbore `/var/run` este reconstruit în memorie la pornire. Orice director nedefinit în `/etc/tmpfiles.d/` este recreat ca `root:root`. Remedierea este să adăugați o regulă `tmpfiles.d`: `echo "d /var/run/mysqld 0755 mysql mysql -" | sudo tee /etc/tmpfiles.d/mysqld.conf`.

Pot recupera datele dacă MySQL nu pornește deloc din cauza corupției InnoDB?

Da, în majoritatea cazurilor. Setați `innodb_force_recovery = 1` în `my.cnf`, porniți MySQL și rulați imediat `mysqldump –all-databases`. Dacă nivelul 1 nu pornește serverul, incrementați la 2, apoi 3 și așa mai departe. La nivelurile 4–6, unele date pot fi irecuperabile, dar majoritatea tabelelor sunt de obicei intacte.

Cum previn ca "no space left on device" să oprească din nou MySQL?

Activați expirarea jurnalului binar: setați `binlog_expire_logs_seconds = 604800` (7 zile) în `my.cnf`. În plus, dezactivați jurnalul general de interogări în producție (`general_log = 0`) și configurați o alertă de utilizare a discului la 80% capacitate prin sistemul dvs. de monitorizare.

Apare această eroare și pe MariaDB și este remedierea aceeași?

Da. MariaDB utilizează același mecanism de fișier PID și aceeași structură de director de date ca MySQL. Toți pașii de diagnosticare din acest ghid se aplică direct la MariaDB, cu singura diferență că numele serviciului este `mariadb` în loc de `mysql` în comenzile `systemctl`, iar jurnalul de erori poate fi localizat la `/var/log/mariadb/mariadb.log` în funcție de distribuție.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți