跨数据库服务器,跨实例访问是比较常见的一种访问方式,在Oracle中可以通过DB LINK的方式来实现。对于MySQL而言,有一个FEDERATED存储引擎与之相对应。同样也是通过创建一个链接方式的形式来访问远程服务器上的数据。本文简要描述了FEDERATED存储引擎,以及演示了基于FEDERATED存储引擎跨实例访问的示例。
1、FEDERATED存储引擎的描述
FEDERATED存储引擎允许在不使用复制或集群技术的情况下实现远程访问数据库
创建基于FEDERATED存储引擎表的时候,服务器在数据库目录仅创建一个表定义文件,即以表名开头的.frm文件。
FEDERATED存储引擎表无任何数据存储到本地,即没有.myd文件
对于远程服务器上表的操作与本地表操作一样,仅仅是数据位于远程服务器
基本流程如下:

2、安装与启用FEDERATED存储引擎
源码安装MySQL时使用DWITH_FEDERATED_STORAGE_ENGINE来配置
rpm安装方式缺省情况下已安装,只需要启用该功能即可
3、准备远程服务器环境
-- 此演示中远程服务器与本地服务器为同一服务器上的多版本多实例
-- 假定远程服务为:5.6.12(实例3406)
-- 假定本地服务器:5.6.21(实例3306)
-- 基于实例3306创建FEDERATED存储引擎表test.federated_engine以到达访问实例3406数据库tempdb.tb_engine的目的
[root@rhel64a ~]# cat /etc/issue
Red Hat Enterprise Linux Server release 6.4 (Santiago)
--启动3406的实例
[root@rhel64a ~]# /u01/app/mysql/bin/mysqld_multi start 3406
[root@rhel64a ~]# mysql -uroot -pxxx -P3406 --protocol=tcp
root@localhost[(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3406 |
+---------------+-------+
--实例3406的版本号
root@localhost[tempdb]> show variables like 'version';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| version | 5.6.12-log |
+---------------+------------+
--创建数据库
root@localhost[(none)]> create database tempdb;
Query OK, 1 row affected (0.00 sec)
-- Author : Leshami
-- Blog :http://blog.csdn.net/leshami
root@localhost[(none)]> use tempdb
Database changed
--创建用于访问的表
root@localhost[tempdb]> create table tb_engine as
-> select engine,support,comment from information_schema.engines;
Query OK, 9 rows affected (0.10 sec)
Records: 9 Duplicates: 0 Warnings: 0
--提取表的SQL语句用于创建为FEDERATED存储引擎表
root@localhost[tempdb]> show create table tb_engine G
*************************** 1. row ***************************
Table: tb_engine
Create Table: CREATE TABLE `tb_engine` (
`engine` varchar(64) NOT NULL DEFAULT '',
`support` varchar(8) NOT NULL DEFAULT '',
`comment` varchar(80) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8
--创建用于远程访问的账户
root@localhost[tempdb]> grant all privileges on tempdb.* to 'remote_user'@'192.168.1.131' identified by 'xxx';
Query OK, 0 rows affected (0.00 sec)
root@localhost[tempdb]> flush privileges;
Query OK, 0 rows affected (0.00 sec)