MySQL 5.7 - Nuove funzionalita'

La versione MySQL 5.7 introduce nuove funzionalita' nell'RDBMS Free piu' diffuso al mondo.
Sono passati un paio di anni dall'uscita della precedente release finalmente oggi [NdE 26 Ottobre 2015] e' stata rilasciata la versione GA 5.7.9: ecco quindi pubblicato anche questo documento!

In generale la versione 5.7 e' un'evoluzione della versione precedente con migliori prestazioni, una maggiore aderenza alle best practice SQL ed una forte attenzione alla sicurezza.
In questo documento sono riportati in dettaglio i principali nuovi elementi introdotti dalla versione 5.7 riportando esempi pratici di utilizzo. Ecco l'elenco degli esempi:

Ma le novita' non sono solo queste... continuate a leggere!

SYS Schema e Performance Schema

Il data dictionary di MySQL e' sempre stato piuttosto limitato soprattutto nella parte di monitoraggio e strumentazione delle attivita'... fino alla 5.7!
Con la versione 5.7 e' stata variata la struttura dell'INFORMATION_SCHEMA, del PERFORMANCE_SCHEMA ed e' stato introdotto il SYS Schema. Le nuove viste sono molto piu' complete e piu' semplici da utilizzare.

Il contenuto di INFORMATION_SCHEMA e di PERFORMANCE_SCHEMA e' stato riorganizzato. Ora le viste contenute in ciascuno schema sono maggiormente pertinenti; ad esempio la vista GLOBAL_STATUS e' passata dall'INFORMATION_SCHEMA al PERFORMANCE_SCHEMA.

Nello schema SYS sono disponibili ulteriori informazioni ed il loro reperimento e' notevolmente piu' facile. Sono disponibili un centinaio di viste suddivise in due gruppi: quelle per umani e quelle per alieni.
Qualche esempio? Il nome delle viste: schema_tables_with_full_table_scans, schema_unused_indexes oppure innodb_lock_waits riportano esattamente l'informazione contenuta e l'estrazione non richiede join o conversioni di dati! Per ottenere tutte le informazioni sulla base dati basta un solo comando: CALL sys.diagnostics(60, 30, 'current');
Dal punto di vista dei dati disponibili la versione 5.7 fornisce molti piu' informazioni sulle attivita' presenti con semplici viste aggregate (eg. SELECT total_memory_allocated FROM user_summary).

Oltre a queste sono disponibili diverse viste X$ con il dettaglio dei dati. Queste viste sono molto complete ma complesse e sono adatte per essere accedute in polling da tool esterni.

In 5.7 sono disponibili anche le informazioni di dettaglio sui lock nella tabella metadata_locks. La strumentazione di queste informazioni pero' di default e' disabilitata. Per abilitarla inserire nel file my.cnf la direttiva
 performance-schema-instrument='wait/lock/metadata/sql/mdl=ON'
Oppure lanciare il comando:
 UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'wait/lock/metadata/sql/mdl';

Ottimizzatore

