Autor | Zpráva | ||
---|---|---|---|
BuGeR Profil |
#1 · Zasláno: 23. 1. 2010, 21:45:17
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 |
#2 · Zasláno: 23. 1. 2010, 21:51:37
BuGeR:
Já jsem kdysi zkoušel Martin Mach - Jednoduché zálohování mysql v php |
||
BuGeR Profil |
#3 · Zasláno: 23. 1. 2010, 21:55:18
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 |
#4 · Zasláno: 23. 1. 2010, 22:02:46
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 |
#5 · Zasláno: 23. 1. 2010, 22:05:15
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 |
#6 · Zasláno: 23. 1. 2010, 22:12:15 · Upravil/a: Majkl578
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 |
#7 · Zasláno: 23. 1. 2010, 22:13:12 · Upravil/a: Joker
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 |
#8 · Zasláno: 23. 1. 2010, 22:15:29
ok :D takže to ruším..
Nemáte teda nějakej jinačí script?:) |
||
Majkl578 Profil |
#9 · Zasláno: 23. 1. 2010, 22:18:36 · Upravil/a: Majkl578
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 |
#10 · Zasláno: 23. 1. 2010, 22:23:25
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 |
#11 · Zasláno: 23. 1. 2010, 22:29:39
[#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 |
#12 · Zasláno: 23. 1. 2010, 22:35:54 · Upravil/a: BuGeR
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 |
#13 · Zasláno: 23. 1. 2010, 22:46:22 · Upravil/a: Jake898
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 |
#14 · Zasláno: 23. 1. 2010, 22:46:27 · Upravil/a: Majkl578
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 |
#15 · Zasláno: 23. 1. 2010, 22:56:23 · Upravil/a: BuGeR
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 |
#16 · Zasláno: 23. 1. 2010, 23:00:46 · Upravil/a: Majkl578
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 |
#17 · Zasláno: 23. 1. 2010, 23:12:27 · Upravil/a: mckay
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 |
#18 · Zasláno: 23. 1. 2010, 23:15:50
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 |
#19 · Zasláno: 23. 1. 2010, 23:19:30 · Upravil/a: Majkl578
[#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 |
#20 · Zasláno: 24. 1. 2010, 00:38:29
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 |
#21 · Zasláno: 24. 1. 2010, 00:49:09
Děkuji moc :-) funguje to ;)
|
||
TeeVee Profil * |
#22 · Zasláno: 25. 1. 2010, 04:19:48
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 |
||
Časová prodleva: 13 let
|
0