Как импортировать большой sql-скрипт (дамп базы данных mysql для форума phpbb), если обычными споcобами (загрузка через web-интерфейс phpmyadmin, backup cpanel) проблематична, особенно на модемном соединении.

Проблема
Как импортировать большой sql-скрипт (дамп базы данных mysql для форума phpbb), если обычными споcобами (загрузка через web-интерфейс phpmyadmin, backup cpanel) проблематична, особенно на модемном соединении.

Решение
Можно попробовать через mysql клиент типа sqlyog, mysql-front и т.д., но опять же не факт, что это закончится благополучно. Минимальное время – 1 (обычно 2-5) секунда на передачу и выполнение одной sql-команды (а если их тысяч пять? загрузка займёт весь рабочий день, плюс нужно следить, не упала ли связь). Можно импортировать файл дампа с помощью phpmyadmin или встроенных средств сpanel (что по сути один фиг), но закачивать большие объёмы данных методом post из формы не очень надёжно и нецелесообразно – метод post подходит для более рутинных задач, типа «Введите имя» и т.д.

Перепробовав все перечисленные способы, я выяснил, что основная проблема – непрерывная передача 9 Мб файла. Передать файл, говорите? Так это же делается через старый добрый ftp! Можно залить дамп на ftp (не волнуясь о целостности, ведь можно и докачать) и попросить админов восстановить базу, но не факт, что вам помогут, тем более на бесплатном хостинге. Хотя… где вы видели бесплатный хостинг с mysql? Стыд и срам тому программисту, который каждый раз трясёт суппорт своими недоделками.

Пройдя через всё это, решил написать простенькую утилиту на php, которая будет читать sql-файл построчно, точнее покомандно: выбирает команду (ограниченную точкой-с-запятой, исполняет её, и так далее по циклу). То есть все операции происходят внутри сервера, без участия клиента. Скорость бешеная, 9 Мб sql-скрипт за 5 секунд!!! Ессесно, файлик должен лежать там же, где скрипт.

Минусы
Занимает большое количество ресурсов сервера, весь файл читается в память. Можно усовершенствовать, читая из файлового только отдельные sql-команды. Будем считать это отправной точкой для сложной утилиты восстановления БД на сервере mysql.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
mysql_connect("localhost", "login", "password");
mysql_select_db ("database");
 
if (!file_exists($fname)) die ("Файл $fname не существует!");
$fp = fopen ($fname, "r");
$buffer = fread($fp, filesize($fname));
fclose ($fp);
 
$prev = 0;
 
while ($next = strpos($buffer,";",$prev+1))
{
$i++;
$a = substr($buffer,$prev+1,$next-$prev);
mysql_query($a);
$prev = $next;
}
 
echo "Выполнено $i команд";
 
?>

Что-то вроде этого.

$fname – имя файла sql-дампа
$prev – позиция предыдущей «;»
$next – позиция следующей «;» начиная с позиции $prev

Вызываем скрипт примерно так: sqlbackup.php?fname=backup.sql, будет выполнен файл backup.sql. В конце выводится число выполненных команд. Я замеряю время выполнения для интереса, здесь для упрощения убрал. Каждый может усложнить, как считает нужным, это всего лишь простое решение повседневной задачи за пять минут.