Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Сначала я предполагаю, что вы не можете просто скопировать каталог 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, вы можете сжать его, выполнить его или перетащить по сети в контент вашего сердца.

Ответ 2

ФЕДЕРАЛЬНЫЙ движок хранения? Не самый быстрый из них, но за один раз, случайные или небольшие объемы данных, которые он сделает. Это предполагает, что вы говорите о 2 СЕРВЕРАХ. С двумя базами данных на одном и том же сервере это будет просто:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;

Ответ 3

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

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

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

Ответ 4

из 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;

Ответ 5

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