In ogni RDBMS l'ottimizzatore viene costantemente migliorato ed arricchito. Di solito non lo commento perche' l'evoluzione dell'ottimizzatore e' data per scontata e, debbo ammetterlo, le differenze in algoritmi cosi' complessi a volte sono difficili da capire! [NdA non che voglia sottovalutare l'importanza degli optimizer_switch condition_fanout_filter, derived_merge e duplicateweedout...]

Ma con la 5.7 ci sono anche cambiamenti sull'ottimizzatore che riesco a comprendere facilmente anche io!
Dalla versione 5.7 sono disponibili gli Hint: un modo per indirizzare le scelte dell'ottimizzatore con un commento nello statement SQL. La sintassi e' semplice ed ha un leggero sentore di deja vu:

SELECT /*+ Optimizer Hint +/ ...

Gli HINT sono disponibili anche a livello di indice.

InnoDB

L'engine InnoDB e' presente da sempre in MySQL (dalla versione 3.23.34), e' sempre stato migliorato nel tempo ed e' diventato l'engine di default dalla versione 5.5. Nella versione 5.7 sono moltissime le nuove funzionalita' ed alcune sono di particolare importanza.

Il parametro innodb_buffer_pool_size, il principale per il tuning di InnoDB, e' diventato dinamico (ovvero puo' essere aumentato senza riavviare MySQL).

Le aree temporanee non vengono piu' gestite nella partizione di sistema (che ora contiene solo il data dictionary InnoDB) ma da una partizione ad hoc. Oltre a vantaggi in termini di efficienza si evitano problemi di crescita della partizione di sistema che costringevano a ricostruire il DB [NdA in pratica con una runaway query non "scoppia" il file ibdata1 ma solo il file ibtmp1 che viene ricreato all'avvio].

Il partitioning e' implementato in modo nativo nell'Engine InnoDB.

Insomma anche con questa versione l'Engine InnoDB e' stato migliorato in modo significativo!

JSON

Per la loro semplice generazione e trattamento nei programmi JavaScript le stringhe JSON (JavaScript Object Notation) hanno una sempre maggior diffusione ed hanno rimpiazzato l'XML in molte applicazioni. La versione 5.7 supporta in modo nativo un data type per il JSON ed una serie di funzioni per il suo trattamento.

CREATE TABLE esempio_json (chiave, documento JSON);
SELECT JSON_OBJECT('key1', 1, 'name', 'Meo');
SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');

Replication

Le novita' nella versione 5.7 sono molte: multi-source replication, enhanced Global Transaction Identifiers (GTIDs), multi-threaded slaves, ... Il documento specifico sulla replication riporta maggiori dettagli.

A mio avviso, nella versione 5.7, e' sopratutto significativo lo sforzo per consentire l'aggiornamento e le variazioni della configurazione delle repliche senza interrompere le basi dati: un esigenza sempre molto sentita nelle basi dati che ospitano siti web e servizi 7x24. Sono tante le piccole nuove funzionalita' che vanno in questa direzione e rendono la replica MySQL sempre piu' adatta ad ambienti Cloud. Ecco il riassunto delle principali novita':

Sicurezza

Da ultimo ma non come ultimo... la sicurezza. Anche su questo MySQL continua a migliorarsi: ci sono tante piccole differenze e nuove funzionalita' introdotte con la versione 5.7.

La prima tra tutte: e' finalmente possibile gestire la password expiration il che rende MySQL 5.7 compliant ai requisiti di sicurezza previsti da diversi standard internazionali ed europei. Attenzione: per default tutte le password scadono in 360 giorni, per evitarlo:
 ALTER USER 'batch'@'localhost' PASSWORD EXPIRE NEVER;

[NdE dalla 5.7.11 (2016-02) e' cambiato il default e le password NON scadono se non si imposta il parametro default_password_lifetime ad un valore diverso da 0].

Ci sono diversi cambiamenti relativamente alla gestione delle password. La procedura di installazione crea una sola utenza root che si puo' connettere da localhost. La password iniziale viene posta nel file di log se si installa da RPM (eg. /var/log/mysqld.log), oppure visualizzata su una dialog box se si installa su OS X, ...
Il comando SET PASSWORD ha una sintassi leggermente differente, la tabella MYSQL.USER ora contiene il campo AUTHENTICATION_STRING al posto di PASSWORD, il plugin validate_password e' configurato per default e la validate_password_policy e' impostata a MEDIUM, ...

E' disponibile la Tablespace Encryption che permette di crittografare su disco i dati delle tabelle InnoDB [NdA se configurate con file per table, che e' il default]. La crittografia utilizza la tecnica delle chiavi rotanti e lavora per blocchi in fase di scrittura su disco. Sono disponibili due plugin: keyring_file e keyring_okv [NdE quest'ultimo disponibile solo per MySQL Enterprise Edition].

La configurazione delle connessioni SSL/TLS e' ora notevolmente semplificata ed e' alla portata di tutti. Alla creazione di un utente e' possibile utilizzare la clausola: CREATE USER ... REQUIRE SSL richiedendo in questo modo la connessione SSL/TSL per l'accesso al DB.

E' disponibile un nuovo plugin che implemente hashing SHA-256 per l'autenticazione: sha256_password. Per utilizzarlo nella creazione/alter di un utente: ... IDENTIFIED WITH sha256_password BY 'password';

Internals: sono stati definiti alcuni nuovi utenti interni:

Infine tra le funzionalita' rimosse dalla 5.7 ricordiamo il supporto per le deboli password pre-4.1 e di tutti i comandi e configurazioni collegati (eg. la funzione old_password()).

Varie ed eventuali

Altre novita' interessanti [NdA aggiornate alla piu' recente versione di produzione: 5.7.22] sono:

Sul tuning della versione 5.7 e' disponibile questo documento.

Un breve riassunto delle funzionalita' introdotte nel tempo si trova su Introduzione a MySQL. MySQL e' in costante evoluzione; ecco le funzionalita' introdotte nelle versioni precedenti: MySQL 5.6, MySQL 5.5, MySQL 5.1, MySQL 5.0. Un documento completo con le versioni di tutti prodotti SW che ritengo piu' significativi, ed ovviamente anche di MySQL, e' il tuo server puzza!


Titolo: MySQL 5.7 - Nuove funzionalita'
Livello: Avanzato (3/5)
Data: 26 Ottobre 2015
Versione: 1.0.10 - 1 Aprile 2018
Autore: mail [AT] meo.bogliolo.name