Вот уже не первый раз возникла задача залить дамп большой базы MySQL на хостинг. Раньше я делал это с помощью phpMyAdmin, но в случае с огромными дампами часто возникали проблемы. По причине ограничения памяти и времени исполнения скриптов в php, большие файлы не обрабатывались до конца. Приходилось идти на разные хитрости.
Например, несколько раз я заливал файлы дампов на сервер и запускал через SSH на сервере программку, которая их импортировала в БД. Способ конечно неплохой, но не всегда есть доступ ssh, иногда он вообще не входит в услуги хостинга, иногда что-то надо выяснять с техподдержкой хостера. А это лишние действия, которых всегда хочется избежать. Да и сама программка, с помощью которой идёт работа с удаленным сервером через shell довольно сложна для тех, кто не работал с линуксом, т. к. в ней надо писать вручную команды для этого самого удаленного сервера. Может быть, где-то это организовано и получше, но в PuTTY (который судя по всему является одним из самых популярных SSH-клиентов) мне было сложновато сразу разобраться. В общем, у меня конечно получилось залить большой дамп, но особого удовольствия я не получил, т.к. пришлось повоевать с хостером за шелл и потратить около часа времени, чтобы разобраться с этой программкой.
Однажды я заливал дамп вообще извращенным способом - делал из MySQL базы на локальном компьютере с помощью phpMyAdmin относительно маленькие дампы (по 2-5 МБ) и с помощью phpMyAdmin на удалённом сервере заливал эти файлы в нужную базу. Способ тоже не понравился, т.к. пришлось раз 20 повторить одно и то же действие, нужно было следить, чтобы не пропустить никакого кусочка базы и ничего не заливать по 2 раза. Также при копировании и отправке таких текстовых фрагментов по 2-5 МБ браузер жестко тормозил. Я залил в конце концов нужный дамп, но снова за тот же час, что и в первом случае.
Когда передо мной вновь возникла задача заливки огромного дампа (около 100 МБ) на сервер, я задумался о том, как избежать проблем первых двух случаев. Идея залить дамп через фтп, порезать его на кусочки с помощью php скрипта и дальше с помощью этого же скрипта импортировать его в базу MySQL показалась мне наилучшим решением проблемы.
Однако, программировать было некогда да и лень
Поэтому попытался быстренько залить дамп с помощью второго из описанных выше способов - через phpMyAdmin. Я вкинул кусочек дампа в соответствующую форму phpMyAdmin - и браузер подвис при его передаче. Через некоторое время я увидел сообщение об ошибке, в котором было написано, что у php не хватает памяти на данную операцию. Хотел было увеличить количество памяти, выделенной для пхп, но потом всё-таки дочитал до конца сообщение об ошибке. А в нем было написано, что для загрузки больших файлов нужно воспользоваться сведениями из документации phpMyAdmin. В документации нашел ссылку на BigDump, который и стал решением моей проблемы. Суть этого скрипта примерно такая же, как я задумывал выше:
- Загрузка файла дампа на ftp;
- Изменение в файле bigdump.php данных для доступа к БД MySQL;
- Загрузка файла bigdump.php на ftp в ту же папку, где находится залитый ранее дамп.
После проведения этих простых операций в браузере открываем файл bigdump.php и наблюдаем примерно следующее:
Как видно из рисунка, дампы могут быть как простыми текстовыми файлами, так и архивами. На этой странице выбираем файл, который нужно импортировать, и всё - процесс пошел. О его ходе будет сообщать такая страничка:
Синенькая полоска внизу по ходу загрузки будет двигаться, это реализовано с помощью AJAX. Таким образом, заливка больших дампов MySQL с помощью BigDump становится простым, быстрым и приятным занятием, за что можно сказать спасибо автору этого скрипта.
P. S. Внимание! Не забудьте правильно выставить кодировку для этого дампа в скрипте bigdump.php, за неё отвечает переменная $db_connection_charset. По умолчанию она пустая. В первый раз я забыл про неё - русские буквы благополучно накрылись медным тазом. Поставил $db_connection_charset = “utf8″; - и проблема была решена.
Январь 16th, 2009 at 17:06
ыыыы, я давно решил для себя эту проблемму, написав скрипт эмулирующий работу терминала. а дальше дело в шляпе: загружаем скрипт и дамп через фтп, а дальше просто вводим команду - что-то вроде
mysql -h host.ru -u username -p dbname < dump
Январь 16th, 2009 at 17:37
Тоже вариант… Но это ж надо право для скриптов php на выполнение exec или чего-то подобного?
Январь 20th, 2009 at 14:46
Скрипт супер очень помог в работе.
Январь 21st, 2009 at 22:56
Большое спасибо за программку, давно мучался вопросом заливки больших баз данных, через ssh пытался разобраться, но особо не получилось, да и времени на это особо не было, приходилось резать таблицы
Февраль 26th, 2009 at 23:16
скрипт ваще кульный. соу мач сенкс автору
Май 1st, 2009 at 23:25
Интересный материал, спасибо!
Июнь 5th, 2009 at 12:00
Попробовал, не хватает видно лимита времени, вышала вот такая ошибка
http://s44.radikal.ru/i104/0906/89/a7d6055bb562.jpg
Ноябрь 19th, 2009 at 9:27
Спасибо. Скрипт решил следующую проблему - нужно было перенести маленький дамп на хостинг со старой версией MySQL и без PHPMyAdmin. Писать скрипт было лень:) Этот выручил замечательно
Апрель 21st, 2010 at 17:20
Спасибо буду сейчас пробывать на базе весом 1.2 гб без архива
Апрель 27th, 2010 at 21:15
Спасибо…скрипт помог залить большую базу, но возникли проблеми с кодировкой cp1251(((
Июнь 19th, 2010 at 1:24
Спасибо. Удалось залить 300МБ дамп форума с помощью этого скрипта. Я удивляюсь почему в phpmyadmin до сих пор не добавили что-нибудь подобное.
Июль 14th, 2010 at 23:19
Недавно возникла такая же проблемка, пол дня промучился пока не нашел замечательный скриптик Sypex Dumper (http://sypex.net) и база в 280Mb зашла как к себе домой))