giovedì 22 marzo 2018

MYSQL: Query tra tabelle su server diversi

Un'esigenza che prima o poi può capitare nella vita per chi gestisce database mysql, è quella di dover fare delle query tra tabelle presenti non solo su database differenti, ma addirittura su server diversi.
In sql server si chiamavano linked server, qui invece su mysql il loro nome è federated tables.

Vediamo subito cosa bisogna fare per poter pesare i dati su server diversi in mysql.


Come fare query tra tabelle su server diversi su mysql


Se abbiamo una tabella mysql in locale ed un'altra presente su un database collocato su un server remoto, il modo tipico per poter pescare questi dati con un'unica query sql, è quella di usare le federated tables.

Una tabella federata, se così la si può tradurre dall'inglese, è una sorta di tabella virtuale, una tabella che pesca i suoi dati direttamente da un'altra tabella presente su un altro server (ed un altro db).

Vediamo dunque come creare una federated table.
La sintassi per la creazione di queste tabelle è identica a qualsiasi altra tabella, è il solito create table infatti.
Quello che cambia è la parte finale, in cui si dice a mysql dove andare a prendere i dati.
Ecco un semplice esempio:

CREATE TABLE `tabella_federata` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(64) DEFAULT NULL,
  `cognome` varchar(64) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
 ) ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://utente:password@ip-server/nome-database/nome-tabella'


La parte cruciale di questo esempio è l'engine, il motore della tabella, che ha una sintassi del genere:
ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://utente:password@ip-server/nome-database/nome-tabella'

Penso che non ci sia bisogno di altre spiegazioni.

Quando si vuole creare quindi una tabella federata mysql, il mio consiglio è quello di esportare lo script di creazione della tabella presente sul server remoto, e poi di modificarlo nella sua parte finale, nel motore.

Una volta creata questa tabella virtuale, pescare i dati sarà un gioco da ragazzi.
Se infatti abbiamo creato una tabella federata sullo stesso database mysql della tabella da legare, la sintassi da usare sarà un classico:
SELECT tabella1.campo,tabella2.campo FROM tabella1,tabella2 WHERE idtabella1=idtabella2
Dove ovviamente una delle due tabelle in questione è la tabella federata creata poco prima.

Il limite di questo metodo per pescare dati da server diversi in mysql è abbastanza evidente.
Se si modifica la struttura della tabella remota, bisogna ricordarsi di modificare anche quella della tabella federata... particolare non da poco!

Piaciuto l'articolo? Lascia un commento!

EmoticonEmoticon