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

Importul și Exportul Bazelor de Date MySQL Folosind Linia de Comandă

Stăpânirea operațiunilor de import și export al bazelor de date MySQL din linia de comandă este o abilitate esențială pentru orice administrator de baze de date sau inginer backend. Utilitarul `mysqldump` exportă o bază de date într-un fișier `.sql` portabil care conține toate instrucțiunile DDL și DML necesare pentru a reconstrui complet schema și datele, în timp ce comanda client `mysql` gestionează operațiunea inversă — transmiterea acelui fișier înapoi într-o instanță MySQL activă.

Acest ghid acoperă fiecare scenariu practic: exporturi de baze de date individuale, dump-uri cu mai multe baze de date, backup-uri doar cu structura, transferuri comprimate, gestionarea seturilor de caractere și fluxuri de lucru sigure pentru import — inclusiv cazuri limită care cauzează coruperea silențioasă a datelor sau restaurări eșuate în mediile de producție.

Cerințe preliminare

Înainte de a executa orice comandă din acest ghid, verificați următoarele:

  • MySQL Server (5.7, 8.0 sau 8.4) este instalat și procesul `mysqld` rulează
  • Binarele `mysqldump` și `mysql` se află în `PATH` al sistemului dvs. (confirmați cu `which mysqldump`)
  • Dețineți un cont MySQL cu cel puțin privilegiile `SELECT`, `LOCK TABLES`, `SHOW VIEW` și `TRIGGER` pentru export; `CREATE`, `INSERT`, `ALTER` și `DROP` pentru import
  • Există spațiu suficient pe disc la destinație — un dump comprimat se poate extinde de 5–10 ori la import
  • Aveți acces shell la server (terminal local, SSH sau un mediu de VPS Hosting gestionat)

Exportul bazelor de date cu mysqldump

`mysqldump` este instrumentul canonic de backup logic inclus în MySQL. Acesta serializează obiectele bazei de date într-un script SQL lizibil. Spre deosebire de instrumentele de backup fizic precum Percona XtraBackup, `mysqldump` este agnostic față de motorul de stocare și funcționează pe toate versiunile MySQL și chiar pe fork-urile MariaDB.

1. Exportul unei singure baze de date

“`bash

mysqldump -u [username] -p [database_name] > [filename].sql

“`

Detalii parametri:

  • `-u [username]` — Contul MySQL utilizat pentru conexiune
  • `-p` — Declanșează o solicitare interactivă de parolă (nu transmiteți niciodată parola inline ca `-p[password]` pe sisteme partajate; aceasta este vizibilă în ieșirea `ps aux`)
  • `[database_name]` — Schema țintă de exportat
  • `> [filename].sql` — Redirecționează stdout către fișierul de ieșire

Exemplu:

“`bash

mysqldump -u root -p mydatabase > mydatabase_backup.sql

“`

Aceasta produce un fișier care conține instrucțiunile `CREATE TABLE`, `INSERT` și `ALTER TABLE` suficiente pentru a recrea `mydatabase` de la zero.

Caz limită critic: În mod implicit, `mysqldump` achiziționează o blocare globală de citire (`FLUSH TABLES WITH READ LOCK`) la începutul dump-ului. Pe serverele InnoDB cu trafic ridicat, utilizați în schimb `–single-transaction` pentru a face un snapshot consistent fără a bloca scrierile:

“`bash

mysqldump -u root -p –single-transaction mydatabase > mydatabase_backup.sql

“`

`–single-transaction` funcționează fiabil doar cu tabele InnoDB. Dacă baza de date conține tabele MyISAM, blocarea este inevitabilă.

2. Exportul mai multor baze de date

“`bash

mysqldump -u [username] -p –databases db1 db2 > multiple_databases_backup.sql

“`

Indicatorul `–databases` instruiește `mysqldump` să includă instrucțiunile `CREATE DATABASE` și `USE` în ieșire, făcând dump-ul autoconținut. Fără acest indicator, acele instrucțiuni sunt omise și dump-ul presupune că o bază de date țintă este deja selectată la momentul importului.

Exemplu:

“`bash

mysqldump -u root -p –databases db1 db2 > multiple_databases_backup.sql

“`

3. Exportul tuturor bazelor de date

“`bash

mysqldump -u root -p –all-databases > all_databases_backup.sql

“`

Aceasta exportă fiecare schemă la care utilizatorul care se conectează poate accesa, inclusiv bazele de date de sistem `mysql`, `information_schema` și `performance_schema`. Evitați importul bazelor de date de sistem peste granițele majore ale versiunilor MySQL — schema tabelului de privilegii s-a schimbat semnificativ între MySQL 5.7 și 8.0, iar importul schemei vechi `mysql` într-o instanță 8.0 nouă va corupe autentificarea.

