napaka: 'Ne morem se povezati z lokalnim strežnikom MySQL prek vtičnice '/var/run/mysqld/mysqld.sock' (2)' -- Manjka /var/run/mysqld/mysqld.sock

Moja težava se je začela s tem, da se nisem mogel več prijaviti kot root v svoji namestitvi mysql. Poskušal sem zagnati mysql brez vklopljenih gesel... vendar kadar koli sem zagnal ukaz

# mysqld_safe --skip-grant-tables &

se mi nikoli ni vrnil poziv. Poskušal sem slediti [tem navodilom za obnovitev gesla] (http://www.cyberciti.biz/tips/recover-mysql-root-password.html).

Zaslon je videti takole:

root@jj-SFF-PC:/usr/bin# mysqld_safe --skip-grant-tables
120816 11:40:53 mysqld_safe Logging to syslog.
120816 11:40:53 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

in ne dobim poziva za začetek vnosa ukazov SQL za ponastavitev gesla.

Ko ga ugasnem s pritiskom CTRL + C, dobim naslednje sporočilo:

error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'

Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists!

Če ukaz ponovim in ga pustim dovolj dolgo, dobim naslednjo serijo sporočil:

root@jj-SFF-PC:/run/mysqld# 120816 13:15:02 mysqld_safe Logging to syslog.
120816 13:15:02 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120816 13:16:42 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

[1]+  Done                    mysqld_safe --skip-grant-tables
root@jj-SFF-PC:/run/mysqld#

Toda če se nato poskušam prijaviti kot root z ukazom:

# mysql -u root

dobim naslednje sporočilo o napaki:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Preveril sem in datoteka /var/run/mysqld/mysqld.sock ne obstaja. Mapa obstaja, datoteka pa ne.

Prav tako ne vem, ali to pomaga ali ne, vendar sem pognal find / -name mysqld in dobil sem:

/var/run/mysqld - folder
/usr/sbin/mysqld - file
/run/mysqld - folder

Sem novinec v Linuxu in MySQL, zato ne vem, ali je to normalno ali ne. Vendar sem vključil te informacije samo v primeru, da bi pomagale.

Končno sem se odločil, da odstranim in ponovno namestim mysql.

apt-get remove mysql-server
apt-get remove mysql-client
apt-get remove mysql-common
apt-get remove phpmyadmin

Po ponovni namestitvi vseh paketov v enakem vrstnem redu kot zgoraj sem med namestitvijo phpmyadmina dobil enako napako:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Zato sem ponovno poskusil odstraniti/novo namestiti. Tokrat sem po odstranitvi paketov tudi ročno preimenoval vse datoteke in imenike mysql v mysql.bad na njihovih lokacijah.

/var/lib/mysql 
/var/lib/mysql/mysql
/var/log/mysql
/usr/lib/perl5/DBD/mysql
/usr/lib/perl5/auto/DBD/mysql
/usr/lib/mysql
/usr/bin/mysql
/usr/share/mysql
/usr/share/dbconfig-common/internal/mysql
/etc/init.d/mysql
/etc/apparmor.d/abstractions/mysql
/etc/mysql

Nato sem poskušal ponovno namestiti paketa mysql-server in mysql-client. Vendar sem opazil, da me ne pozove k vpisu gesla. Ali ne bi moralo vprašati za geslo administratorja?

Rešitev

Če želite poiskati vse vtičnice v sistemu, zaženite:

sudo find / -type s

Moj strežniški sistem Mysql je imel odprto vtičnico na naslovu /var/lib/mysql/mysql.sock

Ko ugotovite, kje je odprta vtičnica, dodajte ali uredite vrstico v datoteko /etc/my.cnf s potjo do datoteke vtičnice:

socket=/var/lib/mysql/mysql.sock

Včasih zagonska skripta sistema, ki je zagnala izvršilno datoteko ukazne vrstice, določi zastavico --socket=path. Ta zastavica lahko prekrije lokacijo v datoteki my.cnf, zaradi česar vtičnica ne bo najdena tam, kjer je navedeno v datoteki my.cnf. Ko boste poskušali zagnati odjemalca ukazne vrstice mysql, bo ta prebral datoteko my.cnf, da bi našel vtičnico, vendar je ne bo našel, ker se razlikuje od mesta, kjer jo je ustvaril strežnik. Če vam ni pomembno, kje se nahaja vtičnica, bi moralo delovati samo spreminjanje my.cnf, da se ujema.

Nato ustavite proces mysqld. Način, kako to storite, se razlikuje glede na sistem.

Če ste super uporabnik v sistemu Linux, poskusite z enim od naslednjih načinov, če ne poznate posebne metode, ki jo uporablja vaša namestitev Mysql:

  • service mysqld stop
  • /etc/init.d/mysqld stop
  • mysqladmin -u root -p shutdown
  • Nekateri sistemi niso nastavljeni tako, da bi imeli eleganten način za zaustavitev mysql (ali pa se mysql iz nekega razloga ne odziva), zato lahko mysql za silo prekinete z:
    • en korak: pkill -9 mysqld
    • v dveh korakih (najmanj zaželeno):
      • Poiščite identifikacijsko številko procesa mysql z pgrep mysql ali ps aux | grep mysql | grep -v grep
      • Ob predpostavki, da je ID procesa 4969, ga zaključite z kill -9 4969

Ko to storite, boste morda želeli poiskati datoteko pid v /var/run/mysqld/ in jo izbrisati

Prepričajte se, da so dovoljenja na vtičnici takšna, da lahko uporabnik mysqld, ki se izvaja kot vtičnica, bere/pisuje vanjo. Enostaven preizkus je, da ga odprete za popolno branje/pisanje in preverite, ali še vedno deluje:

chmod 777 /var/run/mysqld/mysqld.sock

Če to odpravi težavo, lahko po potrebi prilagodite dovoljenja in lastništvo vtičnice glede na varnostne nastavitve.

Prav tako mora biti imenik, v katerem se nahaja vtičnica, dostopen uporabniku, ki izvaja proces mysqld.

Komentarji (13)

Rešitev je veliko lažja.

  1. Najprej morate poiskati (v terminalu z "sudo find / -type s"), kje se nahaja vaša datoteka mysql.sock. V mojem primeru je bila v datoteki /opt/lampp/var/mysql/mysql.sock
  2. Odprite terminal in izdate sudo Nautilus
    To zažene vašega upravitelja datotek s privilegiji super uporabnika
  3. V programu Nautilus pojdite do mesta, kjer se nahaja datoteka `mysql.sock
  4. Z desno tipko miške kliknite na datoteko in izberite Make Link
  5. Datoteko s povezavo preimenujte v mysqld.sock, nato desno kliknite na datoteko in jo *izrežite
  6. Pojdite v /var/run in ustvarite mapo z imenom mysqld ter jo vpišite
  7. Sedaj desno kliknite in prilepite datoteko s povezavo
  8. Voila! Zdaj boste imeli datoteko mysqld.sock na naslovu /var/run/mysqld/mysqld.sock :)
Komentarji (7)

Soočil sem se z isto napako in ugotovil, da je bila posledica nadgradnje paketov, Torej po ponovnem zagonu sistema sem odpravil napako.

Mislim, da se je napaka pojavila zaradi posodobitve knjižnic sql/paketov, zato poskusite to, če opravljate nadgradnjo :)

Komentarji (1)