Как я могу передавать данные между 2 базами данных MySQL? - PullRequest
21 голосов
/ 14 июля 2010

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

Ответы [ 5 ]

20 голосов
/ 14 июля 2010

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

В этом случае, если две таблицы имеют одинаковую структуру, как правило, самый быстрый и, как ни странно, самый простой подход - использовать SELECT ... INTO OUTFILE ... на одном конце и LOADDATA 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, вы можете сжимать их, разбирать их или туннелировать через сеть для вашего сердца.

11 голосов
/ 14 июля 2010

ФЕДЕРАЦИЯ хранилища?Не самая быстрая в этой группе, но на один раз, случайные или небольшие объемы данных.Это при условии, что вы говорите о 2 серверах.С двумя базами данных на одном и том же сервере это будет просто:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;
1 голос
/ 02 сентября 2013

из http://dev.mysql.com/doc/refman/5.0/en/rename-table.html:

Пока две базы данных находятся в одной файловой системе, вы можете использовать RENAME TABLE для перемещения таблицы из одной базы данных в другую:

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
1 голос
/ 14 июля 2010

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

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

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

0 голосов
/ 14 июля 2010

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

...