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

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

您会针对这种情况建议什么解决方案?

我使用MySQL。

最佳答案

MySQL中有Federated tables:



首先,必须在远程服务器上有一个要使用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:[email protected]: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存储引擎在本地服务器上是否可用。

本地主机中的表federated_table成为远程服务器中test_table的虚拟表。

现在,您可以在localhost服务器的数据库中的表之间使用JOIN。如果您的本地主机服务器中有一个名为test的表,并且您想与远程服务器中的前sakila.test_table进行联接,请编写如下所示的查询:
SELECT * FROM `federated_table` JOIN `test`;

查询中的federated_table实际上将引用远程服务器中的test_table。

启用FEDERATED Storage Engine

默认情况下,正在运行的服务器中未启用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

关于mysql - 我需要从其他数据库(有时是其他服务器)中加入表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11684956/

10-09 07:37