如何在SQLyog中实现跨不同数据库的表连接查询?
解决SQLyog中跨数据库/跨连接查询的问题
一、同一MySQL服务器下跨库查询的正确操作
如果DB1和DB2属于同一MySQL服务器实例,你最初写的SQL语法是正确的,出现权限错误是因为当前登录账号没有同时访问两个数据库的权限:
SELECT DB1.table1.col1, DB2.table2.col2 FROM DB1.table1 JOIN DB2.table2 ON DB1.table1.commoncol1 = DB2.table2.commoncol2
给当前用户授予两个库的查询权限即可:
GRANT SELECT ON DB1.*, DB2.* TO '你的用户名'@'客户端IP'; FLUSH PRIVILEGES;
二、跨不同MySQL服务器(不同连接)查询的正确方式
你用spixxxxxxx@51.195.123.67.databasename.tablename的写法不符合MySQL语法,要实现跨连接查询,有两种可行方案:
方案1:用SQLyog自带的跨连接查询功能
SQLyog支持直接跨已打开的连接查询,操作步骤:
- 确保两个目标连接都在SQLyog中处于打开状态
- 新建一个空白查询标签(不要切换到任何单个数据库的标签页)
- 查询时用方括号包裹含特殊字符的连接名,格式为
[连接名].[数据库名].[表名]:
SELECT [spixxxxxxx@51.195.123.67].databasename.table1.col1, [本地连接名].DB2.table2.col2 FROM [spixxxxxxx@51.195.123.67].databasename.table1 JOIN [本地连接名].DB2.table2 ON [spixxxxxxx@51.195.123.67].databasename.table1.commoncol1 = [本地连接名].DB2.table2.commoncol2
方案2:配置MySQL FEDERATED存储引擎(原生SQL实现)
通过在本地服务器创建远程表的映射,实现像操作本地表一样跨服务器查询:
- 先检查MySQL是否开启FEDERATED引擎:
SHOW ENGINES;
如果未开启,在my.cnf/my.ini中添加federated参数,重启MySQL服务。
2. 在本地数据库创建映射表(字段结构要和远程表完全一致):
CREATE TABLE local_map_table ( col1 INT, col2 VARCHAR(100) -- 复制远程表的所有字段定义 ) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 CONNECTION='mysql://远程用户名:远程密码@51.195.123.67:3306/远程数据库名/远程表名';
之后就可以将这个映射表和本地表做关联查询。
三、常见问题排查
- 语法错误:跨连接查询时必须用方括号包裹含@、IP等特殊字符的连接名,否则会触发1064语法错误
- 权限问题:跨服务器查询时,要确保远程MySQL的账号允许当前客户端IP访问,且拥有目标表的查询权限
- 网络问题:跨服务器查询前,确认两台服务器之间网络互通,3306端口开放
内容的提问来源于stack exchange,提问作者user2834566
相关产品推荐
相关产品推荐

