Миграция базы данных через php - PullRequest
4 голосов
/ 11 июля 2010

У меня есть база данных mysql, которую я пытаюсь перенести в другую базу данных.У них разные схемы, и я написал скрипт php для каждой таблицы старой базы данных, чтобы заполнить ее данные новой.Скрипт работает просто отлично, но проблема в том, что он не перемещает все данные.например, если у меня есть таблица, и вся ее информация отбирается и затем вставляется в новую таблицу, но только половина из них выполняется.То, как я это делаю, я открываю базу данных, выбирая * и помещая ее в ассоциативный массив.затем я закрываю соединение БД и подключаюсь к другому, прохожу каждый элемент массива и вставляю их в новый.Есть ли предел тому, насколько большим может быть массив?что здесь не так?

Ответы [ 8 ]

4 голосов
/ 13 июля 2010

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

Другая проблема может заключаться в том, что скрипт выполняется слишком долго (если таблица слишком велика), поэтому попробуйте использовать функцию set_time_limit () . Эта функция сбрасывает время ожидания для скрипта, после чего оно должно быть прервано. Я предлагаю вызывать его после обработки каждого куска.

3 голосов
/ 16 июля 2010

Прежде всего, я не вижу смысла в написании сценария для этого. Почему бы вам просто не получить дамп SQL от phpMyAdmin и отредактировать его так, чтобы он подходил для другой базы данных? Или они такие разные?

Но чтобы ответить на ваш вопрос: моей первой мыслью было бы, как и другие люди, уже говорили, что проблема будет в ограничении времени. Прежде чем пытаться что-то с этим сделать, вы должны проверить значение max_execution_time в php.ini (это примерно 30 секунд большую часть времени) и сколько времени занимает выполнение сценария. Если он завершается примерно через 30 секунд (или значение max_execution_time, если оно отличается), вероятно, в этом проблема, хотя php должен выдать ошибку (или хотя бы предупреждение).

Я не думаю, что есть ограничение на размер массива в php. Однако в php.ini есть директива, а именно memory_limit, определяющая объем памяти, который может использовать скрипт.

Если у вас есть доступ к файлу php.ini, я предлагаю установить для max_execution_time и memory_limit более высокое значение. Если у вас нет доступа к php.ini, вы не сможете изменить директиву memory_limit. Вам придется обойти это, например, используя LIMIT в вашем SQL. Обязательно сбросьте использованные переменные, иначе вы можете столкнуться с той же проблемой.

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

У вас могут быть ограничения в целевой базе данных, которые отклоняют некоторые ваши попытки вставки.

1 голос
/ 19 июля 2010

Желательно сделать дамп mysql в командной строке:

mysqldump -a -u USER_NAME -p SOURCE_DATABASE_NAME> DATA.mysql

Вы также можете сжать файл, чтобы уменьшить его для передачи на другой сервер:

gzip DATA.mysql

После передачи распакуйте файл:

gunzip -f DATA.mysql.gz

И импортировать его:

mysql -u USER_NAME -p TARGET_DATABASE_NAME

1 голос
/ 19 июля 2010

Использование php для выполнения логики преобразования / преобразования возможно.Я бы сделал это, если вы делаете сложные преобразования и если ваши навыки php намного лучше, чем ваш набор навыков mysql.

Если вам нужно больше памяти в вашем скрипте php, используйте:

memory_limit = 2048Mmax_execution_time = 3600

Это даст вам 2 гигабайта свободного пространства для массива и около часа для обработки.Но если ваша база данных действительно такая большая, она будет намного (намного) намного быстрее в использовании:

1.mysqldump, чтобы сделать дамп вашего исходного сервера

Проверьте это здесь: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

2.Загрузите дамп-файл и импортируйте его.На странице документации mysql есть множество примеров.(Смотрите также в комментариях.)

После этого вы можете преобразовать свою базу данных с помощью операторов CREATE / SELECT.

CREATE TABLE один SELECT * ИЗ двух;

КакВ качестве альтернативы вы можете использовать UPDATE-операторы.То, что лучше всего, сильно зависит от того, какую работу вы делаете.

Удачи!

1 голос
/ 11 июля 2010

Почему бы не сделать это с помощью сценариев sql?

Если вы предпочитаете делать это с помощью php, тогда вы можете открывать соединения с обеими базами данных и вставлять их в target, как вы читаете из источника.Таким образом, вы можете избежать использования слишком большого количества памяти.

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

Возможно, вы работаете с ограничениями времени выполнения или объема памяти в PHP.Убедитесь, что соответствующие настройки в php.ini достаточно высоки, чтобы скрипт мог завершиться.

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

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

Можно ли просто скопировать текущую базу данных MySQL в текстовые файлы, выполнить операции поиска и замены или замены на основе RegExp, чтобы изменить схемы в текстовых файлах, а затем повторно загрузить исправленные тестовые файлы в MySQL, чтобы завершить изменение ? Если это разовая миграция, то это может быть лучший способ сделать это.

...