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
15.10.2024
3 +1

Cum să listezi bazele de date MySQL prin linia de comandă pe Linux

Listarea tuturor bazelor de date MySQL din linia de comandă se realizează cu o singură instrucțiune SQL — SHOW DATABASES; — executată după autentificarea la serverul MySQL folosind clientul mysql. Aceasta funcționează pe orice distribuție Linux care rulează MySQL 5.7, MySQL 8.x sau un server MariaDB compatibil și necesită fie privilegiul SHOW DATABASES, fie acces de superutilizator.

Acest ghid depășește comanda de bază. Acoperă opțiunile de autentificare, vizibilitatea limitată de privilegii, tipare de scripting non-interactiv, filtrarea schemei de performanță și modurile comune de eșec care îi surprind chiar și pe administratorii experimentați.

Cerințe preliminare

Înainte de a continua, confirmați următoarele:

  • MySQL Server sau MariaDB este instalat și serviciul este activ.
  • Aveți un cont de utilizator cu cel puțin privilegiul SHOW DATABASES, sau vă autentificați ca root.
  • Binarul client mysql este disponibil în PATH al shell-ului dvs. (verificați cu which mysql).

Dacă gestionați un server la distanță — de exemplu, un mediu de VPS Hosting — asigurați-vă, de asemenea, că portul MySQL (implicit 3306) este accesibil sau că vă conectați prin SSH.

Pasul 1: Verificați dacă serviciul MySQL rulează

Înainte de a încerca să vă conectați, confirmați că daemonul este activ:

sudo systemctl status mysql

Pentru instalările MariaDB, numele serviciului diferă:

sudo systemctl status mariadb

Dacă serviciul este oprit, porniți-l:

sudo systemctl start mysql

Un eșec la pornire este aproape întotdeauna explicat în journalctl -xe sau în /var/log/mysql/error.log. Verificați mai întâi acele fișiere înainte de a presupune o problemă de configurare.

Pasul 2: Autentificați-vă la serverul MySQL

Autentificare interactivă standard

mysql -u root -p
  • -u root — specifică numele de utilizator MySQL. Înlocuiți root cu orice cont valid.
  • -p — solicită parola în mod interactiv. Nu transmiteți niciodată parola direct în linia de comandă în producție (de ex., -pMyPassword), deoarece este vizibilă în listele de procese și în istoricul shell-ului.

După introducerea corectă a parolei, apare promptul MySQL:

mysql>

Conectarea la un host la distanță sau la un port non-implicit

mysql -u root -p -h 192.168.1.100 -P 3307
  • -h — specifică IP-ul sau numele de host al serverului la distanță.
  • -P — specifică un număr de port non-implicit.

Utilizarea unui fișier de opțiuni pentru automatizare

Pentru scripturi și sarcini cron, stocați credențialele într-un fișier de opțiuni protejat în loc să le includeți în comandă:

# ~/.my.cnf
[client]
user=root
password=YourSecurePassword

Restricționați permisiunile imediat după crearea fișierului:

chmod 600 ~/.my.cnf

Cu acest fișier în loc, mysql se autentifică fără niciun indicator:

mysql

Pasul 3: Listați toate bazele de date

Odată în shell-ul MySQL, rulați:

SHOW DATABASES;

Exemplu de ieșire pe o instanță MySQL 8 proaspăt instalată:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

Aceste patru scheme de sistem sunt prezente pe fiecare instalare standard MySQL:

SchemăScop
`information_schema`Schemă virtuală doar pentru citire care expune metadate despre toate celelalte scheme, tabele, coloane și privilegii
`mysql`Tabele de grant de bază, date despre fusul orar și configurarea serverului
`performance_schema`Date de instrumentare de nivel scăzut pentru profilarea interogărilor și diagnosticare
`sys`Vizualizări ușor de citit construite pe baza `performance_schema`

Bazele de date create de utilizatori apar alături de aceste scheme de sistem.

Pasul 4: Filtrați lista de baze de date

Filtrare după tiparul numelui

SHOW DATABASES acceptă o clauză LIKE, care este utilă când un server găzduiește zeci de baze de date:

SHOW DATABASES LIKE 'wp_%';

Aceasta returnează doar bazele de date ale căror nume încep cu wp_ — o convenție de denumire comună pentru instalările WordPress.

Interogați information_schema pentru filtrare avansată

Pentru filtrare mai precisă, interogați direct tabelul information_schema.SCHEMATA:

SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.SCHEMATA
WHERE schema_name NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
ORDER BY schema_name;

