Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2008-08-30 18:04:36

hcs
Гость

Cкрипт для восстановления сохраненной бд

Столкнулся очередной раз с идиотской проблемой отечественных хостеров (жадность до ресурсов).
Например на сервере в америке бд объемом 45мб прекрасно закачивается незапакованная и исполняется в phpMyAdmin'е без каких-либо ошибок.
У наших хостеров с этим туго. Даже если дать упакованный дамп, который нормально зааплоадится на сервер, то после распаковки во время исполнения phpMyAdmin все равно поперхнется. Ругаться с хостерами бессмысленно, уходить за океан иной раз из-за такой мелочи накладно.
Сделал скрипт, который распаковывает  дамп и построчно исполняет. Может кому пригодится
Особенность скрипта - упакованный дамп должен называться sqldata.gz, скрипт работает в только связке с punbb1.3, ложить надо в корень, туда же ложить дамп.
Перед выполнением должна быть создана структура таблиц.
Порядок действий
1. Сделать дамп БД в 2 этапа:
1.2 дамп структуры
1.3 дамп данных, с опциями "полная вставка", сжатие gz
2 Создать в новой бд структуру из дампа структуры
3 Скопировать дамп данных в корень форума
4 Создать файл dbrestore.php в корне форума такого содержания:

function gunzip ($in, $out)
{
   if (!file_exists ($in) || !is_readable ($in))
       return false;
   if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
       return false;

   $in_file = gzopen ($in, "rb");
   $out_file = fopen ($out, "wb");

   while (!gzeof ($in_file)) {
       $buffer = gzread ($in_file, 4096);
       fwrite ($out_file, $buffer, 4096);
   }
 
   gzclose ($in_file);
   fclose ($out_file);
  
   return true;
}
set_time_limit(0);
define('SQL_FILE', 'sqldata.sql');
define('GZ_SQL_FILE', 'sqldata.gz');

header('Content-type: text/html; charset=utf-8');

if (!defined('FORUM_ROOT'))
    define('FORUM_ROOT', './');
@include FORUM_ROOT.'config.php';
require FORUM_ROOT.'include/dblayer/common_db.php';

if (!function_exists('gzopen'))
    exit('GZ function not included!');

if (!file_exists (GZ_SQL_FILE) || !is_readable (GZ_SQL_FILE)) {
    exit('No '.GZ_SQL_FILE.' file detected! ');
}

if (!gunzip(GZ_SQL_FILE, SQL_FILE))
    exit('Error when gunzipped! ');


$handle = fopen(SQL_FILE, "rb");
echo 'DB restore start... '."<br>";
$num = 0;
while (!feof($handle)) {
    $buffer = fgets($handle);
    if (stripos($buffer,'insert')!== false){
        echo ++$num.' ';    
        $forum_db->query($buffer);
    }else {
        $num = 0; 
        echo $buffer.'<br>';
    }
}
fclose($handle);

echo 'Complete! '."<br>";

5. выполнить этот скрипт
6. удалить скрипт, удалить sqldata.sql и sqldata.gz из корня форума

Подвал доски

Под управлением FluxBB. Хостинг Hostens