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