Salta al contenuto
Rackone

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

Un database passa da un server di origine a uno di destinazione con un file SQL: Export e import del database
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.

  1. Installa in produzione una serie LTS: MySQL 8.4 o 9.7, MariaDB 11.8 o 12.3.
  2. 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-transaction e 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.
  3. Controlla di avere abbastanza spazio libero per il file di dump.
  4. Usa gli strumenti da riga di comando del tuo server. In MySQL sono mysqldump e mysql. In MariaDB i nomi nativi sono mariadb-dump e mariadb, mentre mysqldump e mysql restano come collegamenti simbolici su Linux e come binari alternativi su Windows, deprecati da MariaDB 11.0.1.
  5. 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.

Operazionemysqldump e mysqlmariadb-dump e mariadb
Esportare un databasemysqldump -u utente -p nome_db > dump.sqlmariadb-dump -u utente -p nome_db > dump.sql
Importare un dumpmysql -u utente -p nome_db < dump.sqlmariadb -u utente -p nome_db < dump.sql
Importare dalla consolesource dump.sqlsource dump.sql
Esportare alcune tabellemysqldump -u utente -p nome_db tabella1 tabella2 > dump.sqlmariadb-dump -u utente -p nome_db tabella1 tabella2 > dump.sql
Esportare più databasemysqldump -u utente -p --databases nome_db1 nome_db2 > dump.sqlmariadb-dump -u utente -p --databases nome_db1 nome_db2 > dump.sql
Esportare tutto il server con routine ed eventimysqldump -u utente -p --all-databases --routines --events > all_databases.sqlmariadb-dump -u utente -p --all-databases --routines --events > all_databases.sql
Esportare solo la strutturamysqldump -u utente -p --no-data nome_db > dump.sqlmariadb-dump -u utente -p --no-data nome_db > dump.sql
Comprimere con gzipmysqldump -u utente -p nome_db | gzip > dump.sql.gzmariadb-dump -u utente -p nome_db | gzip > dump.sql.gz
Ripristinare da gzipgunzip -c dump.sql.gz | mysql -u utente -p nome_dbgunzip -c dump.sql.gz | mariadb -u utente -p nome_db
Esportare le tabelle di sistemanessuna opzione equivalente in mysqldumpopzione --system
Esportare più database in parallelocon MySQL Shellopzione --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.

ErroreCosa vuol direCosa fare
1045, Access denied for user (using password: NO o YES)La password manca o è sbagliata, oppure nessun account corrisponde a utente e hostIndica la password giusta e usa l'account creato per l'host da cui ti colleghi
1044, Access denied for user to databaseL'utente non ha privilegi sul databaseConcedi i privilegi sul database, compresi quelli per eseguire le istruzioni del dump
1049, Unknown databaseIl dump non contiene CREATE DATABASE e il database non esisteCrea il database prima dell'import
1050, Table already existsIl dump è stato esportato senza DROP TABLE, per esempio con --compactRiesporta con --add-drop-table, che fa parte di --opt
1153, Got a packet bigger than max_allowed_packetUn pacchetto supera il limite di max_allowed_packetAlza max_allowed_packet sul client e sul server
2006, MySQL server has gone awayIl server riceve un pacchetto troppo grande o fuori sequenza e chiude la connessioneAlza max_allowed_packet sul client e sul server
2013, Lost connection to MySQL server during queryLa connessione è stata chiusa, spesso per un timeout del serverControlla prima wait_timeout: il server chiude le connessioni inattive dopo otto ore di default
1418, funzione senza DETERMINISTIC, NO SQL o READS SQL DATAIl binary log è attivo e la funzione non dichiara nessuna di queste caratteristicheDichiara una delle tre caratteristiche nella funzione
1419, You do not have the SUPER privilege and binary logging is enabledIl binary log è attivo e all'account manca SET_ANY_DEFINER, che serve in aggiunta a CREATE ROUTINE o ALTER ROUTINEConcedi 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_ciIl dump viene da MySQL 8.4, che la usa di default, e MariaDB la supporta dalla 11.4.5Il supporto è arrivato con MariaDB 11.4.5; prova l'import su un server di test prima della produzione
Caratteri sbagliati dopo l'importIl dump non contiene SET NAMES (succede con --compact), oppure è un file UTF-16 prodotto da PowerShellIndica --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'exportmysqldump richiede PROCESS se non usi --no-tablespacesAggiungi --no-tablespaces oppure concedi PROCESS
Access denied; you need (at least one of) the ... privilege(s), durante l'import di un dump con GTIDIl dump contiene SET @@SESSION.sql_log_bin=0, che serve un privilegio riservatoRiesporta con --set-gtid-purged=OFF
Access denied; you need (at least one of) the ... privilege(s), durante l'import con DEFINERUn account può indicare come DEFINER solo se stesso, senza il privilegio SET_ANY_DEFINERConcedi 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.

  1. Metti le credenziali nella sezione [client] di ~/.my.cnf. Con -p senza valore il comando chiede la password a terminale, e in un cron resta in attesa.

    [client]
    user=utente
    password=password_sicura
    

    Imposta i permessi del file a 600, uno dei valori indicati dal manuale di MySQL sulla sicurezza delle password:

    chmod 600 ~/.my.cnf
    

    In alternativa mysql_config_editor salva le credenziali cifrate in .mylogin.cnf.

  2. 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).sql
    

    Il dump contiene i dati del database, spesso dati personali: salvalo in una cartella leggibile solo dal tuo utente.

  3. Comprimi il dump con gzip in pipe. I comandi seguenti con -u e -p sono da riga di comando; in un cron usa l'option file. Per ripristinare decomprimi con gunzip -c, o con zcat, che è equivalente:

    mysqldump -u utente -p nome_db | gzip > dump.sql.gz
    
    gunzip -c dump.sql.gz | mysql -u utente -p nome_db
    
  4. Ruota i backup, conservando un numero limitato di copie recenti:

    • giornaliere per l'ultima settimana
    • settimanali per l'ultimo mese
    • mensili per l'ultimo anno
  5. Verifica i backup con un ripristino di prova. mysqlcheck controlla 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.

  6. 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.

  7. 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.

Configura la tua VPS Linux

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

Articoli correlati

Chiama Parla con un esperto