Jak importovat velké databáze a jaké můžete mít problémy?

Pondělí, Říjen 17, 2011

Nedávno jsem řešil přechod z jednoho hostingu na druhý pro můj projekt kečtení.cz, tak aby nevznikla žádná prodleva v dostupnosti. Během toho jsem si vytvořil zálohu databáze, která měla přes 500Mb a setkal jsem se s problémem jak tuto zálohu obnovit. PHPmyAdmin ani Adminer s takovými zálohami pracovat neumí a vlastní parser jsem si psát nechtěl. Naštěstí jej už někdo udělal za mě.

Našel jsem si php skript, který slouží přímo pro import velkých záloh, který naleznete na adrese http://www.ozerov.de/bigdump/. Ten stačilo stáhnout, rozbalit a už byl funkční. Jak vše nastavit si můžete přečíst zde. Skript bigdump je napsán tak, že nepřekročí ani memory limit ani time limit na běh jednoho skriptu. Je totiž na pozadí spouštěn vícekrát za sebou, i když to není na první pohled vidět. Na konci obnovy se pak můžete podívat, kolik sezení zabrala celá obnova.

Dalším problémem, se kterým jsem se setkal, bylo, že při nahrávání 500 megového souboru mi spadl internet a bylo nahráno zhruba 80% souboru. Při mém pomalém připojení se mi nechtělo nahrávat celý soubor znova. Zjistil jsem si kolik bytů souboru je nahráno na serveru a pak jsem si napsal jednoduchý skriptík, který mi vytvořil zbytek souboru a ten jsem nahrál na server.

$adresa_souboru = '../../2011-10-10-09-49-kecteni_857.sql';
$pocet_preskocenych_bytu = 328787456;
// velikost souboru, která se povedla nahrát
$f0 = fopen($adresa_souboru, 'r');
$f = fopen('cast2.sql', 'w');
fseek($f0, $pocet_preskocenych_bytu);
while (!feof($f0)) {
$text = fread($f0, 8192);
fwrite($f, $text, 8192);
}
fclose($f0);
fclose($f);

Po té jsem si napsal další jednoduchý skriptík, který mi soubory opět spojil.

$f0 = fopen('cast1.sql', 'r');
$f1 = fopen('cast2.sql', 'r');
$f = fopen('zaloha.sql', 'w');
while (!feof($f0)) {
$text = fread($f0, 8192);
fwrite($f, $text, 8192);
}
fclose($f0);
while (!feof($f1)) {
$text = fread($f1, 8192);
fwrite($f, $text, 8192);
}
fclose($f1);
fclose($f);

Nemusel jsem tak nahrávat celý soubor znovu ale pouze zbývající část. Před spuštěním jsem si ještě první část přejmenoval na cast1.sql aby vše fungovalo. Výsledný celý soboubor byl vytvořen jako zaloha.sql.

Po té už jen stačilo spustit skript bigdump.php a začala obnova databáze. To nějakou dobu trvalo, ale vše proběhlo úspěšně. Co se ale nezálohovalo, byly uložené procedury v databázi. Ty jsem si musel dodatečně přepsat ale hlavní práce týkající se zálohy struktury databáze a dat byla hotova.

 

Napsat komentář