Pentru a exclude schemele de sistem:

“`bash

mysqldump -u root -p –all-databases

–ignore-table=mysql.user

–ignore-table=mysql.db

> all_user_databases_backup.sql

“`

4. Exportul doar al structurii tabelelor (fără date)

“`bash

mysqldump -u root -p –no-data mydatabase > structure_only.sql

“`

Aceasta este de neprețuit pentru controlul versiunilor schemei, revizuirile de cod sau configurarea unui mediu de staging gol. Ieșirea conține doar DDL de tipul `CREATE TABLE`, `CREATE VIEW`, `CREATE PROCEDURE` și similar — fără rânduri `INSERT`.

5. Exportul unor tabele specifice

“`bash

mysqldump -u root -p mydatabase table1 table2 > tables_backup.sql

“`

Rețineți că la exportul unor tabele specifice în acest mod, `mysqldump` nu include instrucțiunile `CREATE DATABASE` sau `USE`. Trebuie să vă asigurați că baza de date țintă există înainte de import.

6. Exportul cu proceduri stocate, triggere și evenimente

În mod implicit, `mysqldump` include triggere, dar omite procedurile stocate, funcțiile și evenimentele programate. Pentru un backup complet al aplicației:

“`bash

mysqldump -u root -p

–routines

–triggers

–events

–single-transaction

mydatabase > full_backup.sql

“`

Uitarea `–routines` este una dintre cele mai frecvente cauze ale restaurărilor eșuate ale aplicațiilor — schema și datele sunt prezente, dar logica de business lipsește.

7. Export comprimat

Direcționați ieșirea direct prin `gzip` pentru a reduce dimensiunea fișierului cu 60–80%:

“`bash

mysqldump -u root -p mydatabase | gzip > mydatabase_backup.sql.gz

“`

Pentru compresie maximă pe baze de date mari (cu costul timpului de CPU):

“`bash

mysqldump -u root -p mydatabase | gzip -9 > mydatabase_backup.sql.gz

“`

Importul bazelor de date cu clientul mysql

Clientul din linia de comandă `mysql` acceptă un fișier SQL prin redirecționarea stdin și execută fiecare instrucțiune secvențial față de serverul țintă.

1. Import într-o bază de date existentă

“`bash

mysql -u [username] -p [database_name] < [filename].sql

“`

Exemplu:

“`bash

mysql -u root -p mydatabase < mydatabase_backup.sql

“`

Important: Dacă fișierul `.sql` a fost exportat cu `–databases` sau `–all-databases`, acesta conține deja directive `CREATE DATABASE` și `USE`. În acest caz, nu specificați un nume de bază de date în linia de comandă — aceasta creează un conflict:

“`bash

mysql -u root -p < all_databases_backup.sql

“`

2. Import într-o bază de date nouă

Baza de date țintă trebuie să existe înainte de a putea importa în ea. MySQL nu o va crea automat dintr-un dump simplu de tabele.

Pasul 1 — Creați baza de date:

“`bash

mysql -u root -p -e "CREATE DATABASE newdatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

“`

Pasul 2 — Importați dump-ul:

“`bash

mysql -u root -p newdatabase < mydatabase_backup.sql

“`

Specificați întotdeauna explicit setul de caractere și colectarea la momentul creării bazei de date. Bazarea pe valorile implicite ale serverului este o sursă frecventă de nepotriviri de codificare, mai ales la migrarea între servere cu configurații `character_set_server` diferite.

3. Importul unui dump comprimat

“`bash

gunzip < mydatabase_backup.sql.gz | mysql -u root -p mydatabase

“`

Sau folosind `zcat` (echivalent pe majoritatea distribuțiilor Linux):

“`bash

zcat mydatabase_backup.sql.gz | mysql -u root -p mydatabase

“`

4. Import cu monitorizarea progresului

Pentru dump-uri mari, clientul standard `mysql` nu oferă niciun feedback. Utilizați `pv` (pipe viewer) pentru a afișa o bară de progres în timp real:

“`bash

pv mydatabase_backup.sql | mysql -u root -p mydatabase

“`

Instalați `pv` cu `apt install pv` sau `yum install pv`. Pe un Server Dedicat care gestionează baze de date de producție de mai mulți gigaocteți, această vizibilitate este esențială din punct de vedere operațional.

mysqldump vs. metode alternative de backup

