我有两个不同的服务器server1
和server2
,现在我db1
中的server1
和db2
中的server2
。
我试图像这样在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中使用。
答案 0 :(得分:28)
也有类似的问题previously。您必须使用FEDERATED ENGINE来执行此操作。这个想法是这样的:
您必须拥有基于另一个远程位置的表的联合表才能使用您想要的方式。表的结构必须完全相同。
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';
答案 1 :(得分:1)
复制将是替代和合适的解决方案。
server1 - db1 - >复制到server2。 (现在db1和db2将位于同一服务器server2。加入将很容易)。
注意:如果server2足以在存储/进程等方面承担db1的负载,那么wen可以进行复制。正如@brilliand提到的那样,Federated会做很多手工工作并且进程缓慢。
答案 2 :(得分:1)
这是一种hack,不是联接,但是我使用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 |
+--------|-----+
至少在我的用例中,这将两个查询足够快地缝合在一起,以使输出等同于联接,然后我可以将其输出到需要的任何工具中。