Notizie e guide
Come Importare ed Esportare Database MySQL e MariaDB
Per esportare un database MySQL esegui mysqldump e redirigi l'output su dump.sql; per importarlo esegui mysql -u utente -p nome_db < dump.sql, in un database già creato. Con MariaDB i comandi nativi sono mariadb-dump e mariadb, con la stessa sintassi. Serie verificate al 27 ottobre 2026: MySQL 8.4 e 9.7 LTS, MariaDB 11.8 e 12.3 LTS.
Rackone · 13 min di lettura · Aggiornato il
In questo articolo
Preparazione dell'ambiente per l'import/export dei database
Un database si esporta con mysqldump e si importa con il client mysql. Nei comandi di questa guida utente, nome_db e dump.sql sono segnaposto: sostituiscili con il tuo account, il tuo database e il tuo file.
mysqldump -u utente -p nome_db > dump.sql
mysql -u utente -p nome_db < dump.sql
Il secondo comando richiede che nome_db esista già. I comandi sono verificati sui manuali di MySQL 8.4 LTS e 9.7 LTS e sulla documentazione di MariaDB 11.8 LTS e 12.3 LTS, al 27 ottobre 2026. MySQL 8.0 è a fine vita da aprile 2026 (note di rilascio) e qui non è coperto.
- Installa in produzione una serie LTS: MySQL 8.4 o 9.7, MariaDB 11.8 o 12.3.
- Usa un account con i privilegi giusti. mysqldump richiede SELECT sulle tabelle, SHOW VIEW per le viste, TRIGGER per i trigger, LOCK TABLES se non usi
--single-transactione PROCESS se non usi--no-tablespaces, come indica il manuale di MySQL 8.4 su mysqldump. Per ricaricare un dump servono i privilegi per eseguire le istruzioni che contiene, per esempio CREATE. - Controlla di avere abbastanza spazio libero per il file di dump.
- Usa gli strumenti da riga di comando del tuo server. In MySQL sono
mysqldumpemysql. In MariaDB i nomi nativi sonomariadb-dumpemariadb, mentremysqldumpemysqlrestano come collegamenti simbolici su Linux e come binari alternativi su Windows, deprecati da MariaDB 11.0.1. - Crea un backup completo del database esistente prima di ogni import o modifica.
Per eseguire i comandi sul server remoto, collegati via SSH seguendo la guida a SSH.
Esportazione di database MySQL e MariaDB con mysqldump
Con mysqldump esporti un database in un file SQL che contiene le istruzioni per ricreare tabelle e dati. Il comando scrive sull'output standard, quindi la redirezione dell'output manda il risultato nel file.
Per un database:
mysqldump -u utente -p nome_db > dump.sql
Per alcune tabelle, elencate dopo il nome del database:
mysqldump -u utente -p nome_db tabella1 tabella2 > dump.sql
Per più database serve --databases, che aggiunge al dump le istruzioni CREATE DATABASE e USE:
mysqldump -u utente -p --databases nome_db1 nome_db2 > dump.sql
Per tutti i database del server:
mysqldump -u utente -p --all-databases --routines --events > all_databases.sql
In MySQL 8.4 e 9.7, per includere routine ed eventi in un dump --all-databases, aggiungi --routines ed --events. Per esportare solo la struttura, senza le righe, aggiungi --no-data al comando.
Le opzioni che contano
Le opzioni di mysqldump decidono se il dump blocca le tabelle, quanta memoria usa e cosa contiene.
--single-transaction: produce un dump coerente delle tabelle InnoDB senza bloccarle. Durante il dump nessuna connessione deve eseguire ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE o TRUNCATE TABLE. Non si combina con--lock-tables.--quick: legge le righe una alla volta, senza caricare in memoria l'intero insieme di righe della tabella. È già attivo dentro--opt, che è attivo di default. Per le tabelle grandi si abbina a--single-transaction.--add-drop-table: scrive un DROP TABLE prima di ogni CREATE TABLE. Fa parte di--opt.--set-gtid-purged=OFF: toglie dal dump le istruzioni sui GTID, utile nei server con GTID quando il dump è parziale.--result-file: scrive l'output nel file indicato. Su Windows evita la conversione dei caratteri di fine riga.
mariadb-dump: i comandi di MariaDB
mariadb-dump ha la stessa sintassi di mysqldump:
mariadb-dump -u utente -p nome_db > dump.sql
In MariaDB --routines ed --events sono disattivate per impostazione predefinita: aggiungile se vuoi includere routine ed eventi, anche per un solo database. L'opzione --dir esegue il dump parallelo di più database ed è disponibile da MariaDB 11.5. L'opzione --system esporta le tabelle di sistema, per esempio utenti e plugin.
I nomi dei comandi cambiano da MySQL a MariaDB, le opzioni restano le stesse.
| Operazione | mysqldump e mysql | mariadb-dump e mariadb |
|---|---|---|
| Esportare un database | mysqldump -u utente -p nome_db > dump.sql | mariadb-dump -u utente -p nome_db > dump.sql |
| Importare un dump | mysql -u utente -p nome_db < dump.sql | mariadb -u utente -p nome_db < dump.sql |
| Importare dalla console | source dump.sql | source dump.sql |
| Esportare alcune tabelle | mysqldump -u utente -p nome_db tabella1 tabella2 > dump.sql | mariadb-dump -u utente -p nome_db tabella1 tabella2 > dump.sql |
| Esportare più database | mysqldump -u utente -p --databases nome_db1 nome_db2 > dump.sql | mariadb-dump -u utente -p --databases nome_db1 nome_db2 > dump.sql |
| Esportare tutto il server con routine ed eventi | mysqldump -u utente -p --all-databases --routines --events > all_databases.sql | mariadb-dump -u utente -p --all-databases --routines --events > all_databases.sql |
| Esportare solo la struttura | mysqldump -u utente -p --no-data nome_db > dump.sql | mariadb-dump -u utente -p --no-data nome_db > dump.sql |
| Comprimere con gzip | mysqldump -u utente -p nome_db | gzip > dump.sql.gz | mariadb-dump -u utente -p nome_db | gzip > dump.sql.gz |
| Ripristinare da gzip | gunzip -c dump.sql.gz | mysql -u utente -p nome_db | gunzip -c dump.sql.gz | mariadb -u utente -p nome_db |
| Esportare le tabelle di sistema | nessuna opzione equivalente in mysqldump | opzione --system |
| Esportare più database in parallelo | con MySQL Shell | opzione --dir, da MariaDB 11.5 |
Importazione di database MySQL e MariaDB da file SQL
Il dump si ricarica con il client mysql, e la procedura dipende da come lo hai esportato.
Un dump fatto con --databases o --all-databases contiene già CREATE DATABASE e USE, quindi non indichi il database:
mysql -u utente -p < dump.sql
Se hai esportato senza --databases e senza --all-databases, il dump non contiene CREATE DATABASE e USE. Crea prima il database, dalla console di MySQL:
CREATE DATABASE IF NOT EXISTS nome_db;
Poi importa il file indicando il database sulla riga di comando:
mysql -u utente -p nome_db < dump.sql
Se importi dalla console, seleziona il database con USE e carica il file con source:
USE nome_db;
source dump.sql
In MariaDB il client si chiama mariadb:
mariadb -u utente -p nome_db < dump.sql
mariadb-import non importa i dump SQL: carica tabelle da file di testo con LOAD DATA, e il nome del file deve essere quello della tabella. Con un dump creato da mariadb-dump --dir si usa mariadb-import --dir, disponibile da MariaDB 11.6.
Dopo l'import controlla tabelle e dati:
SHOW TABLES;
SELECT * FROM nome_tabella LIMIT 10;
Se un pacchetto supera max_allowed_packet, alzalo sul client e sul server. Il default è 16MB sul client e 64MB sul server, il massimo è 1GB (pagina del manuale sui pacchetti troppo grandi). Sul client lo passi come opzione:
mysql -u utente -p --max_allowed_packet=32M nome_db < dump.sql
Sul server lo imposti nella sezione [mysqld] del file di configurazione:
max_allowed_packet=128M
Con l'opzione --force l'import continua dopo un errore SQL. Il risultato resta parziale, e per questo conviene usarla solo quando sai già quali istruzioni possono fallire.
Con le opzioni predefinite il dump contiene DROP TABLE prima di ogni CREATE TABLE: durante l'import il client elimina le tabelle presenti nel file, con i dati che contengono, e le ricrea dal dump. Le altre tabelle restano come sono. Fai prima un backup del database di destinazione.
Su Windows
In PowerShell il carattere < è riservato e il comando non funziona. Esegui il comando tramite cmd.exe:
cmd.exe /c "mysql -u utente -p nome_db < dump.sql"
Secondo il manuale di MySQL, con PowerShell su Windows il dump salvato con la redirezione ha codifica UTF-16, che non è ammessa come set di caratteri di connessione, e non si ricarica. In esportazione usa --result-file, che crea l'output in ASCII:
mysqldump -u utente -p --result-file=dump.sql nome_db
Quali errori dà l'import e come si risolvono?
Cerca nella tabella il codice o il messaggio che vedi.
| Errore | Cosa vuol dire | Cosa fare |
|---|---|---|
| 1045, Access denied for user (using password: NO o YES) | La password manca o è sbagliata, oppure nessun account corrisponde a utente e host | Indica la password giusta e usa l'account creato per l'host da cui ti colleghi |
| 1044, Access denied for user to database | L'utente non ha privilegi sul database | Concedi i privilegi sul database, compresi quelli per eseguire le istruzioni del dump |
| 1049, Unknown database | Il dump non contiene CREATE DATABASE e il database non esiste | Crea il database prima dell'import |
| 1050, Table already exists | Il dump è stato esportato senza DROP TABLE, per esempio con --compact | Riesporta con --add-drop-table, che fa parte di --opt |
| 1153, Got a packet bigger than max_allowed_packet | Un pacchetto supera il limite di max_allowed_packet | Alza max_allowed_packet sul client e sul server |
| 2006, MySQL server has gone away | Il server riceve un pacchetto troppo grande o fuori sequenza e chiude la connessione | Alza max_allowed_packet sul client e sul server |
| 2013, Lost connection to MySQL server during query | La connessione è stata chiusa, spesso per un timeout del server | Controlla prima wait_timeout: il server chiude le connessioni inattive dopo otto ore di default |
| 1418, funzione senza DETERMINISTIC, NO SQL o READS SQL DATA | Il binary log è attivo e la funzione non dichiara nessuna di queste caratteristiche | Dichiara una delle tre caratteristiche nella funzione |
| 1419, You do not have the SUPER privilege and binary logging is enabled | Il binary log è attivo e all'account manca SET_ANY_DEFINER, che serve in aggiunta a CREATE ROUTINE o ALTER ROUTINE | Concedi SET_ANY_DEFINER in aggiunta a CREATE ROUTINE o ALTER ROUTINE; in alternativa imposta log_bin_trust_function_creators a 1, che il manuale chiama meno sicuro |
| 1273, Unknown collation utf8mb4_0900_ai_ci | Il dump viene da MySQL 8.4, che la usa di default, e MariaDB la supporta dalla 11.4.5 | Il supporto è arrivato con MariaDB 11.4.5; prova l'import su un server di test prima della produzione |
| Caratteri sbagliati dopo l'import | Il dump non contiene SET NAMES (succede con --compact), oppure è un file UTF-16 prodotto da PowerShell | Indica --default-character-set sul client e, su Windows, esporta con --result-file |
| Access denied; you need (at least one of) the ... privilege(s), durante l'export | mysqldump richiede PROCESS se non usi --no-tablespaces | Aggiungi --no-tablespaces oppure concedi PROCESS |
| Access denied; you need (at least one of) the ... privilege(s), durante l'import di un dump con GTID | Il dump contiene SET @@SESSION.sql_log_bin=0, che serve un privilegio riservato | Riesporta con --set-gtid-purged=OFF |
| Access denied; you need (at least one of) the ... privilege(s), durante l'import con DEFINER | Un account può indicare come DEFINER solo se stesso, senza il privilegio SET_ANY_DEFINER | Concedi SET_ANY_DEFINER, oppure esporta con MySQL Shell e l'opzione strip_definers |
Ottimizzazione e automazione del processo di backup dei database
Per automatizzare il backup con cron, pianifica il comando e tieni le credenziali in un option file protetto.
Metti le credenziali nella sezione
[client]di~/.my.cnf. Con-psenza valore il comando chiede la password a terminale, e in un cron resta in attesa.[client] user=utente password=password_sicuraImposta i permessi del file a 600, uno dei valori indicati dal manuale di MySQL sulla sicurezza delle password:
chmod 600 ~/.my.cnfIn alternativa
mysql_config_editorsalva le credenziali cifrate in.mylogin.cnf.Pianifica il backup con una riga di crontab. Questa riga esegue il backup ogni giorno alle 2:00. Proteggi il
%con la barra inversa.0 2 * * * /usr/bin/mysqldump --single-transaction nome_db > /percorso/backup/nome_db_$(date +\%Y\%m\%d).sqlIl dump contiene i dati del database, spesso dati personali: salvalo in una cartella leggibile solo dal tuo utente.
Comprimi il dump con gzip in pipe. I comandi seguenti con
-ue-psono da riga di comando; in un cron usa l'option file. Per ripristinare decomprimi congunzip -c, o conzcat, che è equivalente:mysqldump -u utente -p nome_db | gzip > dump.sql.gzgunzip -c dump.sql.gz | mysql -u utente -p nome_dbRuota i backup, conservando un numero limitato di copie recenti:
- giornaliere per l'ultima settimana
- settimanali per l'ultimo mese
- mensili per l'ultimo anno
Verifica i backup con un ripristino di prova.
mysqlcheckcontrolla le tabelle sul server, non il file di dump, quindi non verifica un backup. Ripristina periodicamente l'ultimo dump su un server di test e confronta tabelle e righe con l'origine.Archivia i backup su un server remoto o su un servizio cloud, cifrati, secondo la regola 3-2-1, e scegli per quanto tempo conservarli in base ai dati che il database contiene.
Monitora i backup con notifiche in caso di fallimento o di spazio su disco in esaurimento.
Per i database grandi esistono strumenti diversi da mysqldump. Percona XtraBackup 8.4 esegue backup fisici a caldo di MySQL 8.4 e Percona Server 8.4. Non supporta MySQL 8.0 né 9.x, e durante la copia dei dati non InnoDB blocca le tabelle InnoDB. Per MariaDB lo strumento è mariadb-backup.
MySQL Shell esegue dump paralleli e compressi con util.dumpInstance e util.dumpSchemas, e li ricarica con util.loadDump(): il manuale di mysqldump consiglia di considerarlo. Il formato dei suoi dump non è un file .sql da passare al client mysql. Anche mysqlpump è stato rimosso in MySQL 8.4, e il manuale indica mysqldump o MySQL Shell al suo posto.
Potenzia la gestione dei tuoi database con Rackone
Per i database in produzione una VPS Linux ti dà accesso root e la distribuzione fra Ubuntu, Debian e Rocky Linux, nei data center della rete Edge di Rackone in Italia. Per database grandi o in alta affidabilità valuta il server dedicato.
Domande frequenti
Qual è la differenza tra MySQL e MariaDB?
MariaDB è un fork di MySQL creato dagli sviluppatori originali di MySQL come sostituto compatibile. Per import ed export la sintassi è la stessa, ma in MariaDB i comandi nativi si chiamano mariadb-dump e mariadb, mentre i nomi mysqldump e mysql restano come collegamenti simbolici su Linux e come binari alternativi su Windows, deprecati da MariaDB 11.0.1.
Posso importare un database MySQL in MariaDB e viceversa?
Sì, nella maggior parte dei casi un dump di MySQL si importa in MariaDB e viceversa, ma ci sono differenze da controllare. La collation utf8mb4_0900_ai_ci di MySQL 8.4 è supportata da MariaDB dalla 11.4.5, e conviene provare l'import su un server di test. Il tipo JSON di MariaDB è un alias di LONGTEXT. I GTID dei due server non sono compatibili. Gli utenti MySQL creati con la password SHA256 non sono utilizzabili in MariaDB 11.8.
Quanto tempo richiede l'esportazione di un database di grandi dimensioni?
Il tempo per esportare un database dipende dalla dimensione dei dati e dalle prestazioni del server. Per esportare le tabelle InnoDB senza bloccarle usa --single-transaction; per le tabelle grandi il manuale di MySQL consiglia di abbinarla a --quick. MySQL Shell, in alternativa, esegue dump paralleli con 4 thread di default.
È sicuro eseguire un'importazione su un database esistente?
Non senza precauzioni: l'import elimina e ricrea le tabelle contenute nel dump, con i loro dati, perché con le opzioni predefinite il dump esegue DROP TABLE prima di ogni CREATE TABLE. Le altre tabelle del database restano al loro posto. Prima fai un backup del database di destinazione e, se puoi, prova su un database vuoto.
Come posso verificare se l'importazione è andata a buon fine?
Per verificare un import esegui SHOW TABLES per l'elenco delle tabelle e SELECT COUNT(*) sulle tabelle principali, confrontando il risultato con il database di origine. Un campione di righe si legge con SELECT e LIMIT. La prova completa è il ripristino del dump su un server di test.
Posso automatizzare il processo di backup?
Sì, il backup di un database MySQL o MariaDB si automatizza con cron su Linux. La password va in un option file con permessi 600 e non in -p nel comando, perché in un cron l'opzione -p senza valore resta in attesa della password. Su Windows puoi usare l'Utilità di pianificazione.
Come gestisco le differenze di versione durante l'importazione?
Le differenze di versione si gestiscono all'export. Se il dump è fatto con un mysqldump recente e deve essere ricaricato in un server MySQL molto vecchio, il manuale di MySQL suggerisce di esportare con l'opzione --skip-opt. Se il server di destinazione è MariaDB, controlla collation e GTID. In ogni caso prova il ripristino su un server di test prima di toccare la produzione.
mariadb-import importa un file .sql?
No, mariadb-import non importa i dump SQL: carica tabelle da file di testo con LOAD DATA, e il nome di ogni file deve coincidere con quello della tabella di destinazione. Per importare un dump .sql usa il client mariadb: mariadb -u utente -p nome_db < dump.sql.
Fonti
- MySQL 8.4 Reference Manual, mysqldump, consultata il
- MySQL 9.7 Reference Manual, mysqldump, consultata il
- MySQL 8.4 Reference Manual, mysqldump SQL-Format Backup, consultata il
- MySQL 8.4 Reference Manual, Reloading SQL-Format Backups, consultata il
- MySQL 8.4 Reference Manual, Executing SQL Statements from a Text File, consultata il
- MySQL 8.4 Reference Manual, mysql Client Options, consultata il
- MySQL 8.4 Reference Manual, Features Removed in MySQL 8.4, consultata il
- MySQL 8.4 Reference Manual, Packet Too Large, consultata il
- MySQL 8.4 Reference Manual, MySQL server has gone away, consultata il
- MySQL 8.4 Reference Manual, Server Error Message Reference, consultata il
- MySQL 8.4 Reference Manual, Binary Logging of Stored Programs, consultata il
- MySQL 8.4 Reference Manual, Stored Object Access Control, consultata il
- MySQL 8.4 Reference Manual, System Variable Privileges, consultata il
- MySQL 8.4 Reference Manual, Server Character Set and Collation, consultata il
- MySQL 8.4 Reference Manual, End-User Guidelines for Password Security, consultata il
- MySQL Shell, Instance Dump Utility, Schema Dump Utility, consultata il
- MySQL 8.0 Release Notes, fine vita, consultata il
- MySQL Community Server, download, consultata il
- MariaDB, mariadb-dump, consultata il
- MariaDB, mariadb-import, consultata il
- MariaDB, command-line client, consultata il
- MariaDB, mariadb-backup overview, consultata il
- MariaDB, Incompatibilities and Feature Differences Between MariaDB 11.8 and MySQL 8.0, consultata il
- MariaDB, tracker MDEV-32274, consultata il
- MariaDB, tracker MDEV-29582, deprecate mysql* names, consultata il
- MariaDB, tracker MDEV-20912, utf8mb4_0900 collations, consultata il
- MariaDB, release e supporto (API dei download), consultata il
- MariaDB, About, consultata il
- Percona XtraBackup 8.4, documentazione, consultata il
- GNU gzip manual, consultata il
Scritto da Rackone