Această abordare vă permite să filtrați după set de caractere, colație sau orice altă coloană de metadate — ceva ce SHOW DATABASES nu poate face.

Pasul 5: Inspectați o bază de date specifică

Pentru a examina conținutul unei anumite baze de date, schimbați contextul cu USE și apoi listați tabelele sale:

USE database_name;
SHOW TABLES;

Pentru a vedea dimensiunile tabelelor, numărul de rânduri și motoarele de stocare într-o singură interogare:

SELECT
  table_name,
  engine,
  table_rows,
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
WHERE table_schema = 'database_name'
ORDER BY (data_length + index_length) DESC;

Aceasta este mult mai utilă decât SHOW TABLES singur și este tipul de interogare pe care un DBA o rulează înainte de a planifica o strategie de migrare sau backup.

Pasul 6: Ieșiți din shell-ul MySQL

EXIT;

Sau folosiți comanda rapidă de la tastatură Ctrl+D.

Utilizare non-interactivă: Listarea bazelor de date din shell

În pipeline-uri automatizate — scripturi de backup, agenți de monitorizare, hook-uri de deployment — trebuie să recuperați lista de baze de date fără a intra într-o sesiune interactivă.

One-liner cu indicatorul -e

mysql -u root -p -e "SHOW DATABASES;"

Suprimați rândul de antet pentru scripting

mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null

Indicatorul --skip-column-names elimină antetul Database, producând ieșire curată potrivită pentru iterație într-o buclă shell:

for db in $(mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null); do
  echo "Processing: $db"
done

Utilizarea mysqlshow ca alternativă

Utilitarul mysqlshow oferă o prezentare rapidă fără a intra în shell-ul MySQL:

mysqlshow -u root -p

Listează toate bazele de date pe care utilizatorul autentificat le poate vedea și acceptă un argument cu numele bazei de date pentru a intra în detalii la nivel de tabel:

mysqlshow -u root -p database_name

Limitarea privilegiilor: De ce unele baze de date sunt ascunse

Acesta este unul dintre cele mai neînțelese comportamente din MySQL. Când un utilizator nu are privilegiul global SHOW DATABASES, SHOW DATABASES returnează doar bazele de date pentru care acel utilizator deține cel puțin un privilegiu. Aceasta este prin design — este o limită de securitate, nu o eroare.

Implicație practică: Un utilizator de aplicație restricționat poate rula SHOW DATABASES; și poate vedea doar una sau două baze de date, chiar dacă serverul găzduiește cincizeci. Acesta este comportamentul corect. Dacă un utilizator trebuie să vadă lista completă, acordați privilegiul în mod explicit:

GRANT SHOW DATABASES ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

Utilizați acest grant cu moderație. În medii multi-tenant — cum ar fi o configurație de Shared Web Hosting sau un deployment de Dedicated Servers cu mai mulți clienți — expunerea listei complete de baze de date utilizatorilor de aplicații reprezintă un risc de securitate.

MySQL vs. MariaDB: Diferențe de comportament

Atât MySQL cât și MariaDB suportă SHOW DATABASES; și information_schema.SCHEMATA, dar există diferențe subtile care merită cunoscute:

FuncționalitateMySQL 8.xMariaDB 10.x
Sintaxa `SHOW DATABASES`SuportatăSuportată
`information_schema.SCHEMATA`DisponibilDisponibil
Implicit `performance_schema`ActivatActivat (10.5+)
Schema `sys`Inclusă implicitOpțională, nu întotdeauna prezentă
`SHOW DATABASES LIKE`SuportatSuportat
Model de privilegii bazat pe roluriNativ (8.0+)Nativ (10.0.5+)
Binar client `mysql``mysql``mysql` sau `mariadb`

Pe instalările mai noi de MariaDB, binarul canonic poate fi mariadb în loc de mysql, deși un symlink păstrează de obicei compatibilitatea cu versiunile anterioare.

Erori comune și cum să le remediați

ERROR 1045 (28000): Access denied for user

Aceasta înseamnă că autentificarea a eșuat. Verificați din nou numele de utilizator, parola și host-ul. Pentru root pe MySQL 8, plugin-ul de autentificare implicit este caching_sha2_password. Dacă clientul dvs. nu îl suportă, conectați-vă prin socket:

sudo mysql -u root

Aceasta ocolește autentificarea prin parolă când rulați ca utilizatorul Linux root, bazându-se în schimb pe plugin-ul auth_socket sau unix_socket.

ERROR 2002 (HY000): Can't connect to local MySQL server through socket

