如何在 mysql 中启用跨数据库连接?

Posted

技术标签:

【中文标题】如何在 mysql 中启用跨数据库连接?【英文标题】:How do I enable cross-database joins in mysql? 【发布时间】:2010-09-25 04:38:08 【问题描述】:

我正在尝试使用如下查询将一些数据从我的生产数据库移植到我的沙箱:

INSERT `dbsandbox`.`SomeTable`(Field1, Field2, Field3)
SELECT t.Field1, t.Field2, t.Field3
FROM `dbprod`.`SomeTable` t;

当我尝试此跨数据库连接时,我收到以下错误:

错误 1142 (42000):SELECT 命令拒绝用户 'myusername'@'server.domain.tdl' 用于表 'SomeTable'

相关用户对两个数据库的相关表都有权限。我在 unix mysql 客户端和 windows MySQL Query Browser 应用程序中都尝试过,结果相同。

我错过了什么?

【问题讨论】:

【参考方案1】:

这听起来像是权限问题。用户权限通常以数据库方式设置在数据库上,因此目标用户无权访问源。

首先确保您可以从源数据库中进行选择。

SELECT t.Field1, t.Field2, t.Field3
FROM `dbprod`.`SomeTable` t;

这行得通吗?如果没有,那么您需要授予用户对源数据库的选择权限。

两个数据库都在同一台服务器上,对吧?

【讨论】:

是的,两个数据库都在同一台服务器上。无论是在使用 dbprod 还是 dbsandbox 时发出 select 语句,它都有效。【参考方案2】:

原来是权限问题。源数据库需要我使用的用户名的密码才能访问任何表。目标只要求用户名在本地主机上。

即使我每次在跨数据库查询的上下文中都使用密码启动 MySQL 客户端,但仍会尝试另一个连接。此连接不记得我最初使用密码对客户端进行身份验证,因此从沙箱连接到生产数据库失败。显然,显式声明表的数据库名称有时也意味着需要另一个连接。

答案是从生产数据库启动查询,引用不带数据库限定符的本地表,然后插入沙盒数据库表。这次成功了:

使用 dbprod

插入dbsandbox.SomeTable(Field1, Field2, Field3) 选择 t.Field1、t.Field2、t.Field3 FROM SomeTablet;

【讨论】:

以上是关于如何在 mysql 中启用跨数据库连接?的主要内容,如果未能解决你的问题,请参考以下文章

mysql长连接跨网段问题

如何在 Laravel 的 PHPUnit 中启用 Redis 连接

Mysql Workbench 连接 ssl 未启用

EFCore启用数据库连接池

跨网络的java mysql连接

PHP Mysql 跨数据库连接