У меня есть база данных mysql, которую я пытаюсь перенести в другую базу данных. У них есть разные схемы, и я написал сценарий php для каждой таблицы старой базы данных, чтобы заполнить ее данные новым. Скрипт работает отлично, но проблема в том, что он не перемещает все данные. например, если у меня есть таблица, и вся ее информация выбирается, а затем вставлена в новую таблицу, но только половина из них выполняется. То, как я это делаю, я открываю базу данных, выбрав * и помещая ее в ассоциативный массив. то я закрываю соединение db и подключаюсь к другому, проходя через каждый элемент массива и вставляя их в новый. Есть ли ограничение на то, насколько большой массив может быть? что здесь не так?Перемещение базы данных через php
ответ
Вы должны прочитать строки из первой базы данных в кусках (например, из 1000 строк), записать эти строки во вторую базу данных, очистить массив (с помощью unset() или пустого массива) и повторить процесс до тех пор, пока вы не прочитайте все строки. Это преодолевает ограничения памяти.
Другая проблема может заключаться в том, что скрипт работает слишком долго (если таблица слишком большая), попробуйте использовать функцию set_time_limit(). Эта функция сбрасывает таймаут для скрипта, после которого он должен быть прерван. Я предлагаю позвонить ему после обработки каждого фрагмента.
. Благодарю вас, я дам вам знать, как это работает. – 2010-07-13 20:07:26
спасибо, что это помогло много! – 2010-07-24 06:42:17
Ваш сервер (как и все серверы) будет иметь ограничение памяти для PHP - если вы используете больше назначенного предела, тогда сценарий завершится с ошибкой.
Возможно ли просто сбросить текущую базу данных MySQL в текстовые файлы, выполнить поиск и замену или заменить на основе RegExp, чтобы изменить схемы в текстовых файлах, а затем перезагрузить измененные тестовые файлы в MySQL, чтобы завершить изменение? Если это одноразовая миграция, то это может быть лучший способ сделать это.
Это похоже на хлопот, но спасибо за информацию – 2010-07-13 20:08:03
Возможно, вы используете время выполнения PHP или ограничения памяти. Убедитесь, что соответствующие настройки в php.ini
достаточно высоки, чтобы сценарий завершил выполнение.
Можете ли вы рассказать мне, какие вещи мне нужно искать там? – 2010-07-11 19:07:33
@ Шахин Киан: max_execution_time и max_memory являются двумя главными подозреваемыми. – Borealid
tnx Я сделаю это с предложением 81403, и я думаю, что он должен работать. – 2010-07-13 20:09:03
У вас могут быть ограничения в целевой базе данных, которые отклоняют некоторые ваши попытки вставок.
+1, потому что это то, что действительно происходит без каких-либо серьезных сообщений об ошибках. Проверьте свои FK. И помните, что в таблице MyIsam нет FKs ... –
Почему бы вам не сделать это через sql-скрипты?
Если вы предпочитаете делать это через php, вы можете открывать соединения с обеими базами данных и вставлять их в цель при чтении из источника. Таким образом, вы можете избежать использования слишком большого объема памяти.
У меня была проблема с подключением к двум базам данных одновременно! плюс, как я буду читать все, кроме 1 за раз? (выбор * из таблицы 1 за раз?) – 2010-07-11 19:10:30
вы добавляете параметр 'LIMIT x, y' к вашему запросу, X - первая строка для чтения, а Y - число строк для чтения. Вместо статического X вы используете переменную PHP, которая прирастает в цикле 'while' или' for' – 3rgo
Прежде всего, я не вижу смысла писать сценарий для этого. Почему бы вам просто не получить дамп 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. Обязательно отключите использованные переменные, или вы можете столкнуться с той же проблемой.
Использование 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. Что лучше всего зависит от того, какую работу вы выполняете.
Удачи вам!
Было бы предпочтительнее, чтобы сделать 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
- 1. Перемещение данных базы данных
- 2. абсолютное перемещение базы данных
- 3. Перемещение базы данных Joomla
- 4. Перемещение базы данных TFS
- 5. Перемещение большого набора данных через базы данных django
- 6. Перемещение данных из базы данных SQL в массив в JavaScript через PHP
- 7. Перемещение общей базы данных Heroku
- 8. Перемещение базы данных с Hibernate
- 9. Перемещение базы данных в sqlcipher
- 10. Перемещение сценария базы данных SQL
- 11. Перемещение схемы базы данных MySQL
- 12. Перемещение базы данных Entity Framework
- 13. Перемещение базы данных MySQL UTF8
- 14. Перемещение базы данных firebird 2.5
- 15. Loop через поля базы данных PHP MySQL
- 16. PHP цикл через несколько таблиц базы данных
- 17. PHP Mysql соединяется через базы данных
- 18. Удаление строки базы данных через PHP
- 19. Получить имя столбца базы данных через PHP
- 20. Попытка поиска базы данных через PHP
- 21. Запрос базы данных через PHP (некоторые проблемы)
- 22. MVC Перемещение данных через представления
- 23. oracle - перемещение данных из одной базы данных
- 24. Перемещение базы данных SQL в ram
- 25. Создание и перемещение базы данных базы данных с помощью Perl
- 26. перемещение сайта и базы данных Wordpress
- 27. Поиск базы данных MySQL через HTML-форму через PHP
- 28. Перемещение объекта Hibernate из базы данных
- 29. Объединение через базы данных
- 30. Выбор нескольких данных из базы данных через PHP
Сколько данных есть в этих таблицах? 10 строк с 20 байтами в строке; или больше, как 10M строк с 1 КБ на строку? – pascal
1000000 строк с 0,5 КБ на строку * 20 столов – 2010-07-24 06:41:21