MySQL: Tabelas Remotas

O MySQL possui o Engine FEDERATED, que permite que sejam utilizados objetos que estão em outro Servidor, de forma transparenete para a aplicação.

O Servidor Origem tem o IP 192.168.0.98.
O Servidor Destino tem o IP 192.168.0.20.

No Servidor Origem, deve ser criado um usuário para acesso pelo Servidor Destino, e dadas as permissões devidas nos objetos que se quer acessar.

mysql> create database teste;
Query OK, 1 row affected (0,09 sec)

mysql> use teste;
Database changed
mysql> show tables;
Empty set (0,01 sec)

mysql> create table t1 (c1 int);
Query OK, 0 rows affected (0,26 sec)

mysql> insert into t1 values (1);
Query OK, 1 row affected (0,05 sec)

mysql> commit;
Query OK, 0 rows affected (0,00 sec)

mysql> CREATE USER 'ricardo'@'192.168.0.20' IDENTIFIED BY 'Nerv2017';
Query OK, 0 rows affected (0,07 sec)

mysql> GRANT SELECT ON teste.* TO 'ricardo'@'192.168.0.20';
Query OK, 0 rows affected (0,03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0,06 sec)

mysql>

No Servidor Destino, verifique se o Engine FEDERATED está habilitado pelo comando abaixo (veja que a coluna Support está em YES). Se não estiver habilitado, basta colocar uma linha com a palavra federated no arquivo de configuração, e reiniciar o MySQL.

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | YES     | Federated MySQL storage engine                                 | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0,10 sec)

mysql>

E no Servidor Remoto deve ser criado um objeto SERVER, que possui os dados de acesso, e criar a tabela que utiliza este SERVER, com a mesma definição que está no Servidor Origem.

mysql> use nervix;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysqlmysql> CREATE SERVER prod FOREIGN DATA WRAPPER mysql OPTIONS (USER 'ricardo', PASSWORD 'Nerv2017', HOST '192.168.0.98', PORT 3306, DATABASE 'teste');
Query OK, 1 row affected (0,00 sec)

mysql> create table t1 (c1 int) ENGINE=FEDERATED CONNECTION='prod/t1';
Query OK, 0 rows affected (0,06 sec)

mysql> select * from t1;
+------+
| c1   |
+------+
|    1 |
+------+
1 row in set (0,06 sec)

mysql>

Para saber se uma tabela utiliza o Engine FEDERATED, veja a descrição da tabela.

+-------+----------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                   |
+-------+----------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='prod/t1' |
+-------+----------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

mysql>

E para verificar os dados de um SERVER, utilize o SQL abaixo.

mysql> select * from mysql.servers;
+-------------+--------------+-------+----------+-------------+------+--------+---------+-------+
| Server_name | Host         | Db    | Username | Password    | Port | Socket | Wrapper | Owner |
+-------------+--------------+-------+----------+-------------+------+--------+---------+-------+
| prod        | 192.168.0.98 | teste | ricardo  | Nerv2017    | 3306 |        | mysql   |       |
+-------------+--------------+-------+----------+-------------+------+--------+---------+-------+
1 row in set (0,00 sec)

mysql>

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.