2010-07-11 6 views
4

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

+0

Сколько данных есть в этих таблицах? 10 строк с 20 байтами в строке; или больше, как 10M строк с 1 КБ на строку? – pascal

+0

1000000 строк с 0,5 КБ на строку * 20 столов – 2010-07-24 06:41:21

ответ

4

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

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

+0

. Благодарю вас, я дам вам знать, как это работает. – 2010-07-13 20:07:26

+0

спасибо, что это помогло много! – 2010-07-24 06:42:17

0

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

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

+0

Это похоже на хлопот, но спасибо за информацию – 2010-07-13 20:08:03

0

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

+0

Можете ли вы рассказать мне, какие вещи мне нужно искать там? – 2010-07-11 19:07:33

+1

@ Шахин Киан: max_execution_time и max_memory являются двумя главными подозреваемыми. – Borealid

+0

tnx Я сделаю это с предложением 81403, и я думаю, что он должен работать. – 2010-07-13 20:09:03

2

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

+0

+1, потому что это то, что действительно происходит без каких-либо серьезных сообщений об ошибках. Проверьте свои FK. И помните, что в таблице MyIsam нет FKs ... –

1

Почему бы вам не сделать это через sql-скрипты?

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

+0

У меня была проблема с подключением к двум базам данных одновременно! плюс, как я буду читать все, кроме 1 за раз? (выбор * из таблицы 1 за раз?) – 2010-07-11 19:10:30

+1

вы добавляете параметр 'LIMIT x, y' к вашему запросу, X - первая строка для чтения, а Y - число строк для чтения. Вместо статического X вы используете переменную PHP, которая прирастает в цикле 'while' или' for' – 3rgo

3

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

1

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

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

memory_limit = 2048M max_execution_time = 3600

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

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

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

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

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

CREATE TABLE one SELECT * FROM two;

В качестве альтернативы вы можете использовать инструкции UPDATE. Что лучше всего зависит от того, какую работу вы выполняете.

Удачи вам!

1

Было бы предпочтительнее, чтобы сделать MySQL дамп в командной строке:

туздЫшпр -a -u -p USER_NAME SOURCE_DATABASE_NAME> DATA.mysql

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

GZIP DATA.mysql

После переноса разархивировать файл:

Gunzip -f DATA.mys ql.gz

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

MySQL -u -p USER_NAME TARGET_DATABASE_NAME < data.sql

Смежные вопросы