federated存储引擎

业务上有需求,需要跨服务器跨数据库的多表查询,然后想到了两个办法:

  1. 分开查询,就是先把半成品的结果记录下来,然后做二次查询,这是一个笨办法
  2. federated存储引擎

一.什么是federated引擎?

ederated存储引擎可以使你在本地数据库中访问远程数据库中的数据,针对federated存储引擎表的查询会被发送到远程数据库的表上执行,本地是不存储任何数据的。

1.  查看当前支持的存储引擎

SQL>show engines;



+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| 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         |
| InnoDB     | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MyISAM     | YES     | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
5 rows in set (0.00 sec)

发现安装MySQL时没有编译进来,只能现安装了。

二.安装federated存储引擎

由于编译时没有选择federated,所以打算通过INSTALL PLUGIN的方式安装,正常情况下,federated是支持动态安装的:

=== Federated Storage Engine ===

Plugin Name:      federated

Description:      Connects to tables on remote MySQL servers

Supports build:   static and dynamic

Configurations:   max, max-no-ndb

动态安装命令

mysql> install plugin federated soname ‘ha_federated.so’;
Query OK, 0 rows affected, 1 warning (0.02 sec)

从5.1.26开始,默认MySQL不启用federated存储引擎,所以需要在my.cnf中[mysqld]加入federated选项或是在命令行用–federated选项启动mysqld。编译后的结果如下:

SQL>show engines;

+------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                                    | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| CSV        | YES     | CSV storage engine                                                         | NO           | NO   | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                                      | NO           | NO   | NO         |
| FEDERATED  | YES     | Federated MySQL storage engine                                             | NO           | NO   | NO         |
| MyISAM     | YES     | Default engine as of MySQL 3.23 with great performance                     | NO           | NO   | NO         |
| InnoDB     | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables                  | NO           | NO   | NO         |
+------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
6 rows in set (0.00 sec)

至此,我们已经可以使用federated存储引擎了。

三. federated的使用

这里假设有ip1上的数据DB1有个表为table1,而我需要在ip2上建立数据库DB2中建立相同的表:

先在ip1上:show create table table1;得到建表语句。

然后跑到ip2服务器上

使用FEDERATED建表语句如下:

CREATE TABLE (......) ENGINE =FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]'

创建成功后就可直接在本地查询相应的远程表了。

需要注意的几点:

1. 本地的表结构必须与远程的完全一样。

2.远程数据库目前仅限MySQL

3.不支持事务

4.不支持表结构修改

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This blog is kept spam free by WP-SpamFree.