5

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

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

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

我使用 MySQL。

4

4 回答 4

16

MySQL中有联合表:

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 存储引擎。

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

现在,您可以在 localhost 服务器中的数据库中的表之间使用 JOIN。如果test在您的 localhost 服务器中调用了一个表,并且您想与远程服务器中的前 sakila.test_table 连接,请编写如下所示的查询:

SELECT * FROM `federated_table` JOIN `test`;

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


关于启用联合存储引擎

运行的服务器默认不启用 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

资料来源:联邦存储引擎

于 2012-07-27T10:51:54.120 回答
0

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

于 2012-07-27T09:42:21.683 回答
0

在 MySQL 中,您可以使用完全限定名称连接来自不同数据库的表,例如

`database_name1`. `table_name1` JOIN `database_name2`.`table_name2`

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

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

希望能帮助到你....

于 2012-07-27T09:59:08.223 回答
0

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

CREATE
    VIEW `my_db`.`table_name` 
    AS
(SELECT * FROM `other_db`.`table_name`);
于 2020-07-06T15:55:35.673 回答