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
команда. Проверяйте это до тех пор, пока вывод не будет именно тем, что вы хотите.