21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
BuGeR
Profil
Dobrý den.
Chtěl bych se zeptat, nevíte někdo o nějakém jednoduchém scriptu který by zálohoval databázi a následně uložil na ftp?
(budu to provádět přes cron) takže aby to bylo např. mujweb.cz/zalohy/mysql/zaloha_23_1_2010__21.txt..
Hledal jsem na google, i zde na diskusi, ale nenašel jsem žádne funkční kódy..
Děkuji za pomoc
mckay
Profil
BuGeR:
Já jsem kdysi zkoušel Martin Mach - Jednoduché zálohování mysql v php
BuGeR
Profil
Jo to je asi jedinný script který mi jede (zalohuje) ale vypíše to asi dvěstě chyb..
Sice to zalohuje ale prostě má ta zaloha nejspíš chyby takže neriskuji..
pokoušel jsem se ty chyby opravit ale fakt se to neda :D
Opravím jednu a naskočí dalších 100..
Prosím něco jiného :-)
mckay
Profil
BuGeR:
Neopravuj - chyby jsou hlavně notification - musíš dát před výraz, který chybuje "@" a máš po problémech. Jde většinou o nedeklarované proměnné.
BuGeR
Profil
Ok už jsem to udělal a nepíše to žádnou..
uvidíme až budu zálohu potřebovat :D
Jinak díky moc :-)
Majkl578
Profil
mckay:
musíš dát před výraz, který chybuje "@" a máš po problémech
No FUJ! Kdo tě učil problémy skrývat a ne je řešit? Ono se ti to jednou vymstí, jen počkej. :)
Když už, tak ať použije lepší řešení:
error_reporting(error_reporting() & ~E_NOTICE);

Tím skryje notice hlášky a žádné pomalé zavináče nejsou třeba.
Joker
Profil
mckay:
musíš dát před výraz, který chybuje "@" a máš po problémech
No fuj! Tohle není dobrá rada (zejména ne prezentovaná jako řešení problému).
@ potlačuje chybové hlášky, čili problém to není řešení, ale tváření se, že problém neexistuje.
Problém existuje dál, jen není vidět.

Dodatek: Majkl578 byl rychlejší :)
BuGeR
Profil
ok :D takže to ruším..
Nemáte teda nějakej jinačí script?:)
Majkl578
Profil
Normálně by to šlo řešit takto jednoduše:
mysqldump -A -u uzivatelskejmeno -p uzivatelskeheslo > zaloha.sql

Jako bash script. Přes php by to mohlo jít využít pomocí exec nebo podobné funkce.
Příklad:
exec('mysqldump -A -u foo -p mypass > /tmp/backup.' . date('Y-m-d_His') . '.sql');

Toto vytvoří dump všech databází v souboru /tmp/backup.CURRENTDATE.sql

