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ționalitate | mysqldump | mysqlpump | MySQL Shell (util.dumpInstance) | Percona XtraBackup |
|---|
| — | — | — | — | — |
|---|
| Tip backup | Logic (SQL) | Logic (SQL) | Logic (JSON/SQL) | Fizic (binar) |
|---|
| Paralelism | Single-threaded | Multi-threaded | Multi-threaded | Multi-threaded |
|---|
| Backup InnoDB la cald | Cu `–single-transaction` | Cu `–single-transaction` | Da | Da |
|---|
| Format ieșire | SQL simplu | SQL simplu | Fișiere fragmentate | Fișiere InnoDB brute |
|---|
| Viteza de restaurare | Lentă (SQL secvențial) | Moderată | Rapidă | Foarte rapidă |
|---|
| Portabilitate între versiuni | Excelentă | Bună | Bună | Doar aceeași versiune majoră |
|---|
| Inclus în MySQL | Da | Da (5.7.8+) | Instalare separată | Terță parte |
|---|
| Cel mai bun caz de utilizare | Portabilitate, BD mici-medii | Dump-uri paralele | Scheme cloud/mari | BD 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
| Scenariu | Comandă 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 db | gzip | ssh user@dest "gunzip | mysql db"` |
|---|
| Backup toate bazele de date, excludeți schemele de sistem | `–all-databases` + `–ignore-table` pentru tabelele de sistem |
|---|
| Restaurare rapidă a unui dump mare | Dezactivați `foreign_key_checks`, `unique_checks`, `autocommit` |
|---|
| Backup automat nocturn | Cron + utilizator dedicat backup + credențiale `.my.cnf` |
|---|
| Verificarea integrității backup-ului | Importaț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.
