MySQL 跨服务器选择查询

Posted

技术标签:

【中文标题】MySQL 跨服务器选择查询【英文标题】:MySQL Cross Server Select Query 【发布时间】:2010-10-23 01:26:28 【问题描述】:

是否可以使用 mysql 客户端编写跨服务器选择查询。基本上设置如下。

服务器 IP       数据库 ---------       -------- 1.2.3.4       测试 a.b.c.d       测试

我想编写一个查询,该查询将从 1.2.3.4 上的测试数据库中的表中选择行,并将表中的结果插入到 a.b.c.d 上的测试数据库中 我的服务器相距数英里,因此我将打开一个 SSH 隧道来连接两者。

任何指针?

【问题讨论】:

【参考方案1】:

在其中一台服务器上使用联合表怎么样? 根据您将在查询中使用的远程表创建联合表,并像您的数据库都是本地的一样运行您的查询。下面的例子来自MySQL site

使用 FEDERATED 表的过程非常简单。通常,您有两台服务器在运行,它们要么在同一台主机上,要么在不同的主机上。 (FEDERATED 表可以使用由同一服务器管理的另一个表,尽管这样做没有什么意义。)

首先,您必须在远程服务器上有一个要使用 FEDERATED 表访问的表。假设远程表在联邦数据库中,并且定义如下:

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

该示例使用 MyISAM 表,但该表可以使用任何存储引擎。

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

CREATE TABLE federated_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL DEFAULT '',
    other  INT(20) NOT NULL DEFAULT '0',
    PRIMARY KEY  (id),
    INDEX name (name),
    INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';

(在 MySQL 5.0.13 之前,使用 COMMENT 而不是 CONNECTION。)

【讨论】:

在某种程度上这是“正确”的解决方案,但 FEDERATED 表非常慢(几乎所有内容都天真地转换为全表扫描),因此如果您的数据位于都很大。 联邦处理原始表中的索引,您也应该尊重本地索引,但遗憾的是不要使用查询缓存,并且在大量插入时性能不佳【参考方案2】:

mysqldump 可能是已经提到的解决方案,或者您可以尝试使用SELECT ... INTO OUTFILE,然后使用LOAD DATA INFILE ... 命令。

MySQL 确实有可能对您有用的联合存储引擎。这里有一些关于它的更多文档http://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html 我不得不承认我并没有取得巨大的成功,但它可能对你有用。

第三种解决方案是在您的应用程序中完成这项工作。逐行读取SELECT 查询的结果,并将INSERT 逐行读取到另一个服务器。不过,您可能会在数据类型和 null 处理方面遇到一些问题。

【讨论】:

【参考方案3】:

由于mysql客户端一次只能连接一个服务器,简短的回答是不。但总有办法...

mysqldump 的最新版本支持--where 参数,可用于限制转储的数据。这意味着您可以运行一个简单的SELECT(即一个表上的所有列)并为INSERT 它生成有效的SQL。然后,您可以将源服务器的此类 mysqldump 命令的输出通过管道传输到目标服务器的 mysql 命令。

您可能希望在mysqldump 命令中包含一些选项,例如--no-create-info--no-add-locks。对其进行测试,直到输出完全符合您的要求。

【讨论】:

如果你曾经遇到过 mysql 客户端正在执行连接的情况,那么你就有麻烦了——正确的解决方案是让服务器相互通信并生成单个结果集以发送给客户。 MSSQL 通过允许您“链接”服务器来实现这一点 - 并配置它们将用于连接的凭据等......然后通过别名访问这些服务器。 我读了一些书才明白你在说什么。另一个答案描述了如何在 MySQL 中执行此操作,这可能是比我发布的更通用的解决方案。

以上是关于MySQL 跨服务器选择查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql的跨服务器 关联查询--Federated引擎

Yii2实现跨mysql数据库关联查询排序功能

mySQL 子查询/跨数据库连接?

MySQL数据库跨服务器数据同步

跨 2 个表的 Mysql SQL 查询 - 不知道如何正确执行

跨服务器,标准 SQL 生成逗号分隔列表