Záloha databáze MySQL pomocí PHP

2. května 2002

Máte-li levnější variantu hostingu, obvykle nemáme k dispozici dostatečně aktuální zálohu vlastní databáze na webovém serveru. Existuje sice možnost si zálohu vytvořit pomocí phpMyAdmin, avšak je to zdlouhavé, není možné vše zajistit automaticky a už vůbec se to nehodí pro velké databáze.

Jednou z možností je využít nástroje, který je standardně dostupný na každém stroji s MySQL – mysqldump.

Pokud je tento nástroj dostupný i pro interpret PHP, můžete ho pomocí funkce exec spustit a jeho výstup (výpis databáze) si nechat uložit do souboru. Tento soubor budete mít pak dostupný ve složce svého webhostingu a kdykoli si jej můžete pomocí ftp stáhnout. Ukáži také, jak zautomatizovat jednak generování souboru se zálohou databáze, jednak stahování těchto souborů pomocí ftp.

Nejprve je třeba zjistit, kde na serveru leží nástroj mysqldump . Do nějakého skriptu zadejte povel:

echo exec("whereis mysqldump");

Tímto dostanete cestu k nástroji mysqldump – obvykle to bude něco jako /usr/bin/mysqldump. Tímto zároveň ověříte, že je nástroj dostupný a funkce exec není na serveru zakázaná. Pokud jste jako odpověď nedostali chybové hlášení, cestu si poznamenejte a rovnou nechejte zobrazit cestu ke skriptu:

echo SCRIPT_FILENAME;

Jako odpověď dostanete něco jako /data/web/virtuals/nasserver/www/./test.php. Tuto cestu potom použijete v parametrech příkazu mysqldump pro určení, do které složky na serveru se má soubor s výpisem databáze uložit.

Na základě těchto informací už můžete napsat skript, který zazálohuje databázi do zadané složky. Není dobré zálohovat databázi stále do téhož souboru nebo tak, aby se vytvářely stále nové a nové soubory. V mém příkladu jsem hodiny dne rozdělil na 4 období (dopoledne, odpoledne, večer, ráno), a podle období, ve kterém je skript spuštěn, se vygeneruje soubor daného jména. Pokud již soubor existuje, přepíše se novým obsahem.

Aby vám nemohl kdokoli se zálohou databáze "cvičit" a náhodně spouštět zálohování (skript pro zálohování bude přístupný na webu), uložte ho do zvláštní složky a doplňte jednoduchou ochranu heslem. Pojmenovat ho můžete libovolně, pokud budete takových záloh provádět více, jinak stačí i jen jako index.php:

<?php
//echo exec("whereis mysqldump"); // zakomentované zjištění umístění mysqldump
//echo $SCRIPT_FILENAME; // zakomentovaný výpis cesty ke skriptu
//exit;
if(!isset($PHP_AUTH_USER)) {
  Header("WWW-Authenticate: Basic realm=\"Backup naší databáze\"");
  Header("$SERVER_PROTOCOL 401 Unauthorized");
  echo "Bez hesla to nepůjde…";  // když nic nevyplní, vypíše chybové hlášení
  exit;
}
else {
  if ($PHP_AUTH_USER == "uzivatel" && $PHP_AUTH_PW == "heslo") {
  // jméno a heslo je vpořádku, provede se zálohování
    $hodina = (int)Date("H"); // zjistit hodinu dne
    if (($hodina >= 0)&&($hodina <= 6)) $bkname = "early"; // nastavit název souboru pro zálohování podle hodin dne
    if (($hodina >= 7)&&($hodina <= 12)) $bkname = "morning";
    if (($hodina >= 13)&&($hodina <= 18)) $bkname = "afternoon";
    if (($hodina >= 19)&&($hodina <= 24)) $bkname = "evening";
    exec("/usr/bin/mysqldump –host=server –user=uzivatel –password=heslo –opt databaze > /data/web/virtuals/nasserver/www/backup/$bkname.sql");
    echo "Právě provedený pokus o zálohu:<br>- $bkname.sql ".date("j.m.y H:i", filemtime("$bkname.sql"));
  }
  else {
    Header("WWW-Authenticate: Basic realm=\"Backup naší databáze\"");
    Header("$SERVER_PROTOCOL 401 Unauthorized");
    echo "Špatné zadání!";
  }
}
?>

Ve výše uvedeném skriptu se i při opakovaném spuštění během dne zajistí tvorba 4 záložních souborů databáze do složky backup. Červeně vyznačené je nutné nastavit podle údajů o serveru a databázi. Na serveru pak vytvoříte složku backup a do ní nahrajete prázdné soubory early.sql, morning.sql, afternoon.sql a evening.sql. To proto, abyste mohli snadno nastavit těmto souborům práva pro zápis a skript do nich mohl zapisovat a přepisovat je.

Jakmile máte složku backup a v ní 4 prázdné soubory, nastavíte práva zápisu do složky a do všech 4 souborů. Zcela jednoduchým způsobem pro toto nastavení lze použít třeba Windows Commander, jak je popsáno  v článku o knize návštěv.

