Federated Storage Engine
Federated è uno Storage Engine incluso in MySQL. La sua particolarità è che non gestisce le tabelle utilizzando un particolare formato e aggiungendo particolari funzionalità, come fanno gli altri SE, ma piuttosto si connette a una tabella che si trova (solitamente) su un server remoto. In pratica fa da “ponte”, per poter utilizzare una tabella in remoto come se si trovasse in locale. Il server remoto deve necessariamente essere MySQL.
Allo stato attuale, Federated non è più mantenuto. Da tempo non vengono aggiunte funzionalità né corretti bug. Esiste però un fork che si chiama FederatedX; esso è incluso in MariaDB e ne parleremo in un altro articolo.
Gestire i server
Con Federated sono state introdotte tre nuove istruzioni: CREATE SERVER, ALTER SERVER e DROP SERVER. Non è necessario usarle per connettere una tabella Federated ad un server esterno. Tuttavia un server definito in questo modo è più facilmente gestibile. Ad esempio, nel caso in cui dieci tabelle utilizzino lo stesso server, nel caso in cui questo poi cambi indirizzo di rete, è preferibile avere la possibilità di modificarne la definizione con una sola ALTER SERVER, piuttosto che con dieci ALTER TABLE.
Ecco come creare una definizione:
1 CREATE SERVER 'nome_server' 2 FOREIGN DATA WRAPPER 'mysql' 3 OPTIONS ( 4 HOST '127.0.0.1', 5 DATABASE 'db1', 6 USER 'root', 7 PASSWORD , 8 PORT 3306, 9 SOCKET , 10 OWNER 'root' 11 );
Ecco invece come modificarla:
1 ALTER SERVER 'nome_server' 2 OPTIONS ( 3 HOST '127.0.0.1', 4 DATABASE 'db1', 5 USER 'root', 6 PASSWORD , 7 PORT 3306, 8 SOCKET , 9 OWNER 'root' 10 );
Il nome del server è arbitrario.
FORREIGN DATA WRAPPER è obbligatorio nella CREATE, ma non può essere usato nella ALTER. E’ il protocollo da utilizzare per connettersi al server remoto. L’unico protocollo supportato da Federated è ‘mysql’.
Le opzioni sono necessarie per stabilire la connessione. HOST è l’indirizzo di rete; PORT è la porta TCP; DATABASE è il nome del database contenente la tabella remota; USER e PASSWORD rappresentano l’identità da utilizzare; in alternativa a HOST si può usare SOCKET (il nome di uno Unix Socket), mentre in questo contesto non sono disponibili le named pipe di Windows; OWNER attualmente non ha effetto. Ognuna delle opzioni è facoltativa e può anche essere nominata ma non valorizzata (come PASSWORD nel nostro esempio). I valori delle opzioni non possono essere più lunghi di 64 caratteri. Un server non può essere rinominato.
Per eliminare la definizione di un server si usa la seguente istruzione:
1 DROP SERVER [ IF EXISTS ] nome_server;
IF EXISTS serve a non generare un errore nel caso in cui il server non sia definito.
CREATE, ALTER e DROP SERVER, a differenza delle altre istruzioni DDL, possono essere utilizzate all’interno di una transazione.
Le definizioni dei server sono presenti nella tabella ‘servers’ del database di sistema ‘mysql’. Le colonne sono:- Server_name
- Host
- Db
- Username
- Password
- Port
- Socket
- Wrapper
- Owner
Creare tabelle Federated
Nella creazione di una tabella Federated è necessario indicare quale tabelle remota deve essere utilizzata. Se si utilizza un server definito è più semplice:
1 CREATE TABLE tab1 (s1 INT) ENGINE=FEDERATED CONNECTION='server1/tab_remota';
Come si vede, esiste un’opzione CONNECTION che indica appunto gli estremi della tabella remota. Usando un server già definito, il formato della stringa di connessione è: ‘nome_server/nome_tabella’.
Per connettere una tabella Federated a un server non definito, bisogna usare la sintassi estesa della stringa di connessione:
mysql://user[:password]@host[:port]/database/tabella
Al momento della creazione della tabella Federated la tabella remota deve già esistere, altrimenti verrà generato un errore.
Sicurezza
Si faccia attenzione nell’impostare le password. Chi ha i privilegi per leggere la definizione delle tabelle Federated sarà anche in grado di visualizzare le password, se esse sono scritte nell’opzione CONNECTION. Se invece sono scritte nella definizione del server, chi avrà accesso in lettura alla tabella mysql.server potrà leggere tutte le password.
Se si usano le stringhe di connessione, le password non potranno contenere il carattere ’@’ (non è previsto un carattere di escape).
Se una tabella Federated è replicata, bisogna accertarsi che gli slave abbiano i privilegi per potersi connettere con la stessa identità (user / password) usata dal master.
Federated non supporta alcun tipo di connessione sicura.
Funzionalità
E’ possibile eseguire istruzioni SQL su una tabella Federated. Esse verranno riscritte da Federated utilizzando la MySQL Client Library; non vengono inviate così come sono state scritte dall’utente. Ogni comando usato deve essere supportato sia da Federated, sia dallo Storage Engine usato dalla tabella remota.
Federated non supporta le transazioni, né HANDLER. Le INSERT di massa vengono inviate al server remoto come istruzioni separate e le clausole DELAYED e ON DUPLICATE KEY vengono ignorate.
Una tabbella Federated può puntare a un’altra tabella Federated. La connessione funziona anche in locale (HOST ‘localhost’).
E’ possibile utilizzare le tabelle Federated per aggirare la restrizione imposta da MySQL per cui a ogni tabella può essere associato un solo trigger per ogni cominazione evento / timing (esempio: un solo trigger per BEFORE UPDATE). Si può infatti associare un trigger alla tabella principale, creare una Federated e associare ad essa un trigger dello stesso tipo. E’ anche possibile creare una catena di tabelle Federated, così si possono creare molti trigger dello stesso tipo. Naturalmente le prestazioni ne risentono.
Le istruzioni ALTER, RENAME e DROP TABLE agiscono sulla tabella Federated; non c’è modo di farle inviare alla tabella remota.
Argomenti correlati
Commenti