Как включить кросс-базы данных в MySQL?

Я пытаюсь перенести некоторые данные из моей производственной базы данных в свою песочницу, используя такой запрос:

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 с тем же результатом.

Что мне не хватает?

2 ответа

Решение

Оказывается, это была проблема с разрешениями. Исходной базе данных требовался пароль для имени пользователя, которое я использовал для доступа к любым таблицам. Цель требовала, чтобы имя пользователя находилось только на локальном хосте.

Несмотря на то, что я запускаю клиент MySQL, используя пароль каждый раз в контексте запроса к базе данных, выполняется другое подключение. Это соединение не помнит, что я изначально проходил аутентификацию на клиенте с паролем, поэтому не удалось подключиться из песочницы к производственной базе данных. Очевидно, что явное указание имени базы данных для таблицы иногда подразумевает необходимость и другого соединения.

Ответ состоял в том, чтобы инициировать запрос из производственной базы данных, обратиться к локальным таблицам без спецификатора базы данных, а затем вставить их в таблицы базы данных песочницы. На этот раз это сработало:

ИСПОЛЬЗОВАТЬ dbprod

ВСТАВИТЬ dbsandbox,SomeTable(Поле 1, Поле 2, Поле 3) ВЫБЕРИТЕ t.Field1, t.Field2, t.Field3 FROM SomeTable т;

Это звучит как проблема с разрешениями. Часто пользовательские разрешения устанавливаются для базы данных в виде базы данных, поэтому у пользователя для получателя нет доступа к источнику.

Сначала убедитесь, что вы можете сделать выбор из исходной базы данных.

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

Это работает? Если нет, то вам нужно предоставить пользователю право выбора на исходной базе данных.

Обе базы данных находятся на / в одном сервере, верно?

Другие вопросы по тегам