Po této úpravě zkuste zadat do prohlížeče adresu skriptu včetně jména a hesla HTTP autentifikace a ověřte jeho funkci. Odkaz musí být v tomto tvaru:

http://uzivatel:heslo@naserver.cz/slozkaskriptu/index.php

Výsledkem by měl být například takovýto text v prohlížeči, který je vlastně jen opisem data posledního zápisu do souboru evening.sql.

Právě provedený pokus o zálohu:
– evening.sql 17.04.02 19:52

Pokud se objeví chybové hlášení, je třeba z něj usoudit původ chyby. Je možné, že mysqldump nemůže zapisovat do vaší složky a nemáte správně nastavená práva, cesta, kterou jste uvedli ve skriptu, není správná ad. Může se stát, že dojde k chybě při práci s databází, pak se žádná chyba nevypíše, protože chybová zpráva bude uložena v souboru zálohy, kam se vlastně přesměrovávají odpovědi zálohovacího programu.

Když už máte funkci skriptu ověřenou (zejména je nutno ověřit, zda vygenerované sql soubory skutečně obsahují správná data z databáze), nastavíte opakované spouštění zálohovacího skriptu. Ideální vzhledem ke generovaným souborům jsou časy 02.00, 08.00, 14.00 a 20.00.

Pro automatické  zálohování databáze si zajistěte u poskytovatele webhostingu načasované spouštění našeho skriptu (obvykle pomocí cron na serverech Linux) anebo si přidejte do svého plánovače úloh otevření okna prohlížeče s parametrem cesty k zálohovacímu skriptu. Pokud nemáte možnost nechat nastavit správcem serveru opakované spouštění a máte pevné připojení k internetu, postačí i jen přidat do plánovače úloh ve Windows řádek (skript se tak bude spouštět přímo z počítače přes prohlížeč):

iexplore.exe http://uzivatel:heslo@naserver.cz/slozkaskriptu/index.php

Nakonec ještě zajistěte pravidelné automatické stahování zálohy přes FTP. Vytvořte si dávkový soubor transfer.bat:

@echo off
Ftp.exe -i -s:%1.cmd ftp.server.cz

Jenom doplňuji, že pokud se připojujete k internetu telefonicky, lze do dávky před příkaz ftp.exe přidat povel k vytočení telefonického připojení. Pro Windows9/Me to bude start.exe /w spojeni.dun, přičemž soubor spojeni.dun získáte tak, že vytvoříte telefonické připojení a myší ho přetáhněte třeba na Plochu. Tak se vytvoří exportovaný soubor .dun, který si pak přesunete do složky, kde máte i dávku transfer.bat. Jelikož nelze zadat povel pro zavěšení, je nutné nastavit u tohoto připojení automatické zavěšení při nečinnosti asi po 3 minutách. Ve WindowsNT/2K/XP použijte povel rasdial spojeni před příkazem ftp.exe a za něj ještě přidejte povel pro zavěšení spojení rasdial spojeni /disconnect.

Vytvořte dávkové soubory morning.cmd, afternoon.cmd, evening.cmd a early.cmd nebo třeba all.cmd (pro stažení všech najednou).

příklad morning.cmd:

uzivatel_ftp
heslo_k_ftp
lcd c:\backup\sql // cesta k adresáři na místním disku
cd www/backup  // cesta k adresáři zálohy na serveru na ftp severu
binary // přepnout na binární režim
get morning.sql // stáhnout soubor zálohy
bye  // ukončit spojení ftp

Do plánovače úloh si pak přidejte zástupce dávky transfer.bat s parametrem jména souboru, který má stáhnout. Já osobně nechávám stahovat jednou denně v době, kdy nepracuji na počítači, všechny zálohy databáze:

transfer.bat all

Varianty časového rozvržení zálohování mohou být různé – není problém upravit skript tak, aby vytvořil například každé pondělí týdenní zálohu databáze. Důležité je si také vyzkoušet, jak naopak z této zálohy databázi obnovit. Lze to pomocí nástroje mysql nebo i pomocí phpMyAdmin. V případě, kdy je databáze opravdu velká, phpMyAdmin vám obrovský soubor zálohy nespolkne. Pokud nelze jinak, je nutno rozdělit nějakým textovým editorem záložní soubor na více částí tak do 2MB velikosti. Lépe je ale požádat helpdesk webhostera, aby vám zálohu databáze naimportoval. Potřebné soubory a skripty si můžete stáhnout.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Michal

    Dub 23, 2012 v 19:03

    Ahojte…mám taký problém…do DB sa pripojím cez externý súbor:

    Potom sa snažím cez hore uvedený kód vytvoriť zálohu:
    $bkname.sql“);
    echo „Práve sa vykonala záloha.Meno: $bkname.sqlDátum a čas: „.date(„d.m.Y, H:i“);
    ?>
    Keď program prebehne, spraví výpis a vytvorí súbor, ktorý je prázdny…žiadna chyba, iba prázdny súbor. Databázu mám na Localhoste pomocou XAMPP. Čo s tým? Ďakujem.

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *