Когда БД MySQL превышает PHP лимит на загрузку файлов, то импорт больших файлов MySQL базы данных может стать настоящей головной болью для администратора веб ресурса. Есть два средства, которые помогут - первое это mysqldump, второе BigDump.
mysqldump
Для экспорта и импорта больших MySQL дампов лучше конечно использовать специально созданную для этих целей mysqldump, но для этого потребуется доступ к SSH консоли:
cd /var/www/home/backup mysqldump -u username -pPASSWORS dbname > dbname_mysqldump_16022013.sql mysql -u username -pPASSWORS dbname < dbname_mysqldump_16022013.sql
Из описания man mysqldump версии MySQL сервера 5.5.30 следует, что опция "--opt", которая автоматически включает и "--quick", включена по умолчанию:
mysql Ver 14.14 Distrib 5.5.30, for Linux (x86_64) using readline 5.1
..........
mysqldump can retrieve and dump table contents row by row, or it can
retrieve the entire content from a table and buffer it in memory before
dumping it. Buffering in memory can be a problem if you are dumping
large tables. To dump tables row by row, use the --quick option (or
--opt, which enables --quick). The --opt option (and hence --quick) is
enabled by default, so to enable memory buffering, use --skip-quick.
О чем это говорит, а говорит это о том, что mysqldump может извлекать содержимое таблиц строку за строкой, а может и извлечь содержимое таблиц в буфер оперативной памяти перед созданием дампа. В версии MySQL 5.5.30, опция --opt, а также и опция --quick автоматически включаются в ходе работы mysqldump - т.е. по умолчанию mysqldump читает таблицы строку за строкой не помещая её предварительно в буфер оперативной памяти.
Из описания же утилиты mysqldump в книге Поль Дюбуа "MySQL", для какой только версии так и не ясно но явно старее чем 5.5.30, поведение mysqldump по умолчанию полностью противоположное - т.е. по умолчанию mysqldump предварительно помещает таблицы в буфер оперативной памяти, а потом уже создаёт дамп БД.
При обработке больших объёмов данных с предварительным помещением их в буфер оперативной памяти может привести к неприятным последствиям, вплоть до полного краха msqld демона/сервиса. Поэтому лучше всего когда есть доступ/выбор к SSH консоли и phpMyAdmin, то лучше всего использовать первый вариант с явно указанными опциями --opt и --quick
Если Вы используете саму свежую версию mysqldump для создания дампа, который планируется разворачивать на более старых версиях MySQL сервера, то вы недолжны использовать опции "--opt" и "--extended-insert" option, указав "--skip-opt".
Также нужно помнить, что с опцией "--opt" полностью блокируется чтение/запись БД на время создания дампа и поэтому создавать дампы с опцией "--opt" лучше всего ночью, когда мозгвыносящие спят:)
Дополнительные полезные опции для утилиты mysqldump:
- --add-drop-table и --add-drop-database — опция добавляет команду DROP TABLE перед восстановлением таблиц или DROP DATABASE перед восстановлением дампа БД - т.е. перед восстановлением таблиц БД из дампа, уже имеющиеся в рабочей БД таблицы с таким же именем будут сначала удалены, а потом пересозданы из резервной копии;
- --quote-names — названия таблиц и столбцов заключает в кавычки, рекомендуется для использования mysqldump на MySQL сервере младше 4.1.1, в более новых версиях --quote-names активирован по умолчанию;
- --compatible=mysql40 - если создаваемый дам планируется разворачивать на MySQL 4.0.x или других серверах БД, то для этого используйте эту опцию, для опции --compatible= также доступны значения: "ansi", "mysql323", "mysql40", "postgresql", "oracle", "mssql", "db2", "maxdb", "no_key_options", "no_table_options", "no_field_options";
- --comments, -i - позволяет в дамп добавить комментарий с дополнительной информацией, например о версии mysqldump, MySQL сервере, имени хоста и т.д;
- --all-databases - сделает дамп всех имеющихся на данном MySQL-сервере баз данных.
Для автоматического создания MySQL дампа можно использовать приведённый ниже bash скрипт:
Или вот такой вариант, для регулярного и автоматического создания всех доступных баз данных:
Незабываем добавить скрипт в crontab -u user -e.
BigDump
В случае когда БД будет превышать РНР лимит на загрузку файлов, обычно это 20-50-100 МБ, и нет возможности использовать mysqldump, то для импорта таких файлов phpMyAdmin нам не поможет.
В таких случаях для импорта таких файлов нужно или обращаться в тех. поддержку для ручного импорта БД администратором или же использовать какие-то скрипты на подобии BigDump, настройки которого в bigdump.php равны примерным значениям:
// Database configuration $db_server = 'localhost'; $db_name = ''; $db_username = ''; $db_password = ''; $filename = ''; $db_connection_charset = ''; define ('MAX_QUERY_LINES',300);
Думаю особых пояснений не нужно, что и как заполнять - $filename "путь к файлу дампа", а MAX_QUERY_LINES это количество строк которое может считаться за один запрос, которое подбирается индивидуально для каждого отдельно взятого дампа.
Например для полноценного импорта дампа OpenCart размером в 10-15 МБ, лимит РНР ограничивал загрузку в 2 МБ, значение MAX_QUERY_LINES пришлось постепенно увеличить до 3000.