Sante Caserio
pubblicato circa un anno fa

Federated Storage Engine

L’articolo descrive il famoso Federated Storage Engine, utilizzato per controllare tabelle remote, allocate su altri server


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:

 1CREATE 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:

 1ALTER 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:

1DROP 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:

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

Condividi su:

Esprimi un voto:

  • Current rating: 0.0/5
  • 1
  • 2
  • 3
  • 4
  • 5

Argomenti chiave:

Ultimi commenti Ultimi commenti

Esegui il Login oppure registrati per scrivere un commento.
Cerca nel sito...
Ultime recipes

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL MySQL Report un tool di shell per tenere tutto sotto controllo

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL


Vai alla recipe

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL MySQLSniffer sniffare il traffico TCP di MySQL

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL


Vai alla recipe

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso myisamchk riparare file MyISAM

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso il file myisamchk


Vai alla recipe

Un tool per comprimere le tabelle MyISAM fino a oltre il 50% myisampack comprimere file MyISAM

Un tool per comprimere le tabelle MyISAM fino a oltre il 50%


Vai alla recipe

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun mysqlshow visualizzare le informazioni sul database MySQL

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun client


Vai alla recipe

Utilizzando UNION / UNION ALL su campi int unsigned zerofill,
ho notato che MysqlUNION / UNION ALL su campi int unsigned zerofill. di DebUsr
Vai al tip

Utilizzo di funzioni come alias di campo tramite l'impiego di prepared statementReport con alias di campo dinamici di john_revelator
Vai al tip

Può capitare che sia necessario eseguire un dump di database in formato Comma SeparatedEsecuzione dump in formato CSV (tabelle in engine MyIsam esportate in formato CSV) di ghigomatto
Vai al tip

E' possibile eseguire le query SQL contenute in un file di testo. Questo è utileEseguire le query da un file di testo di Sante Caserio
Vai al tip

Se vogliamo fare il backup di tutti i database con mysqldump, e ne abbiamo parecchiFare il backup di tutti i database di Sante Caserio
Vai al tip

Salve, dopo tante storie ho studiato il php e mysql .. . che in questo forum parlavo php e campo mysql timestamp di gigi Vai al topic

ciao a tutti ho creato un forum su aruba ma non so come farlo visualizzare nel mio aruba di albertodiprima Vai al topic

Salve a tutti gente, questo è il mio primo post su questo forum e questo a causa Problema Gravissimo con AutoIncrement di stefanoadsl Vai al topic

Salve! Mi presento, mi chiamo Adriano e sono uno studente di ingegneria informatica Problema Trigger di Xanakro Vai al topic

Ciao a tutti!
Volevo chiedere una informazione.
Ho una query che lanciata la prima Query Eseguita più volte di OltreLeStelle Vai al topic