FuncționalitatemysqldumpmysqlpumpMySQL Shell (util.dumpInstance)Percona XtraBackup
Tip backupLogic (SQL)Logic (SQL)Logic (JSON/SQL)Fizic (binar)
ParalelismSingle-threadedMulti-threadedMulti-threadedMulti-threaded
Backup InnoDB la caldCu `–single-transaction`Cu `–single-transaction`DaDa
Format ieșireSQL simpluSQL simpluFișiere fragmentateFișiere InnoDB brute
Viteza de restaurareLentă (SQL secvențial)ModeratăRapidăFoarte rapidă
Portabilitate între versiuniExcelentăBunăBunăDoar aceeași versiune majoră
Inclus în MySQLDaDa (5.7.8+)Instalare separatăTerță parte
Cel mai bun caz de utilizarePortabilitate, BD mici-mediiDump-uri paraleleScheme cloud/mariBD mari de producție

Pentru mediile care rulează mai multe baze de date de producție pe un VPS cu cPanel gestionat, `mysqldump` rămâne opțiunea cel mai universal suportată datorită compatibilității și simplității sale.

Configurare avansată și cazuri limită

Gestionarea corectă a seturilor de caractere

Nepotrivirile seturilor de caractere sunt responsabile pentru o proporție disproporționată de importuri corupte. Cea mai sigură abordare este să fiți explicit în fiecare etapă:

“`bash

mysqldump -u root -p

–default-character-set=utf8mb4

mydatabase > mydatabase_backup.sql

“`

“`bash

mysql -u root -p

–default-character-set=utf8mb4

mydatabase < mydatabase_backup.sql

“`

Notă: `utf8` în MySQL este un subset de 3 octeți care nu poate stoca caractere Unicode de 4 octeți (emoji, anumite ideograme CJK). Utilizați întotdeauna `utf8mb4` pentru bazele de date noi.

Accelerarea importurilor mari

În mod implicit, MySQL efectuează un commit complet după fiecare instrucțiune `INSERT` din dump. Pentru seturi de date mari, aceasta este extrem de lentă. Adăugați următoarele la începutul sesiunii de import:

“`bash

mysql -u root -p mydatabase <<EOF

SET foreign_key_checks = 0;

SET unique_checks = 0;

SET autocommit = 0;

SOURCE /path/to/mydatabase_backup.sql;

COMMIT;

SET foreign_key_checks = 1;

SET unique_checks = 1;

EOF

“`

Alternativ, exportați cu `–extended-insert` (activat implicit) și `–disable-keys` pentru a grupa inserările și a amâna reconstruirea indexului până după încărcarea datelor.

Automatizarea backup-urilor cu Cron

O intrare de backup automatizat de nivel producție în `/etc/cron.d/mysql-backup`:

“`bash

0 2 * * * root mysqldump -u backup_user -p'StrongPass'

–single-transaction –routines –triggers –events

mydatabase | gzip > /backups/mydatabase_$(date +%F).sql.gz

“`

Utilizați un utilizator MySQL dedicat cu privilegiile minime necesare în loc de `root`. Creați-l cu:

“`sql

CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongPass';

GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, EVENT ON *.* TO 'backup_user'@'localhost';

FLUSH PRIVILEGES;

“`

Securizarea credențialelor cu .my.cnf

Transmiterea parolelor în linia de comandă le expune în istoricul shell-ului și în listele de procese. Stocați credențialele în `~/.my.cnf`:

“`ini

[client]

user=root

password=YourSecurePassword

“`

Setați imediat permisiunile:

“`bash

chmod 600 ~/.my.cnf

“`

Cu aceasta în vigoare, toate comenzile `mysqldump` și `mysql` preiau credențialele automat fără indicatoarele `-u` și `-p`.

Exportul bazelor de date la distanță

Pentru a face dump unei baze de date de pe un server MySQL la distanță:

“`bash

mysqldump -h remote.server.com -P 3306 -u remoteuser -p remotedatabase > remote_backup.sql

“`

Asigurați-vă că instanța MySQL la distanță permite conexiuni de la adresa dvs. IP și că portul 3306 este deschis în firewall. Pentru transferuri criptate, tunelați prin SSH:

“`bash

ssh -L 3307:127.0.0.1:3306 user@remote.server.com -N &

mysqldump -h 127.0.0.1 -P 3307 -u remoteuser -p remotedatabase > remote_backup.sql

“`

Matricea practică de decizie