Daemonul MySQL nu rulează sau calea fișierului socket este greșită. Verificați:

sudo systemctl status mysql
ls -la /var/run/mysqld/mysqld.sock

ERROR 1044 (42000): Access denied for user to database

Utilizatorul este autentificat, dar nu are privilegii pe baza de date țintă. Examinați granturile cu:

SHOW GRANTS FOR 'username'@'host';

Matrice de decizie practică

Utilizați această referință pentru a selecta abordarea potrivită pentru situația dvs.:

ScenariuComandă recomandată
Explorare interactivă`SHOW DATABASES;` în shell-ul `mysql`
Filtrare după prefix de nume`SHOW DATABASES LIKE 'prefix_%';`
Listare bogată în metadateInterogați `information_schema.SCHEMATA`
Scripting shell / automatizare`mysql -e "SHOW DATABASES;" –skip-column-names`
Prezentare rapidă fără shell`mysqlshow -u root -p`
Server la distanță, port non-implicit`mysql -u root -p -h host -P port`
Automatizare fără parolăFișier de opțiuni `~/.my.cnf` cu `chmod 600`
Depanarea problemelor de acces`SHOW GRANTS FOR 'user'@'host';`

Concluzii tehnice cheie

  • SHOW DATABASES; este limitat de privilegii. Un utilizator fără privilegiul global SHOW DATABASES vede doar bazele de date la care are acces explicit — aceasta este o funcție de securitate, nu o configurare greșită.
  • Nu transmiteți niciodată parole ca argumente în linia de comandă în producție. Utilizați -p pentru sesiuni interactive și ~/.my.cnf pentru automatizare.
  • information_schema.SCHEMATA este strict mai puternic decât SHOW DATABASES pentru interogări scriptate sau filtrate.
  • Utilitarul mysqlshow este subutilizat și oferă inspecție rapidă, non-interactivă a bazelor de date și tabelelor.
  • Pe MySQL 8, autentificarea bazată pe socket (sudo mysql) este adesea cea mai rapidă cale de acces root pe un server local.
  • Când gestionați mai multe baze de date pe un VPS cu cPanel sau alt panou de control, managerul de baze de date al panoului este o interfață grafică peste aceleași comenzi SQL — înțelegerea interogărilor de bază vă oferă control deplin când interfața grafică nu este suficientă.
  • Pentru mediile în care accesul la baze de date este legat de SSL Certificates și conexiuni criptate, adăugați --ssl-mode=REQUIRED la invocările clientului mysql pentru a impune TLS în tranzit.

Întrebări frecvente

Î: De ce SHOW DATABASES nu afișează toate bazele de date de pe serverul meu?

R: Contul de utilizator cu care sunteți autentificat nu are privilegiul global SHOW DATABASES. MySQL returnează doar bazele de date pentru care acel utilizator deține cel puțin un privilegiu. Autentificați-vă ca root sau acordați privilegiul SHOW DATABASES pentru a vedea lista completă.

Î: Care este diferența dintre SHOW DATABASES și interogarea information_schema.SCHEMATA?

R: Ambele returnează lista schemelor accesibile, dar information_schema.SCHEMATA expune coloane suplimentare de metadate — setul de caractere implicit, colația implicită — și suportă filtrare SQL completă cu WHERE, ORDER BY și JOIN. Utilizați SHOW DATABASES pentru verificări interactive rapide și information_schema.SCHEMATA pentru interogări scriptate sau analitice.

Î: Cum listez bazele de date pe un server MySQL la distanță fără a deschide o sesiune interactivă?

R: Utilizați indicatorul -e combinat cu opțiunile de host și port:

mysql -u root -p -h remote-host -P 3306 -e "SHOW DATABASES;" --skip-column-names

Î: Pot lista bazele de date MySQL fără a cunoaște parola root?

R: Pe un server local unde aveți acces Linux root, da. Plugin-ul auth_socket al MySQL (sau unix_socket pe MariaDB) autentifică pe baza utilizatorului OS Linux. Rulați sudo mysql și vi se va acorda acces ca utilizatorul MySQL root fără o solicitare de parolă.

Î: SHOW DATABASES funcționează la fel pe MariaDB ca pe MySQL?

R: Sintaxa este identică și regulile de limitare a privilegiilor sunt aceleași. Diferența practică principală este că MariaDB poate să nu includă schema sys implicit, iar pe versiunile mai noi de MariaDB binarul client preferat este mariadb în loc de mysql, deși aliasul mysql este de obicei păstrat pentru compatibilitate.

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