Я хочу сделать это с помощью кода и не используя инструмент как "MySQL Migration Toolkit". Самым легким путем я знаю, должен открыть соединение (использующий коннекторы MySQL) к DB1 и считать его данные. Открытое соединение с DB2 и записью данные к нему. Существует ли лучший/самый легкий путь?
Сначала я предполагаю, что вы не в состоянии просто скопировать каталог 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, вы можете сжать их, изменить или туннелировать по сети, чтобы вам было угодно.
Механизм хранения FEDERATED? Не самый быстрый из всех, но для одноразовых, случайных или небольших объемов данных сойдет. Это при условии, что вы говорите о 2 серверах. С двумя базами данных на одном и том же сервере это будет просто:
INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;
Вы можете использовать mysqldump
и mysql
(клиент командной строки). Это инструменты командной строки, и в вопросе, который вы пишете, вы не хотите их использовать, но все же их использование (даже путем запуска из вашего кода) - самый простой способ; mysqldump
решает много проблем.
Вы можете делать select
ы из одной базы данных и insert
в другую, что довольно просто. Но если вам нужно также перенести схему базы данных (create table
s и т.д.), это становится немного сложнее, поэтому я рекомендую mysqldump
. Но многие PHP-MySQL-админы также делают это, так что вы можете использовать их или посмотреть их код.
Или вы можете использовать репликацию MySQL.
Если вы включили двоичное ведение журнала на своем текущем сервере (и у вас есть все журналы bin), вы можете настроить репликацию для второго сервера