IT星球论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 3930|回复: 0

mysql不同服务器上数据库关联

[复制链接]

1996

主题

1

好友

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

优秀会员 助人为乐 辛勤工作 技术精英 多才多艺 优秀班竹 灌水天才 星球管理 宣传大使 灌水之王 财富勋章 版主勋章 动漫勋章 勤奋会员 论坛精英 PS高手 心 8 闪游皮肤 双鱼座 8★8➹ 志愿者 乖

发表于 2013-7-24 10:56:29 |显示全部楼层
现有两台MySQL数据库
一台是192.168.1.1 端口3306 上有数据库DB1 有表TABLE1
一台是192.168.1.2 端口3307 上有数据库DB2 有表TABLE2
192.168.1.1远程连接192.168.1.2数据库所使用的用户名root1 密码root1
192.168.1.2远程连接192.168.1.1数据库所使用的用户名root2 密码root2
现在想对 TABLE1 和 TABLE2 两张表进行关联查询 请问SQL应该怎么实现              


没有办法直接进行JOIN查询。

你可以在DB1中建立一个 FEDERATED 指向这个 DB2.table2 如下,然后就象在同一数据库中DB1中操作即可。
  1. 例1:
  2. CREATE TABLE TABLE2 (
  3.     id     INT(20) NOT NULL AUTO_INCREMENT,
  4.     name   VARCHAR(32) NOT NULL DEFAULT '',
  5.     other  INT(20) NOT NULL DEFAULT '0',
  6.     PRIMARY KEY  (id),
  7.     INDEX name (name),
  8.     INDEX other_key (other)
  9. )
  10. ENGINE=FEDERATED
  11. DEFAULT CHARSET=latin1
  12. CONNECTION='mysql://192.168.1.2:3307/DB2/TABLE2';
复制代码
  1. 例2:
  2. CREATE TABLE `demo_tb1` (
  3.   `hosid` int(11) NOT NULL auto_increment,
  4.   `hosname` varchar(100) default NULL,
  5.   `hosenname` varchar(100) default NULL,
  6.   `uid` int(11) default NULL,
  7.   `hosaddress` varchar(1000) default NULL,
  8.   PRIMARY KEY  (`hosid`)
  9. ) ENGINE=FEDERATED AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
  10. CONNECTION='mysql://root:root@192.168.1.0.3:3306/dbdemo/demo_tb1';
复制代码
Mysql 开启Federated引擎的方法
MySQL中针对不同的功能需求提供了不同的存储引擎。所谓的存储引擎也就是MySQL下特定接口的具体实现。

FEDERATED是其中一个专门针对远程数据库的实现。一般情况下在本地数据库中建表会在数据库目录中生成相应的表定义文件,并同时生成相应的数据文件。
但通过FEDERATED引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中(这一点很重要)。

通过这个引擎可以实现类似Oracle 下DBLINK的远程数据访问功能。

使用show engines 命令查看数据库是否已支持FEDERATED引擎:

Support 的值有以下几个:
YES支持并开启
DEFAULT支持并开启, 并且为默认引擎
NO不支持
DISABLED支持,但未开启

可以看出MyISAM为当前默认的引擎。
使用FEDERATED建表语句如下:
CREATE TABLE (......) ENGINE =FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]'
创建成功后就可直接在本地查询相应的远程表了。

需要注意的几点:

1. 本地的表结构必须与远程的完全一样。
2.远程数据库目前仅限MySQL
3.不支持事务
4.不支持表结构修改

以下是补充:
参考一下在windows下的解决办法,在my.cnf中增加一行


复制代码 代码如下:

federated


重启mysql服务后,

mysql> show engines;



Federated存储引擎可以使你在本地数据库中访问远程数据库中的数据,针对federated存储引擎表的查询会被发送到远程数据库的表上执行,本地是不存储任何数据的。
简要介绍后,是不是发现它和Oracle的database link(数据库链接)非常相似,它所实现的功能和db link类似,要在MySQL下找寻db link替代品的,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时没有编译进来,只能现安装了。2.   安装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
可是执行以下命令时报错:
SQL>install plugin federated soname 'ha_federated.so';
ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/mysql/plugin/ha_federated.so' (errno: 2 undefined symbol: dynstr_append_mem)
搜了一下,发现是个老问题,竟然到现在都没解决,可见MySQL团队的效率和管理的混乱。http://bugs.mysql.com/bug.php?id=40942
没有办法了,只有重新编译MySQL源码了, 加上--with-plugins=federated。从5.1.26开始,默认MySQL不启用federated存储引擎,所以需要在my.cnf中加入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存储引擎了。
本文参考:http://bbs.csdn.net/topics/320196555http://www.jb51.net/article/32637.htm


该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部