За последние 24 часа нас посетили 22603 программиста и 1015 роботов. Сейчас ищут 622 программиста ...

выполнение дампов SQL- переполнение памяти

Тема в разделе "MySQL", создана пользователем dj--alex, 13 авг 2008.

  1. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    При выполнении дампов обнаружил что даже очень приличная память на моем сервере долго не выдерживает
    вроде бы и коннект выключаю,и файл закрываю,а тем не менее
    при выполнении дампиков по 800мб память в 4гб засирается в 4-5 выполнений
    т.е. этот скриптсчас прекрасно годится для вызывания зависания сервера :)
    как бы это можно исправить может кто помочь?
    (ну кроме докупки оперативной памяти? )
    Код (Text):
    1. // процедура восстановления базы данных из дампа.
    2. if (($dump)AND($start==cmsg(DALEE))) {
    3.     $path=getcwd ()."/_local/dump/";
    4.     @$connect = mysql_connect ($prdbdata[$tbl][6], $sd[14] , $sd[17]);
    5.     $dumpfile=$dump[0];
    6.     $f=fopen ($path.$dumpfile,"r");
    7.     if ($views) print_r ($dump);
    8.     echo "file=$path $dumpfile";
    9.     $query="";
    10.     while ($a=fgets ($f)) {// пока читается
    11.     if ($a[0]==="#") continue;  if ($a[1]==="#") continue;// skip comment lines
    12.     $najti=strpos ($a,";");
    13.     $najti2=strpos ($a,"SELECT DATABASE");
    14.     $najti3=strpos ($a,"create database if not exists");
    15.     if ($najti2!==false) {$a=str_replace ("SELECT DATABASE ","USE ",$a);}
    16.     if ($najti3!==false) {mysql_query ($a,$connect);
    17.                             $a=str_replace ("create database if not exists","USE ",$a);
    18.                         echo "<br>".cmsg (W_NDB_FORC)."($a)<br>";
    19.                             }
    20.     if ($najti===false) {$query.=$a;continue;}
    21.     if ($najti!==false) {$query.=$a;}
    22.     if ($views) echo "<br>EXECUTING:".$query."<br>";
    23.     $result=mysql_query ($query,$connect);
    24.     $query="";
    25.     $queries++;
    26.     //if ($queries) ob_flush();//die ("lim");
    27.     if (($result==false)) {$err++; if ($views) echo "ERROR QUERY:$a<br><br>";}   // вот это верно а не -1  тут false сверятся должен!!!!
    28.     if ($result==0) $skipped++;
    29.  sqlerr();ob_flush();
    30.  
    31.     }
    32.     if (!$pr[8])    echo "DEBUG $query.<br>";
    33. $x=cmsg (WF_EXQUES)."$queries"; echo "$x<br>";
    34. //$x=cmsg ("BCK_TBL+")."".$tables;  echo "$x<br>";
    35. $x=cmsg (BCK_SKIP).$skipped;    echo "$x<br>";
    36. $x=cmsg (BCK_ERR).$err; echo "$x<br>";
    37. $query="";
    38.     mysql_close($connect);
    39.     fclose ($f);
    40.     ob_clean();
    41.     //apache_child_terminate();
    42.    
    43. }
    PS И еще как можно установить 16 и более ГБ памяти если в продаже есть линейки только на 2гб максимум.?
    Доб. Вроде решил ,осталось серв перегрузить еще разок для чистоты проверки - нет все равно с каждым разом памяти становиться все меньше и меньше :(((
     
  2. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    АП
    ну у меня заливка дампа за 4-5 заходов засоряет всю память серву и превращается в лагодром до перезагрузки

    ПС про память чисто из интереса спросил, экстенсивным методом проблемы решатьне привык.
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Дак а ты посмотрел какой именно процесс жрёт память?
     
  4. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    в том то и дело
    смотрю через Gnome системный монитор
    и видно в общем занято 3.9гб из 4 но приэтом все программы в сумме едва занимают 500мб

    такое ощущение что памят просто так выбрасывается
     
  5. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    dj--alex
    И чего, система виснет? Или работать начинает медленней?

    1. Какая самая медленная система в компьютере? Правильный ответ: система ввода-вывода.
    2. Какая самая быстрая система в компьютере? Правильный ответ: процессор-память (а память внутри проца еще быстрее, но речь не о ней).
    3. Как ускорить работу системы ввода-вывода для большинства случаев? Правильный ответ, думаю, ясен.
     
  6. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    сначала начинает медленней работать когда кончается оперативка
    начинает свопить

    если продолжать запускать все новые и новые бэкапы систему охватывает паралич и мышку можно двигать только 1 раз в минуту. и то она дикими рывками прыгает

    после этого уже ничего не работает.
    если дать компу время часиков 10 то он всеже выполняет эти задачи,но память и своп остаются занятыми
    но в процессах их нету,т.е.
    память свободна ,но она на самом деле не свободна, но она свободна,но она на самом деле не свободна, но она свободна ,но на самом деле не свободна, но она свободна....
     
  7. Anonymous

    Anonymous Guest

    Размер оперативы и размер свопа - какой?
    через top и иже с ними нельзя считать напрямую загрузку памяти, ибо там не учитываеются шаринг либ.
    Да, и не стоит на такие вещи запускать апач. Лучше просто CLI php, память у тебя вполне может где то там и терятся.
     
  8. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    т.е. апач просто не предназначен для таких операций?
    жалко,я думал его можно полноценно использовать для любых целей.

    эмм cli выйдет запустить из под веб ?
    если да то супер :)
     
  9. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dj--alex
    Лучший способ импортировать большой дамп - скормить его напрямую бинарнику мускула.
    Под виндой это выглядит так:

    C:\...\MySQL4\bin\mysql.exe --character-sets-dir=C:\...\MySQL4\share\charsets -uroot -p12345 <bigdump.sql

    Только надо в начало файла дампа добавить команду выбора базы:

    USE mydatabase;
     
  10. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    мм у меня линуха ubuntu 8
    из под php выйдет сгенерировать и запустить команду под правами юзера apache?
    команды будут каждый раз разными
    меня права на файлы там добивают,все предусмотреть нужно или RO будет.

    и я что то читал что в mysql6 уберут комнды backup table,restore table это же ужасно :( еще одим методом бэкапирования меньше
     
  11. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    а все дело в кеше запросов Mysql помоему
    счас после 5 запросов тоько на 500 мб объем невозвращенной памяти вырос
    но я заливал 2 одни и теже базы на 1.5гб в объеме. сум.
     
  12. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dj--alex
    Я тебе подсказал прекрасный способ, который много раз пользовался... уверяю, перенаправлять потоки можно и под *nix-ом...
     
  13. dj--alex

    dj--alex Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    184
    Симпатии:
    0
    в моем случае доступов к бинарникам нет никаких.sql сервер на другой машине.