MySQL è uno dei sistemi di gestione di database relazionali (RDBMS) più utilizzati al mondo. La sua architettura modulare consente di adattarlo a diverse esigenze, dall'uso personale a implementazioni su larga scala. In questo articolo esploreremo la sua struttura interna, le tipologie di licenze disponibili, i file di configurazione essenziali e le sue funzionalità principali.
Le componenti architetturali
L’immagine sotto ben rappresenta le diverse componenti architetturali.
Tipologie di Licenze
MySQL è distribuito tramite due modelli di licenza:
- GPL (General Public License): disponibile gratuitamente con restrizioni sulla distribuzione del codice sorgente modificato.
- Licenza Commerciale: offerta da Oracle, consente l'uso di MySQL senza le limitazioni della GPL, con supporto tecnico dedicato e funzionalità avanzate.
Installazione dei Binari
MySQL può essere installato tramite pacchetti precompilati o compilato dai sorgenti. I metodi di installazione più comuni includono:
- Pacchetti ufficiali: disponibili per sistemi Linux (RPM, DEB), Windows (MSI), e macOS (DMG). I pacchetti ufficiali possono essere scaricati dal sito ufficiale di MySQL: https://dev.mysql.com/downloads/.
- Compilazione dai sorgenti: permette ottimizzazioni specifiche per l'hardware e il sistema operativo utilizzato.
- Container e Cloud: disponibili immagini Docker e servizi gestiti come Amazon RDS e Google Cloud SQL.
Per installare MySQL su un server Linux, i comandi principali sono:
Ubuntu
CentOS / RHEL
File di Configurazione (my.cnf)
Il principale file di configurazione di MySQL è my.cnf; esso contiene le 4
impostazioni globali e per singoli componenti. Si compone di diverse sezioni, ciascuna con uno scopo specifico:
- [mysqld]: Configurazioni principali per il server MySQL.
- [client]: Opzioni per il client MySQL, come host e porta predefiniti.
- [mysql]: Configurazioni per il client a riga di comando mysql.
- [mysqld_safe]: Opzioni per l'avvio sicuro del server MySQL.
- [mysqldump]: Opzioni per mysqldump, il comando di backup.
- [mysqladmin]: Configurazioni per l'utility mysqladmin, utile per la gestione del database.
- [mysqlhotcopy]: Opzioni per lo strumento mysqlhotcopy, usato per il backup di MyISAM.
Sotto un piccolo esempio di file my.cnf:
Il file my.cnf si trova solitamente in /etc/my.cnf su Linux o C:\ProgramData\MySQL\my.ini su Windows.
Default Database in MySQL
Quando MySQL viene installato, include alcuni database di sistema fondamentali:
- mysql: Contiene le informazioni relative a utenti, privilegi, stored procedure e configurazioni interne. È essenziale per la gestione degli accessi e delle autorizzazioni.
- information_schema: Memorizza informazioni sulle strutture del database, come tabelle, colonne e vincoli. Utile per interrogare metadati senza accedere direttamente ai datafile.
- performance_schema: Raccoglie dati sulle prestazioni e sul carico del server, consentendo di analizzare query lente, blocchi e altre metriche utili per l'ottimizzazione.
- sys: Fornisce viste e funzioni preconfigurate per semplificare il monitoraggio delle prestazioni e la diagnostica del database.
Struttura dei Datafile
MySQL utilizza diversi file per la memorizzazione dei dati e della configurazione:
- Tabelle e indici: archiviati nei tablespace di InnoDB (.ibd) o nei file MyISAM (.MYD e .MYI).
- File di log: include i binari di log, error log e slow query log.
- File di configurazione: parametri e impostazioni di runtime.
Relazione tra Database e Datafile
In MySQL, un database è un contenitore logico per le tabelle e altri oggetti, mentre i datafile sono i file fisici che memorizzano i dati. La relazione tra database e datafile dipende dal motore di archiviazione utilizzato:
- MyISAM: Ogni tabella ha un file .MYD (dati) e un file .MYI (indici).
- InnoDB: Utilizza tablespace per archiviare i dati. I tablespace possono essere condivisi (ibdata1) o per tabella (.ibd).
Dimensione massima e crescita automatica
- InnoDB utilizza tablespace dinamici che possono crescere automaticamente.
- Il file ibdata1 può espandersi, ma non si restringe automaticamente.
- I file .ibd possono essere creati con una dimensione iniziale e crescere con il riempimento delle tabelle.
- MyISAM ha un limite teorico di 256TB per tabella, ma dipende dal file system.
Tipi di Database: MyISAM, InnoDB , MEMORY Storage Engine e NDB Cluster Storage Engine
MyISAM
- Non supporta transazioni.
- Utilizza la tabella dei blocchi per gestire la concorrenza.
- Offre alte prestazioni nelle operazioni di lettura.
- I dati vengono memorizzati nei file .MYD e gli indici nei file .MYI.
Caratteristiche di MyISAM in questo esempio:
- Velocità nelle query SELECT: adatto per siti con molti accessi in lettura, come blog e archivi di notizie.
- Table-level locking (blocco a livello di tabella), quindi meno adatto per scritture concorrenti.
- Manca il supporto per Foreign Key e transazioni, quindi non è consigliato per applicazioni OLTP (Online Transaction Processing).
InnoDB
- Supporta transazioni con rollback e commit.
- Utilizza il locking a livello di riga per una maggiore concorrenza.
- Mantiene l'integrità referenziale con chiavi esterne.
- I dati e gli indici sono archiviati nel tablespace di InnoDB.
Caratteristiche di InnoDB in questo esempio:
- Supporto per Foreign Key: se un cliente viene eliminato, i suoi ordini vengono cancellati automaticamente (ON DELETE CASCADE).
- Supporto per transazioni e commit/rollback.
- Row-level locking (blocco a livello di riga), utile per operazioni concorrenti su grandi database.
MEMORY Storage Engine
Il motore MEMORY (precedentemente noto come HEAP) memorizza i dati direttamente nella RAM, garantendo elevate prestazioni per operazioni di lettura e scrittura, ma con lo svantaggio che i dati vengono persi al riavvio del server.
Caratteristiche principali:
- Velocissimo per le query: Poiché i dati risiedono in RAM, l’accesso è molto più rapido rispetto ai dischi.
- Perdita dei dati al riavvio: Essendo basato sulla RAM, non è adatto per dati persistenti.
- Indici solo HASH o BTREE: Gli indici possono essere di tipo HASH (più veloci per ricerche di uguaglianza) o BTREE.
- Utile per tabelle temporanee o cache: È comunemente usato per memorizzare dati temporanei o per caching delle query.
NDB Cluster Storage Engine
Il motore NDB Cluster è progettato per ambienti distribuiti e fornisce alta disponibilità, scalabilità orizzontale e tolleranza ai guasti. È il motore utilizzato in MySQL Cluster.
Caratteristiche principali:
- Distribuzione dei dati su più nodi: I dati vengono replicati automaticamente tra i nodi per garantire alta disponibilità.
- Scalabilità orizzontale: Aggiungendo più nodi, il sistema può gestire carichi di lavoro più elevati.
- Transazioni supportate: Fornisce supporto per transazioni ACID, rendendolo adatto per applicazioni critiche.
- Failover automatico: Se un nodo fallisce, il cluster continua a funzionare con i dati disponibili negli altri nodi.
- Memorizzazione dei dati in RAM e su disco: I dati possono essere mantenuti in RAM per alte prestazioni, ma anche scritti su disco per la persistenza.
Quando usare NDB Cluster?
- In applicazioni mission-critical che richiedono alta disponibilità (ad esempio, sistemi di telecomunicazione, e-commerce, banking).
- Per gestire grandi volumi di dati distribuiti su più server.
- Quando la scalabilità orizzontale è un requisito fondamentale.
Sintesi delle differenze:
- MEMORY: Ottimo per dati temporanei e cache ultra-veloce, ma i dati si perdono al riavvio.
- NDB Cluster: Perfetto per ambienti critici distribuiti, alta disponibilità e failover automatico.
- InnoDB: Lo storage engine più usato, con supporto per transazioni, chiavi esterne e ottime prestazioni per OLTP.
- MyISAM: Veloce nelle operazioni di lettura, ma senza transazioni e con blocco a livello di tabella.
Binary Logging in MySQL
Il Binary Log (binlog) è un file in cui MySQL registra tutte le operazioni di modifica ai dati. È fondamentale per:
- Replica: Viene utilizzato per sincronizzare i database tra un master e uno o più replica.
- Recupero dati: Può essere usato per ripristinare le modifiche fino a un certo point in time in caso di guasto.
Abilitazione del Binary Log
Nel file my.cnf, bisogna aggiungere:
[mysqld]
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = n
- log_bin: Abilita il binlog e specifica il percorso del file.
- binlog_format: Il formato ROW è consigliato perché registra le modifiche ai dati invece delle query eseguite.
- expire_logs_days: Definisce il numero di giorni prima che i binlog vengano automaticamente eliminati.
Backup in MySQL
I backup in MySQL sono essenziali per garantire la sicurezza dei dati. Alcuni dei metodi più comuni includono:
- mysqldump: Strumento per eseguire backup logici delle tabelle e dei database.
- mysqlhotcopy: Utile per il backup di tabelle MyISAM, eseguendo copie rapide dei file fisici.
- Replica binlog: Utilizza i binary log per creare una replica in tempo reale del database.
- Backup fisico con Percona XtraBackup: Strumento avanzato per il backup senza downtime di database InnoDB.
Un'adeguata strategia di backup prevede la combinazione di più metodi e la pianificazione regolare tramite cronjob o strumenti di automazione.
di Anna Bruno, pubblicato il 4 giugno 2026