Mysql 从两个不同的服务器连接表

Mysql 从两个不同的服务器连接表,mysql,Mysql,我有两个不同的服务器server1和server2,现在我在server1中有db1,在server2中有db2。 我正试图像这样在MySQL中连接这两个表 Select a.field1,b.field2 FROM [server1, 3306].[db1].table1 a Inner Join [server2, 3312].[db2].table2 b ON a.field1=b.field2 但是我犯了一个错误。在MYSQL中是可能的。是的,在MYSQL中是可能的。

我有两个不同的服务器
server1
server2
,现在我在
server1
中有
db1
,在
server2
中有
db2
。 我正试图像这样在MySQL中连接这两个表

Select a.field1,b.field2  
FROM  [server1, 3306].[db1].table1 a  
Inner Join [server2, 3312].[db2].table2 b  
ON a.field1=b.field2  
但是我犯了一个错误。在MYSQL中是可能的。

是的,在MYSQL中是可能的。 也有类似的问题。你必须用它来做这件事。这个想法是这样的:

您必须在另一个远程位置有一个基于该表的联邦表,才能使用您想要的方式。表的结构必须完全相同

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';

复制将是另一种合适的解决方案

server1-db1->复制到server2。(现在db1和db2将位于同一个服务器server2中。加入将很容易)


注意:如果server2在存储/进程等方面足以承担db1的负载,那么wen可以进行复制。正如@brilliand所提到的,联邦将使大量的手工工作变得缓慢

这是一种黑客行为,不是一种连接,但我使用bash函数让它看起来像是在进行跨服务器查询:

明确版本:

tb2lst(){
    echo -n "("
    tail -n +2 - | paste -sd, | tr -d "\n"
    echo ")"
}

id_list=$(mysql -h'db_a.hostname' -ume -p'ass' -e "SELECT id FROM foo;" | tb2lst)
mysql -h'db_b.hostname' -ume -p'ass' -e "SELECT * FROM bar WHERE foo_id IN $id_list"

+--------|-----+
| foo_id | val |
+--------|-----+
| 1      | 3   |
| 2      | 4   |
+--------|-----+
我编写了一些包装器函数,它们保存在我的bashrc中,因此我的观点是它只是一个命令:

db_b "SELECT * FROM bar WHERE foo_id IN $(db_a "SELECT id FROM foo;" | tb2lst);"

+--------|-----+
| foo_id | val |
+--------|-----+
| 1      | 3   |
| 2      | 4   |
+--------|-----+
至少在我的用例中,这足够快地将两个查询缝合在一起,使输出相当于连接,然后我可以将输出导入任何工具需要的地方


请记住,一个查询中的id列表在另一个查询中作为查询文本结束。如果以这种方式“连接”太多数据,操作系统可能会限制查询的长度()。所以请注意,对于非常大的数据集来说,这是一个糟糕的解决方案。我发现对像pymysql这样的mysql库做同样的事情可以绕过这个限制。

你可以尝试
联邦存储引擎,你可以使用联邦存储引擎。我认为你最好选择两个表,在php中获得它们的结果,并应用您可能需要的任何数据操作。对于大型数据库表,可能的重复操作非常缓慢。我仍在寻找更好的方法,但在许多情况下,联邦表的可扩展性不足以成为一种选择。嗨,你找到更好的解决方案了吗?@nomandlawar,嗨,我还没有找到更好的方法。如果你找到一个,我很想看看。虽然它不一样,复制可能是一个很好的解决方案,取决于你的使用case@JohnHunt,我反对,正如你提到的,这是不一样的。复制未连接来自不同服务器的表。