Joker:
Čtu ti myšlenky a formuluji je rychleji. :)
BuGeR
Profil
Tohle jsem taky zkoušel ale marně nevím jak to tam dat nemam stím zkušenosti :(
zkoušel jsem přes $result = mysqldump........; echo mysqldump a nic fakt vůbec nevím..
Nemohl by jsi mi poslat nějaky příklad?
Majkl578
Profil
[#10] BuGeR
Příklad jsem uvedl o pár minut později - editoval jsem příspěvek. Samozřejmě musíš nahradit příslušné položky (username + heslo k databázi, cíl) aby jsi to mohl použít.
BuGeR
Profil
Majkl578:
Všiml jsem si :)
Děkuji moc za pomoc, ale ten kód nějak nefunguje..
Nevím kde dělam chybu heslo a jméno jsem vyplnil správně..
nemá tam byt ještě hostitel té mysql?
Jinak jestli je to podstatné používam hosting FORPSI jestli to nemá zakázané (?)
Jake898
Profil
BuGeR:
Zagooglil jsem za Tebe, trochu kód upravil.

/**
 * Zalohuje databazi do souboru.
 *
 * @param string $host
 * @param string $user
 * @param string $pass
 * @copyright http://davidwalsh.name/backup-mysql-database-php
 */
function backupDatabase($host, $user, $pass)
{
    $db = mysql_connect($host,$user,$pass);
    $db_list = mysql_list_dbs($db);
    while ($row = mysql_fetch_assoc($db_list))
    {
	mysql_select_db($row['Database'], $db);

	$tables = Array();
	$result = mysql_query('SHOW TABLES') or die (mysql_error());
	while($row = mysql_fetch_row($result))
	{
	    $tables[] = $row[0];
	}

	foreach($tables as $table)
	{
	    $result = mysql_query('SELECT * FROM ' . $table);
	    $num_fields = mysql_num_fields($result);

	    $return .= 'DROP TABLE ' . $table . ';';
	    $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
	    $return .= "\n\n" . $row2[1] . ";\n\n";

	    for ($i = 0; $i < $num_fields; $i++)
	    {
		while($row = mysql_fetch_row($result))
		{
		    $return .= 'INSERT INTO ' . $table . ' VALUES(';
		    for($j=0; $j<$num_fields; $j++)
		    {
			$row[$j] = addslashes($row[$j]);
			$row[$j] = ereg_replace("\n","\\n",$row[$j]);
			if (isset($row[$j]))
			{
			    $return .= '"' . $row[$j] . '"';
			}else
			{
			    $return .= '""';
			}

			if ($j<($num_fields-1))
			{
			    $return .= ',';
			}
		    }

		    $return .= ");\n";
		}
	    }
	    $return.="\n\n\n";
	}
    }

    $fp = fOpen('db-backup-' . Date('d-m-Y') . '.sql', 'w+');
    fWrite($fp, $return);
    fClose($fp);
}


backupDatabase('server', 'uzivatelskeJmeno', 'heslo');


Skript Ti vyplivne soubor ve formátu db-backup-23-01-2010.sql.
Majkl578
Profil
Zkus přidat parametr -h hostname, to by mohlo pomoci pokud nejde o stejný stroj. Zakázané to být může, jak exec funkce, tak použití nástroje mysqldump.
exec(' mysqldump -A --host=12.34.56.78 --user=foo --password=mypass > /tmp/backup.' . date('Y-m-d_His') . '.sql');


Jake898:
Pokud bude databáze velká a paměť scriptu omezená, umře to. Osobně bych raději použil přímo funkci mysqldump ve shellovém scriptu a vůbec bych do toho netahal PHP.
BuGeR
Profil
Děkuji moc, ale ani jeden nefunguje.. Buď mam na tohle nějakou smůlu a nebo to hosting zakázal zkusím se zeptat a dám vědět :-)
(asi měli důvod to zakázat ..za obnovení zálohy si účtujou 200 kč :D)
Majkl578
Profil
BuGeR:
asi měl důvod to zakázat ..za obnovení zálohy si účtujou 200 kč
Doporučuji změnit hosting. Já u nejmenované hostingové společnosti platím ~40 korun měsíčně a v ceně mám denní zálohy FTP a databáze do mé složky, takže s nimi mohu dělat co chci. Obnovím to buď PHP scriptem (dibi to umí brilantně) nebo přes PHPMyAdmina.
mckay
Profil
Majkl578, Joker:
Vím, že se to nedělá. Problémy samozřejmě řeším, ale u tohoto skriptu konkrétně by se nic nemělo stát. Autora znám osobně, konzultoval jsem to. Chybu bych začal hledat až potom co by se někde něco rozbilo.
BuGeR
Profil
Majkl578:
Na nový hosting budu přecházet až v létě (to mi končí).

