Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kopia zapasowa bazy danych
Forum PHP.pl > Forum > Bazy danych > MySQL
dgaleza
Witam,
Mam problem dotyczący wykonywania kopii zapasowej bazy MySQL. Interesuje mnie następujący sposób jej wykonania:
1. Klikamy na odnośnik
2. Wykonuje się kopia bazy danych
3. Pobieramy kopię
Coś podobnego działa w forum phpBB. Czy jest na to jakiś łatwy i ciekawy sposób. Na jednym z forum przeczytałem o phpMyBackup i jeśli nie znajdę innych ciekawych rozwiązań, zdecyduję się na ten program.
AxZx
ja dolacze sie do pytania (poszerze je troche:)

jak dobrze przygotowac kopie bazy zeby pozniej w latwy i bezpieczny sposob mozna bylo z niej odzyskac dane (bo po to jest kopia zapasowa).

jak parsowac taka kopie?

  1. # ----------------------------------------------------;
  2.  
  3. CREATE TABLE `branza` (
  4. `id` int(11) NOT NULL AUTO_INCREMENT,
  5. `cluster` int(11) DEFAULT '0',
  6. `name` varchar(50) NOT NULL DEFAULT '0',
  7. `level` int(10) UNSIGNED NOT NULL DEFAULT '0',
  8. UNIQUE KEY `id` (`id`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=72 DEFAULT CHARSET=utf8;
  10.  
  11. INSERT INTO `branza` VALUES
  12. ('47', '47', 'BIURO', '0'),
  13. ('48', '47', 'BHP - artykuły, sprzęt', '1'),
  14. ('50', '47', 'Biurowe artykuły', '1'),
  15. ('51', '47', 'Komputery - sprzedaż', '1'),
  16. ('52', '47', 'Komputery - części, akcesoria', '1'),
  17. ('53', '47', 'Komputery - serwis, usługi', '1'),
  18. ('54', '47', 'Komputery - oprogramowanie', '1'),
  19. ('55', '47', 'Multimedialne systemy, technologie', '1'),
  20. ('56', '47', 'Kserokopiarki - serwis, materiały eksploatacyjne', '1'),
  21. ('57', '47', 'Kursy, szkolenia', '1'),
  22. ('58', '47', 'Meble - biurowe', '1'),
  23. ('60', '47', 'Papiernicze artykuły - detal', '1'),
  24. ('61', '47', 'Sklepy - wyposażenie', '1'),
  25. ('62', '47', 'Stemple, datowniki, pieczątki', '1'),
  26. ('63', '63', 'BUDOWNICTWO', '0'),
  27. ('64', '64', 'DOM i OGRÓD', '0'),
  28. ('65', '65', 'FINANSE i UBEZPIECZENIA', '0'),
  29. ('67', '67', 'INSTYTUCJE i URZĘDY', '0'),
  30. ('68', '68', 'MOTORYZACJA i TAXI', '0');
  31. INSERT INTO `branza` VALUES
  32. ('69', '69', 'NAUKA', '0'),
  33. ('70', '70', 'ODZIEŻ i TEKSTYLiA', '0'),
  34. ('71', '71', 'PRZEMYSŁ i ENERGETYKA', '0');
  35.  
  36. # ----------------------------------------------------;
  37.  
  38. CREATE TABLE `dzial` (
  39. `dzial_id` int(11) NOT NULL AUTO_INCREMENT,
  40. `dzial_nazwa` varchar(32) NOT NULL,
  41. PRIMARY KEY (`dzial_id`),
  42. KEY `dzial_id` (`dzial_id`)
  43. ) ENGINE=MyISAM AUTO_INCREMENT=62 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;


zrobilem
  1. <?php
  2. $dane_po = explode(";rn", $dane);
  3. ?>

kazdy element tablicy powinien byc zapytaniem, ale gdy w tresci jest srednik to sie sypie. przygladalem sie parserowi sql ktory jest w phpmyadmin - kobyla straszna, naprawde jest to wszystko konieczne?


co do pytania autora to tworzenie kopii tabel jest stosunkowo proste
  1. <?php
  2. function arch_tabela1($tabela){
  3.  
  4. $nl = $this->define_crlf();
  5. $wynik = '';
  6.  
  7. /*$wynik .= '#;'.$nl;
  8. $wynik .= '# Struktura tabeli `'.$tabela.'`;'.$nl;
  9. $wynik .= '#;'.$nl.$nl;*/
  10.  
  11. $dane1 = $this->sql->getone_assoc('SHOW CREATE TABLE '.$tabela);
  12. $wynik .= $dane1['Create Table'].';';
  13. $wynik .= $nl.$nl;
  14.  
  15. /*$wynik .= '#;'.$nl;
  16. $wynik .= '# Dane tabeli `'.$tabela.'`;'.$nl;
  17. $wynik .= '#;'.$nl.$nl;*/
  18.  
  19.  
  20. $zap2 = $this->sql->query('SELECT * FROM '.$tabela);
  21.  
  22. $wiersz = '';
  23. $i=0;
  24. while($dane2 = $this->sql->fetch_assoc($zap2)){
  25. $i++;
  26.  
  27. if($i>&& $i%20 == 0) $wiersz = substr($wiersz,0,-4).';'.$nl;
  28. if($i==|| $i%20 == 0) $wiersz .= 'INSERT INTO `'.$tabela.'` VALUES '.$nl;
  29.  
  30. $wiersz .='(';
  31.  
  32. foreach($dane2 as $klucz=>$war) $wiersz .= '''.$war.'', ';
  33.  
  34. $wiersz = substr($wiersz, 0, -2);
  35. $wiersz .='), '.$nl;
  36. }
  37.  
  38. $wynik .= substr(trim($wiersz), 0, -1);
  39. if($i>0){
  40. $wynik .= ';'.$nl.$nl;
  41. }
  42. $wynik .= '# ----------------------------------------------------;'.$nl.$nl;
  43.  
  44. return $wynik;
  45.  
  46. }#koniec arch_tabela
  47. ?>


tylko tak jak pisalem, nie wiem czy to jest dobre do pozniejszego importu.
legorek
IMHO można to zrobić w dwóch linijkach:

  1. <?php
  2. header("Content-Disposition: attachment; filename=bazadanych.sql");
  3. passthru("mysqldump -u użytkownik -phasło bazadanych");
  4. ?>


Nie testowałem, ale powinno się sprawdzić.
Ładowanie pliku to już wyższa szkoła jazdy, bo najpierw trzeba go umieścić na serwerze (np poprzez upload).

Jeśli już mamy plik, to tylko jedna linijka.

  1. <?php
  2. exec("mysql -u użytkownik -phasło bazadanych < /kopie/upload/bazadanych.sql");
  3. ?>


Wygodniej będzie zapisywać kopie na serwerze:
  1. <?php
  2. passthru("mysqldump -u użytkownik -phasło bazadanych > /kopie/bazadanych.sql");
  3. ?>
fiszol
@legorek

A da się pójść jeszcze dalej i zapisać kopię w tar.gz, i może jeszcze jedno pytanie - mianowicie czy jesteś w stanie powiedzieć mi, oszacowac jak zachowa się serwer przy dumpowaniu przeogromnej bazy danych (mówimy o wadze do wyrażenia której mb już się nie nadają) ?
AxZx
Cytat(legorek @ 14.12.2006, 00:51:01 ) *
IMHO można to zrobić w dwóch linijkach:


mozna ale po co? jak mozna sobie samemu zrobic plik taki jak sie nam podoba:)

Cytat
Ładowanie pliku to już wyższa szkoła jazdy, bo najpierw trzeba go umieścić na serwerze (np poprzez upload).

czy ja wiem czy upload to az taka wyzsza szkola jazdy... nawet nie trzeba by uploadu robic, do mniejszych baz wystarczy textarea i tam wklejac tresc.

Cytat
Wygodniej będzie zapisywać kopie na serwerze:
  1. <?php
  2. passthru("mysqldump -u użytkownik -phasło bazadanych > /kopie/bazadanych.sql");
  3. ?>

wygodniej, ale jak serwer padnie to nie bedzie wesolo. zreszta na wiekszosci serwerow robia kopie zapasowe wiec po co sie samemu meczyc?smile.gif
dumpowanie nie sluzy tylko do tego zeby miec kopie, sluzy do tego zeby przeniesc dane do innej bazy, np na localhoscie domowym czy innym.

Cytat(fiszol @ 14.12.2006, 08:12:14 ) *
A da się pójść jeszcze dalej i zapisać kopię w tar.gz,

to jest oczywiste, ale to juz nie jest problemem.

Cytat
czy jesteś w stanie powiedzieć mi, oszacowac jak zachowa się serwer przy dumpowaniu przeogromnej bazy danych (mówimy o wadze do wyrażenia której mb już się nie nadają) ?


serwer bedzie nie do uzytku w czasie dumpowania.
legorek
@fiszol

To zależy od wielu czynników, głównie od wydajności i obciążenia maszyny. Wczoraj (około 1 w nocy, a więc niskie obciążenie) wykonywałem kopie bazy 130 MB. Na dedykowanej, średnio nisko wydajniej, maszynie nie trwało to dłużej niż paręnaście sekund. Drugie tyle na spakowanie. Podejrzewam że zależność czasu od wielkości bazy jest bliska liniowej. Nie jestem pewien czy serwer jest nie do użytku, ale mogę sprawdzić to następnym razem.

Cytat
mozna ale po co? jak mozna sobie samemu zrobic plik taki jak sie nam podoba:)

Bo nie ma sensu wywarzać otwartych drzwi. Po za tym mysqldump jest na pewno bardziej wydajny.
Cytat
dumpowanie nie sluzy tylko do tego zeby miec kopie, sluzy do tego zeby przeniesc dane do innej bazy, np na localhoscie domowym czy innym.

Ale wygodniej zapisać kopie na serwerze, potem ściągnąć je bezpośrednio na drugi serwer i tam wrzucić do bazy. Nie musisz ściągać ich na swój komputer, więc oszczędzasz czas. Po za tym wydajae mi się, że mysql ma wbudowane mechanizmy do synchronizacji baz danych.
AxZx
Cytat(legorek @ 14.12.2006, 21:33:49 ) *
Bo nie ma sensu wywarzać otwartych drzwi. Po za tym mysqldump jest na pewno bardziej wydajny.


zwlaszcza ze generuje mi niepotrzebny kod:P

Cytat
Ale wygodniej zapisać kopie na serwerze, potem ściągnąć je bezpośrednio na drugi serwer i tam wrzucić do bazy. Nie musisz ściągać ich na swój komputer, więc oszczędzasz czas. Po za tym wydajae mi się, że mysql ma wbudowane mechanizmy do synchronizacji baz danych.


ja pracuje z takimi serwerami ze nie da sie skopiowac bezposrednio z jednego na drugi. a pozatym wole miec dodatkowa kopie na swoim dysku w razie gdyby te dane bylby mi potrzebne a nie mialbym dostepu do netu.

reasumujac: kazdy wybiera taki sposob jaki mu odpowiada, jakie ma potrzeby.
ja wybralem taki jak zaprezentowalem, tylko teraz sie glowie jak to ladnie importowac:)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.