ScenariuComandă recomandată
Backup complet, doar InnoDB, fără întreruperi`mysqldump –single-transaction –routines –triggers –events`
Migrarea schemei pe un server nou`mysqldump –no-data` + recreare BD + import
Mutarea unei singure baze de date între servere`mysqldump dbgzipssh user@dest "gunzipmysql db"`
Backup toate bazele de date, excludeți schemele de sistem`–all-databases` + `–ignore-table` pentru tabelele de sistem
Restaurare rapidă a unui dump mareDezactivați `foreign_key_checks`, `unique_checks`, `autocommit`
Backup automat nocturnCron + utilizator dedicat backup + credențiale `.my.cnf`
Verificarea integrității backup-uluiImportați într-o bază de date de test și rulați `SHOW TABLE STATUS`

Concluzii tehnice cheie

  • Utilizați întotdeauna `–single-transaction` pentru bazele de date InnoDB pentru a evita blocarea scrierilor aplicației în timpul exportului
  • Specificați întotdeauna explicit `utf8mb4` — nu vă bazați niciodată pe presupunerile privind setul de caractere implicit al serverului
  • Includeți `–routines`, `–triggers` și `–events` în fiecare backup complet al aplicației sau riscați să pierdeți logica de business
  • Nu importați niciodată tabelele schemei de sistem (`mysql.*`) peste granițele majore ale versiunilor MySQL
  • Stocați credențialele în `~/.my.cnf` cu `chmod 600` — nu transmiteți niciodată parolele ca argumente inline
  • Pentru bazele de date care depășesc 10 GB, evaluați `mysqlpump` sau utilitarele de dump paralel ale MySQL Shell, deoarece `mysqldump` va deveni un bottleneck
  • Verificați fiecare backup efectuând o restaurare de test într-un mediu izolat înainte de a vă baza pe el pentru recuperarea în caz de dezastru
  • Când găzduiți mai multe baze de date ale clienților, izolați mediile folosind Panouri de Control VPS separate pentru a preveni accesul între chiriași în timpul operațiunilor de restaurare
  • Asociați strategia de backup a bazei de date cu un Certificat SSL valid pe orice nivel de aplicație web care se conectează la MySQL pentru a preveni interceptarea credențialelor în tranzit

Întrebări frecvente

Care este diferența dintre mysqldump și mysqlpump?

`mysqldump` este single-threaded și produce un singur fișier SQL — fiabil și universal compatibil. `mysqlpump`, introdus în MySQL 5.7.8, suportă exportul paralel al mai multor baze de date și tabele simultan, reducând semnificativ timpul de dump pe serverele multi-core. Cu toate acestea, `mysqlpump` are probleme cunoscute cu backup-urile consistente ale bazelor de date cu motoare mixte și este mai puțin potrivit pentru migrările între versiuni.

Pot importa un dump MySQL 5.7 în MySQL 8.0?

Da, cu rezerve. Datele utilizatorilor și schemele aplicațiilor se importă fără probleme. Cu toate acestea, nu importați niciodată direct baza de date de sistem `mysql` — pluginul de autentificare s-a schimbat de la `mysql_native_password` la `caching_sha2_password` în 8.0, iar importul tabelelor vechi de privilegii va strica autentificarea. Recreați utilizatorii manual folosind instrucțiunile `CREATE USER` și `GRANT`.

De ce eșuează importul meu cu „ERROR 1005: Can’t create table” din cauza constrângerilor de cheie externă?

Aceasta se întâmplă când tabelele sunt importate într-o ordine care violează dependențele de cheie externă. Soluția este să adăugați la începutul sesiunii de import `SET foreign_key_checks = 0;` și să adăugați `SET foreign_key_checks = 1;` după finalizare. Alternativ, exportați cu `–single-transaction` care păstrează integritatea referențială în fișierul dump însuși.

Cum export doar datele fără instrucțiunile CREATE TABLE?

Utilizați indicatorul `–no-create-info`: `mysqldump -u root -p –no-create-info mydatabase > data_only.sql`. Aceasta este utilă când trebuie să reîncărcați date într-o schemă existentă fără a-i modifica structura.

Care este cel mai sigur mod de a transfera un dump MySQL între două servere la distanță?

Direcționați dump-ul direct prin SSH fără a scrie un fișier intermediar pe disc: `mysqldump -u root -p sourcedb | ssh user@destination.server "mysql -u root -p targetdb"`. Aceasta este atât mai rapidă, cât și mai sigură decât copierea unui fișier `.sql` în text simplu, mai ales când operați pe un mediu de Găzduire Web Partajată unde cotele de disc reprezintă o constrângere.

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