Jinak právě mi odpověděli s podpory, že funkci exec() mi nemůžou povolit.
Zvolil bych tedy nějake řešení přes php které tuto funkci nepotřebuje..
Prosím našel by ještě někdo nějaky jinačí script ?
Prohledal jsem snad všechny stránky na google.
Majkl578
Profil
[#17] mckay
Co je rychlejší (jak na upravení, tak výkonnostně), 200 pomalých zavináčů nebo jedno přenastavení pomocí error_reporting?
$t = microtime(true);
for ($i = 0; $i < 100000; $i++) {
	@$x;
}
echo $a = microtime(true) - $t;

echo '<br>';

error_reporting(error_reporting() & ~E_NOTICE);
$t = microtime(true);
for ($i = 0; $i < 100000; $i++) {
	$x;
}
echo $b = microtime(true) - $t;

echo '<br>';

echo $a / $b;

Verze se zavináčem je přibližně 7x pomalejší.
keeehi
Profil
BuGeR:
Upravil jsem ten script z odkazu v příspěvku [#2] tak, aby už nevyhazoval žádné chybové hlášky. (Žádné skrývání chyb ale jejich oprava)
Musíš si upravit řádky 83-86. Jinak by to mělo být ba jakýchkoliv jiných změn funkční.
<?php
function zalohuj($db,$soubor=""){
  $text="";

  function keys($prefix,$array){
    $array=Array();
    $radky="";
    $pocet = count($array);
    $posledni = $pocet-1;
    if($pocet == 0)
      return;
    for($i = 0; $i<$pocet; $i++){
      if($i != $posledni)
        $carka = ",";
      else
        $carka = "";
      $radky .= "`$array[$i]`$carka";
    }
    return ",\n$prefix($radky)";
  }

  $sql = mysql_query("SHOW TABLE STATUS FROM $db");


  while($data = mysql_fetch_array($sql)){
    $PRI=$UNI=$MUL="";

    $text .= "--\n-- Struktura tabulky $data[0]\n--\n\n";
    $text .= "CREATE TABLE `$data[0]`(\n";
    $sqll = mysql_query("show columns from $data[0]") or die ("Nastala chyba: " . mysql_error());
    $e = true;
    while($dataa = mysql_fetch_array($sqll)){
      if($e){
        $e = false;
      }
      else
      $text .= ",\n";
      $null = ($dataa[2] == "NO")? "NOT NULL":"NULL";
      $default = !empty($dataa[4])? " DEFAULT '$dataa[4]'":false;
      

      if($default == " DEFAULT 'CURRENT_TIMESTAMP'") $default = " DEFAULT CURRENT_TIMESTAMP";
      if($dataa[3] == "PRI") $PRI[] = $dataa[0];
      if($dataa[3] == "UNI") $UNI[] = $dataa[0];
      if($dataa[3] == "MUL") $MUL[] = $dataa[0];
      $extra = !empty($dataa[5])? " ".$dataa[5]:false;
      $text .= "`$dataa[0]` $dataa[1] $null$default$extra";
    }
    $primary = keys("PRIMARY KEY",$PRI);
    $unique = keys("UNIQUE KEY",$UNI);
    $mul = keys("INDEX",$MUL);
    $text .= "$primary$unique$mul\n) ENGINE=$data[Engine] COLLATE=$data[Collation];\n\n";
    unset($PRI,$UNI,$MUL);
    #data
    $text .= "--\n-- Data tabulky $data[0]\n--\n\n";
    $query = mysql_query("SELECT * FROM $data[0]");
    while($fetch = mysql_fetch_array($query)){
      $values="";
      $pocet_sloupcu = count($fetch)/2;
      $i = 0;
      while($i < $pocet_sloupcu){
        if($i < $pocet_sloupcu-1)
          $carka = ",";
        else
          $carka = "";
        $values .= "'".mysql_escape_string($fetch[$i])."'$carka";
        $i++;
      }
      $text .= "\nINSERT INTO `$data[0]` VALUES($values);";
      unset($values);
    }
  }

  if(!empty($soubor)){
    $fp = @fopen($soubor,"w+");
    $fw = @fwrite($fp,$text);
    @fclose($fp);
  }
  
  return $text;
}

$hostiteldb="localhost";
$jmenodb="mysql_uzivatel";
$heslodb="mysql_heslo";
$db="databaze";

mysql_connect($hostiteldb, $jmenodb, $heslodb);
mysql_query("SET NAMES 'utf8'");
mysql_select_db($db);

$text = zalohuj($db,"zaloha_mysql".date("-d-m-Y").".sql");
echo "<textarea>$text</textarea>";?>
BuGeR
Profil
Děkuji moc :-) funguje to ;)
TeeVee
Profil *
Dobrý den, poslední verzi kódu jsem testoval, připojení k databázi proběhlo úspěšně, vytvoření zálohy proběhlo úspěšně, údaje se správně vypsaly do textového pole ale nikde mi nevyskočil soubor ke stáhnutí. (zaloha_mysql_*****.sql ). Nevíte, kde by mohl být problém? :-)

Když koukám na Vás kód, šla by přidat koncová funkce i pro přímé ukládání zálohy do složky na serveru? takto by šla vyrobit automatická záloha (například s pomocí CRONu), která by každý den provedla zálohu a sama si ji uložila do nějaké složky na FTPku. Co myslíte? :-) Díky

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0