我需要从其他数据库和有时其他服务器连接表

时间:2012-07-27 09:22:01

标签: mysql database

我的项目有自己的数据库。另外,我使用的是用户表,这是在其他数据库上。两个办公室的数据在同一台服务器上,但第三个办公室在其他服务器上有自己的用户表。

所以,在很多查询中我需要加入表some_db.users或other_server.some_db.users

对于这种情况,您会建议什么样的解决方案?

我使用MySQL。

4 个答案:

答案 0 :(得分:15)

MySQL中有Federated tables

  

FEDERATED存储引擎允许您从远程MySQL访问数据   不使用复制或集群技术的数据库。查询一个   本地FEDERATED表自动从远程数据中提取数据   (联合)表。没有数据存储在本地表中。

首先,您必须使用FEDERATED表在远程服务器上拥有一个表。假设远程表位于sakila数据库中,并且定义如下:

CREATE TABLE test_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL
    PRIMARY KEY  (id)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1;

接下来,在本地服务器上创建一个FEDERATED表以访问远程表:

CREATE TABLE federated_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL
    PRIMARY KEY  (id)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user:fed_user@197.186.1.199:3306/sakila/test_table';

示例连接字符串:

CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'

此表的基本结构应与远程表的基本结构相匹配,但ENGINE表选项应为FEDERATED。

执行:

show variables like '%federated%'; 

检查本地服务器上是否有FEDERATED存储引擎。

localhost中的表federated_table成为远程服务器中test_table的虚拟表。

现在,您可以在localhost服务器的DB中使用表之间的JOIN。如果您的localhost服务器中有一个名为test的表,并且您想要与远程服务器中的前sakila.test_table一起加入,请编写如下所示的查询:

SELECT * FROM `federated_table` JOIN `test`;

查询中的federated_table实际上是指远程服务器中的test_table。


启用FEDERATED存储引擎

默认情况下,正在运行的服务器中未启用FEDERATED存储引擎;要启用FEDERATED,您必须使用--federated选项启动MySQL服务器二进制文件。

注意:
可选的存储引擎需要特权,并且在指定--skip-grant-tables时将无法加载。

整个数据库无法加载的结果将在日志中显示以下错误:

110318 21:37:23 [ERROR] /usr/local/libexec/mysqld: unknown option '--federated'

这反过来意味着如果您有联合表,则需要分两步完成5.x的升级。使用--skip-grant-tables且不使用--federated时,一次不使用--skip-grant-tables且使用--federated

来源:The FEDERATED Storage Engine

答案 1 :(得分:0)

请同时提及数据库。 在SQL Server中,您可以使用链接服务器。 http://msdn.microsoft.com/en-us/library/ms188279.aspx

答案 2 :(得分:0)

在MySQL中,您可以使用完全限定的名称(如

)连接来自不同数据库的表
`database_name1`. `table_name1` JOIN `database_name2`.`table_name2`

但是我担心,你不能连接来自不同服务器的表,因为你需要有两个不同的连接,据我所知,在查询中没有完全限定的连接名称。

或者,您可以在其中一个服务器上创建本地临时表,然后在其上运行查询。但在这种情况下,您需要将数据从一台服务器传输到另一台服务器。您可以使用像SQLyog或MySQL admin这样的MySQL GUI工具将数据从一台服务器传输到另一台服务器,并同步两台服务器上的数据库。

希望它有所帮助......

答案 3 :(得分:0)

联合表是其他服务器上表的解决方案。但是,如果对它们执行联接,它们将非常慢。 如果只想从同一服务器上的另一个数据库读取数据,则可以使用视图。这样,您实际上可以将所有表存储在一个数据库中,并且只需要在应用程序中打开一个连接即可。

CREATE
    VIEW `my_db`.`table_name` 
    AS
(SELECT * FROM `other_db`.`table_name`);