Connessione db Mysql remoto con tabelle federated
Una esigenza molto importante per chi lavora con su database mysql è quella di gestire più istanze del DBMS come una sola entità logica.
Questo è molto utile quando si vuole fare una join di due tabelle che stanno su due database differenti e su server distinti.
Io personalmente, utilizzo spesso questa funzionalità anche quando voglio effettuare backup o copie di singole tabelle su server differenti.
Vediamo velocemente come questo è possibile su mysql.
Come al solito specifico il mio ambiente di sviluppo.
- Ubuntu Server 14.04
- Mysql 5.6 (la funzionalità federated è attivabile dalla versione 5.5 in poi)
Chiameremo “Server Client” il server da cui si vuole leggere/accedere alle tabelle federated. “Server federated” il server da cui leggere le tabelle.
Iniziamo con i comandi shell
Come prima cosa verifichiamo se mysql sul server da cui leggere è abilitato alla funzionalità federated.
connettersi al db con user e password ed eseguire il comando
mysql> show engines;
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.00 sec)
Se nel risultato nel sul rigo federated troviamo yes non c’è bisogno di effettuare modifiche al file my.conf
Nell’eventualità (come nel mio caso) troviamo NO, bisogna aggiungere un’istruzione per mysql.
digitiamo il comando per modificare il file my.cnf
nano /etc/mysql/my.cnf
nella sezione[mysqld] aggiungi la linea
federated
riavvia e verifica con il comando
service mysql restart
show engines
Una volta abilitata la funzionalità federated siamo pronti a collegarci da qualsiasi altro server a qualsiasi tabella o database presente sul server federated.
Per poter effettuare una connessione alle tabelle bisogna replicarle sul server “client”.
sul Server/PC client, replicare la tabella da federare con la stessa struttura
CREATE TABLE `nometabella` ( `CodAnag` int(10) unsigned NOT NULL AUTO_INCREMENT ..... ..... )ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://user:password@IP_SERVER_Federated:3306/nomedb/nometabella';
Note e suggerimenti
Da notare che la tabella chiude con una connessione di tipo mysql://..
Bisogna fare attenzione ai parametri di connessione da inserire.
Innanzitutto l’utente (user:password) deve essere abilitato alla connessione verso il server federated ed avere almeno i permessi di lettura sulla tabella.
Un altro problema relativo alla connessione esterna potrebbe essere l’IP dal quale ci si vuole collegare (IP Server Client), esso deve avere i permessi di accesso sia al server federated che all’installazione di mysql sul server stesso.
Se tutto funziona, la tabella appena creata è utilizzabile in ogni modo sul server client.
NB: La tabella creata non è una copia della tabella federated ma è l’istanza originale quindi ogni modifica su di essa si riperquote sul server federated. Io consiglio sempre di creare utenti ad-hoc con permessi di sola lettura sulle tabelle federated.

