Як імпортувати великий 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? Сором і ганьба тому програмісту, який кожен раз трясе супорт своїми недоробками.
Займає велику кількість ресурсів сервера, весь файл читається в пам'ять. Можна вдосконалити, читаючи з файлового тільки окремі SQL-команди. Будемо вважати це відправною точкою для складної утиліти відновлення БД на сервері MySQL.
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);
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. В кінці виводиться число виконаних команд. Я заміряю час виконання для інтересу, тут для спрощення прибрав. Кожен може ускладнити, як вважає за потрібне, це всього лише просте рішення повсякденному завдання за п'ять хвилин.