Перенос данных MySQL, скорость и эффективность

Мне пришлось изменить план моего веб-приложения, чтобы уменьшить время загрузки (http://stackoverflow.com/questions/5096127/best-way-to-scale-data-decrease-loading-time-make-my-webhost-happy) .

Это изменение схемы подразумевает, что данные моего приложения должны быть перенесены в эту новую схему (в противном случае мое приложение не будет работать). Чтобы перенести все мои записи MySQL (тысячи записей), я написал сценарий PHP/MySQL.

Открытие этого скрипта в моем браузере не работает. Я установил ограничение времени скрипта на 0 для неограниченного времени загрузки, но через несколько минут скрипт перестает загружаться. Cronjob тоже не совсем вариант: 1) как ни странно, он не загружается, но самая большая проблема: 2) я боюсь, что это будет стоить слишком много ресурсов моего общего сервера.

Знаете ли вы быстрый и эффективный способ переноса всех моих записей MySQL с помощью этого скрипта PHP/MySQL?


person Robin    schedule 26.02.2011    source источник
comment
Распечатывается ли у вас какая-либо отладочная информация во время работы вашего PHP-скрипта? Я всегда находил это полезным. Кроме того, чтобы снизить нагрузку на систему, попробуйте переносить записи пакетами, используя LIMIT в своих операторах SQL; LIMIT также принимает вторичный аргумент для смещения вашего начального индекса.   -  person nesv    schedule 26.02.2011


Ответы (2)


Вы можете попробовать PHP «ignore_user_abort». Это немного опасно, потому что вам нужен НЕКОТОРЫЙ способ завершить его выполнение, но, возможно, ваш браузер прервал работу из-за слишком долгого выполнения скрипта.

person Shad    schedule 26.02.2011
comment
Сценарии PHP выводят отладочную информацию (успех/неудача/дубликат) для каждого идентификатора пользователя. Я пытался использовать ignore_user_abort(true), но заметил, что некоторые записи пропускаются (и тем не менее, это занимает много-много времени...) Однако я не могу остановить этот скрипт, так что теперь мне нужно подождать несколько дней, прежде чем Я могу попробовать другой способ переноса данных. Или у вас есть идеи, как остановить этот скрипт? - person Robin; 27.02.2011
comment
@Robin ergh~ у тебя есть доступ по SSH? или вы можете связаться с кем-то с ним? вам нужен kill процесс. - person Shad; 27.02.2011

Я решил проблему!

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

Как?

1) Я добавил ignore_user_abort(true); и set_time_limit(0);, чтобы убедиться, что скрипты продолжают работать на сервере (останавливаются, когда цикл while() завершается).

2) В цикле while() я добавил некоторый код, чтобы иметь возможность остановить сценарий миграции, создав небольшой текстовый файл с именем stop.txt:

    if(file_exists(dirname(__FILE__)."/stop.txt")) {
    error_log('Migration Stopped By User ('.date("d-m-Y H:i:s",time()).')');
    break;
}

3) Ошибки миграции и дубликаты регистрируются в моем журнале ошибок:

error_log('Migration Fail => UID: '.$uid.' - '.$email.' ('.date("d-m-Y H:i:s",time()).')');

4) После завершения миграции (используя mail()) я получаю электронное письмо с результатом миграции, поэтому мне не нужно проверять это вручную.

Это может быть не лучшее решение, но это хорошее решение для работы!

person Robin    schedule 27.02.2011