MySQL Cross Server Select Query

Можно ли написать запрос выбора между серверами, используя MySQL Client. В основном установка выглядит следующим образом.

База данных IP сервера
--------- --------
1.2.3.4 Тест
тест abcd

Я хочу написать запрос, который выберет строки из таблицы в тестовой базе данных на 1.2.3.4 и вставит результат в таблицу в тестовую базу данных на abcd.
Мои серверы расположены за много миль друг от друга, поэтому я открою SSH-туннель, чтобы соединить их.

Есть указатели?

3 ответа

Решение

mysqldump может быть решением, как уже упоминалось, или вы можете попробовать использовать SELECT ... INTO OUTFILE а потом LOAD DATA INFILE ... команды.

MySQL имеет интегрированный механизм хранения, который может быть полезен для вас. Вот еще немного документации по этому вопросу. http://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html Я должен признаться, что у меня не было большого успеха, но это может работать для вы.

Третьим решением будет сделать работу в вашем приложении. Читайте в результатах SELECT запрос строка за строкой и INSERT на другой сервер построчно. Однако вы можете столкнуться с некоторыми проблемами с типами данных и обработкой нуля.

Как насчет использования федеративных таблиц на одном из серверов? создайте федеративные таблицы на основе удаленных таблиц, которые вы будете использовать в запросе, и просто выполните запрос, как если бы ваша база данных была локальной. пример ниже с сайта MySQL

Процедура использования таблиц FEDERATED очень проста. Обычно у вас работает два сервера, либо на одном, либо на разных хостах. (Для таблицы FEDERATED возможно использование другой таблицы, управляемой тем же сервером, хотя в этом нет особого смысла.)

Во-первых, у вас должна быть таблица на удаленном сервере, к которой вы хотите получить доступ с помощью таблицы FEDERATED. Предположим, что удаленная таблица находится в базе данных объединения и определяется следующим образом:

CREATE TABLE test_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=MyISAM 
CHARSET=latin1;

В примере используется таблица MyISAM, но в таблице может использоваться любой механизм хранения.

Затем создайте таблицу FEDERATED на локальном сервере для доступа к удаленной таблице:

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

(До MySQL 5.0.13 используйте КОММЕНТАРИЙ, а не СОЕДИНЕНИЕ.)

Так как клиент mysql может одновременно подключаться только к одному серверу, краткий ответ - нет. Но всегда есть способ...

Последние версии mysqldump поддерживать --where параметр, который можно использовать для ограничения сбрасываемых данных. Это означает, что у вас есть способ запустить простой SELECT (т.е. все столбцы в одной таблице) и создание допустимого SQL для INSERT Это. Затем вы можете передать вывод такого mysqldump Команда для исходного сервера в mysql Команда на целевой сервер.

Вы, вероятно, хотите включить несколько вариантов, таких как --no-create-info а также --no-add-locks на mysqldump команда. Проверяйте это до тех пор, пока вывод не будет именно тем, что вы хотите.

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