Как я могу передать данные между 2 базами данных MySQL?

Я хочу сделать это с помощью кода и не используя инструмент как "MySQL Migration Toolkit". Самым легким путем я знаю, должен открыть соединение (использующий коннекторы MySQL) к DB1 и считать его данные. Открытое соединение с DB2 и записью данные к нему. Существует ли лучший/самый легкий путь?

22
задан Morano88 14 July 2010 в 00:15
поделиться

4 ответа

Сначала я предполагаю, что вы не в состоянии просто скопировать каталог data /, потому что, если вы затем используете существующий снимок / резервное копирование / восстановление, вероятно, будет достаточно (и протестируйте свои процедуры резервного копирования / восстановления в придачу).

В этом случае, если две таблицы имеют одинаковую структуру, как правило, самым быстрым и, по иронии судьбы, самым простым подходом будет использование SELECT ... INTO OUTFILE ... на одном конце и LOAD DATA INFILE ... на другом Другие.

См. http://dev.mysql.com/doc/refman/5.1/en/load-data.html и ... / select.html для получения более подробной информации.

Для тривиальных таблиц будет работать следующее:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
  FIELDS TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"' 
  ESCAPED BY '\\\\' 
  LINES TERMINATED BY '\\n' ;

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
  FIELDS TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"' 
  ESCAPED BY '\\\\' 
  LINES TERMINATED BY '\\n' ;

Мы также использовали FIFO для большого эффекта, чтобы избежать накладных расходов, связанных с фактической записью на диск, или, если нам по какой-то причине нужно записать на диск, передать его через gzip .

т.е.

mkfifo /tmp/myfifo
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz &
... SEL

ECT... INTO OUTFILE '/tmp/myfifo' .....
wait

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo &
... LOAD DATA INFILE /tmp/myfifo .....
wait

По сути, если вы направите данные таблицы в FIFO, вы можете сжать их, изменить или туннелировать по сети, чтобы вам было угодно.

20
ответ дан 29 November 2019 в 05:09
поделиться

Механизм хранения FEDERATED? Не самый быстрый из всех, но для одноразовых, случайных или небольших объемов данных сойдет. Это при условии, что вы говорите о 2 серверах. С двумя базами данных на одном и том же сервере это будет просто:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;
11
ответ дан 29 November 2019 в 05:09
поделиться

Вы можете использовать mysqldump и mysql (клиент командной строки). Это инструменты командной строки, и в вопросе, который вы пишете, вы не хотите их использовать, но все же их использование (даже путем запуска из вашего кода) - самый простой способ; mysqldump решает много проблем.

Вы можете делать selectы из одной базы данных и insert в другую, что довольно просто. Но если вам нужно также перенести схему базы данных (create tables и т.д.), это становится немного сложнее, поэтому я рекомендую mysqldump. Но многие PHP-MySQL-админы также делают это, так что вы можете использовать их или посмотреть их код.

Или вы можете использовать репликацию MySQL.

1
ответ дан 29 November 2019 в 05:09
поделиться

Если вы включили двоичное ведение журнала на своем текущем сервере (и у вас есть все журналы bin), вы можете настроить репликацию для второго сервера

0
ответ дан 29 November 2019 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: