Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: kopia bezpieczeństwa
Forum PHP.pl > Forum > Bazy danych > MySQL
raf2001
Czy jest jakaś prosta metoda zrobienia kopii bezpieczeństwa całej bazy danych(lub danych tylko tabel)?
wojto
a nie slyszales o phpMyAdmin questionmark.gif
maciu
najprostsza metoda to użycie PhpMyAdmin
q
polecenie systemowe:

pojedyncza tabela:
Kod
mysqldump -u nazawa_uzytkownika --password=haslo nazwa_bazy > nazwa_pliku.sql


cala baza:
Kod
mysqldump -u nazawa_uzytkownika --password=haslo --all-databases > nazwa_pliku.sql
raf2001
1. to że phpmyadmin to ma to ja od dawna wiem, ale mi chodzi z poziomu skryptu żeby to zrobić. (bez użycia phpmyadmina)
2. @q: jak to użyć w skrypcie. musi bć to skryptowo zrobione.
Update
q
1. rozwiazanie [manual:5efdad68f4]exec[/manual:5efdad68f4] lub [manual:5efdad68f4]system[/manual:5efdad68f4] z poleceniami tymi, co podalem
2. rozwiazanie - backup do innej tabeli MySQL (mozna nawet w innej bazie) na tym samym serwerze, czyli taka sama struktura a backup przez zapytanie

[sql:1:5efdad68f4]INSERT INTO `stara_baza`.`tabela`
SELECT *
FROM `nowa_baza`.`tabela`[/sql:1:5efdad68f4]

innych pomyslow w tym momencie nie mam :|
raf2001
wole robić backup do pliku, ponieważ jest to owiele bezpieczniejsze. ALe mam mały problem, zrobiłem takie coś:
[php:1:93568a241c]
<?
system('mysqldump -u krasnal --password=krasnal --all-krasnal > krasnal.sql');
?>
[/php:1:93568a241c]
i niebackup'uje, tworzy plik ale plik ten jest pusty(pracuje na krasnalku, więc dane są prawidłowe - domyślne). Co mam począc
spenalzo
Może tak:
[php:1:6483a22f7e]
<?
exec('mysqldump -u krasnal -phaslo -D baza > krasnal.sql');
?>
[/php:1:6483a22f7e]
raf2001
dziwne ale nawet to :
[php:1:362e69839b]<?php
exec('mysqldump -u krasnal -p krasnal -D krasnal > krasnal.sql');

?>[/php:1:362e69839b]
niedziała, tworzy pusty plik. co może być tutaj przyczyną
spenalzo
Czy podałeś poprawne dane?
MaKARON
Jeżeli chodzi o backup, to raczej zrezygnuj z php i wrzuc sobie to do CRONa... dodatkowo dobrze jest blokować dostęp do bazy wtedy - szybciej działa zrzut - ważne przy duuużej bazie.
raf2001
dane sa prawidlowe, baze mam na krasnalku, więc dane są krasnal, krasnal i baza nazywa się krasnal. a chodzi mi o skryptowy backup (i to bardzo), tak żebym mógl se przez strone wejśc i zrobić backup. I tylko tyle
q
jezeli chcesz polozyc jakis szczegolny nacisk na skryptowy backup, bez mysqldump,[manual:b9b78e4303]exec[/manual:b9b78e4303] i [manual:b9b78e4303]system[/manual:b9b78e4303], to jest tez opcja przez samo zapytanie MySQL

[sql:1:b9b78e4303]
SELECT * INTO OUTFILE "/tmp/result.text" FROM nazwa_tabeli
[/sql:1:b9b78e4303]

taki plik nie wyglada jak standardowy plik mysqldump , ale jako wyswietlone kolejne wiersze z zapytania, kolejne komorki tabeli oddzielone sa znakami tabulacji, wiec spokojnie, w razie potrzeby przywrocenia bazy, da sie cos z tym zrobic lub przez zapytanie SQL (czytaj w linku)

http://www.mysql.com/doc/en/SELECT.html
http://www.mysql.com/doc/en/LOAD_DATA.html
ave
lepiej
[sql:1:1f9dcea538]SELECT * INTO OUTFILE "c:a.text" FIELDS TERMINATED BY ',' FROM tablica[/sql:1:1f9dcea538]

a wgrywanie tego
[sql:1:1f9dcea538]LOAD DATA INFILE 'c:a.text' INTO TABLE tablica FIELDS TERMINATED BY ',' [/sql:1:1f9dcea538]
raf2001
mysle, żę to by było najlepsze rozwiązanie, ael po stworzeniu skryptu
[php:1:d0efc397b3]<?php
$sql_num = mysql_query("SELECT * INTO OUTFILE "c:a.text" FIELDS TERMINATED BY ','
FROM krasnal");
$num = mysql_num_rows($sql_num);
?>[/php:1:d0efc397b3]
wypisuje mi błąd:
Parse error: parse error, unexpected T_STRING in c:usrapachehttpdhtmlrprojectindex.php on line 6
jak to poprawić. Akurat 6 linijka to wypada zapytnanie.
ave
[php:1:35ba8c5af9]<?php
mysql_query("SELECT * INTO OUTFILE 'c:a.text' FIELDS TERMINATED BY ','
FROM krasnal");
?>[/php:1:35ba8c5af9]
raf2001
tak wtedy była malutka pomylka :oops: . Ale teraz pisze tak
[php:1:213cf3fd28]<?php
$db1 = mysql_pconnect ('localhost', 'krasnal', 'krasnal');
mysql_select_db('krasnal', $db1);
mysql_query ("SELECT * INTO OUTFILE 'a.sql' FIELDS TERMINATED BY ',' FROM test");
echo mysql_error();
?>[/php:1:213cf3fd28]
to mi wypisuje:
Access denied for user: 'krasnal@localhost' (Using password: TAK)
Fatal error: Nesting level too deep - recursive dependency? in Unknown on line 0

Jak mam zrobić, aby pobrać do backup'u te bazy/baze.
przy pomocy mojego kodu lączenia z bazą:
[php:1:213cf3fd28]<?php
function db_connect() {
global $dbhost, $dbusername, $dbuserpassword, $default_dbname, $MYSQL_ERRNO, $MYSQL_ERROR;
if(!($lacze = @mysql_connect($dbhost, $dbusername, $dbuserpassword))) {
$MYSQL_ERRNO = '0';
$MYSQL_ERROR = "Nie udało się nawiązać połączenia z $dbhost.";
return 0;
} elseif (empty($dbname) && !mysql_select_db($default_dbname)) {
$MYSQL_ERRNO = mysql_errno();
$MYSQL_ERROR = mysql_error();
return 0;
} else {
return $lacze;
}
}
?>[/php:1:213cf3fd28]
Jak to zrobić?questionmark.gif? rolleyes.gif
Update
MoD
Ja proponuje mój skrypcik, który wykonuje kopię podanej tabeli.

backup.php
  1. <?php
  2.  
  3. function copytable ( $host, $login, $password, $database, $table, $file_name, $orderby )
  4. {
  5. mysql_connect ( $host, $login, $password ); //Łączymy się z bazą danych
  6. mysql_select_db ( $database ); //Wybieramy baże danych
  7.  
  8. $date = date ( &#092;"jS F Y  g:i:s a\" ); //Ustalamy datę; Domyślnie jest w formacie angielskim.
  9.  
  10. if ( !$sql = mysql_query ( &#092;"SELECT * FROM `\" . $table . \"` ORDER BY `\" . $orderby . \"` ASC;\" ) )
  11. {
  12. return 0; //Jeśli nie ma tabeli zwraca błąd
  13. }
  14.  
  15. $records_num = mysql_num_rows ( $sql ); //Zliczamy rekordy
  16.  
  17. $file = fopen ( $file_name, &#092;"a+\" ); //Robimy pliczek lub dopisujemy do istniejącego
  18.  
  19. $head = &#092;"nnnn\";
  20. $head .= &#092;"##########################################################n\";
  21. $head .= &#092;"#n\";
  22. $head .= &#092;"# Backup data for table `\" . $table . \"`n\";
  23. $head .= &#092;"# Number of records: \" . $records_num . \"n\";
  24. $head .= &#092;"# Date of generate file: \" . $date . \"n\";
  25. $head .= &#092;"#n\";
  26. $head .= &#092;"##########################################################nnn\"; //Tu został ustawiony nagłówek pliku, MySQL potraktuje to jak komentarz
  27.  
  28. fputs ( $file, $head ); //Wrzucamy nagłówek do pliku
  29.  
  30. while ($sql_result = mysql_fetch_array( $sql, MYSQL_NUM ) ) //Pętelka która pozwala na odczytanie danych
  31. {
  32. $count = count ( $sql_result ); //Zliczamy pola tabeli
  33. $sql_for_write = &#092;"INSERT INTO '\" . $table . \"' VALUES(\" ;
  34. $i = 1 ;
  35. $sql_for_write .= &#092;"'\" . $sql_result[0] . \"'\";
  36. while ( $i < $count ) //Pętla odpowiedzialna za utworzenie zapytania
  37. {
  38. $sql_for_write .= &#092;", '\" . $sql_result[$i] . \"'\" ;
  39. $i++;
  40. }
  41. $sql_for_write .= &#092;");n\" ;
  42. fputs ( $file, $sql_for_write ); //Zapytanie zostaje zapisane do pliku.
  43. unset ( $sql_for_write ); //Czyścimy zmienną, żeby nie zajmowała pamięci. Zostanie ona później znowu wykorzy
  44. tana.
  45. }
  46.  
  47. fclose ( $file ); //Zamykamy plik
  48.  
  49. return 1 ; //Funkcja została poprawnie wykonana.
  50. }
  51.  
  52.  
  53.  
  54. ?>


Wykorzystanie:
  1. <?php
  2.  
  3. $host = &#092;"localhost\" ;
  4. $login = &#092;"root\" ;
  5. $password = &#092;"\" ;
  6. $database = &#092;"baza\" ;
  7. $table = &#092;"tabela\" ;
  8. $file_name = &#092;"backup.sql\" ;
  9. $orderby = &#092;"id\" ; //Tu zostały ustawione parametry funkcji; w zmienną \"orderby\" wpisujemy klucz, według którego bedzą sortowane wyniki.
  10.  
  11. require_once ( &#092;"backup.php\" ); //Dołączamy naszą funkcję
  12.  
  13. $result = copytable ( $host, $login, $password, $database, $table, $file_name, $orderby ); //Ustawiamy zmienną, aby sprawdzić czy wywołanie się powiodło.
  14.  
  15. if ( $result = 0 ) //Jeśli nie
  16. {
  17. print &#092;"Wystąpił błąd!\"; //Wyświetlamy komunikat
  18. }
  19. else //W przeciwnym wypadku
  20. {
  21. print &#092;"Kopia została wykonana!\"; //Powiadamiamy o wykonaniu zadania.
  22. }
  23.  
  24. ?>

Napewno działa, sprawdzałem smile.gif i to na każdym serwerze.
TomASS
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\appserv\www\gotowe\bkp2.php on line 15

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\appserv\www\gotowe\bkp2.php on line 30
Kopia została wykonana!



:/



line 15: $records_num = mysql_num_rows ( $sql ); //Zliczamy rekordy


line 30: while ($sql_result = mysql_fetch_array( $sql, MYSQL_NUM ) ) //Pętelka która pozwala na odczytanie danych


a jak potem wczytac te dane?
MoD
Pytanie: podałeś dobre informacje do zmiennych?

Wczytuje się je bardzo prosto: musisz wywołać plik z PhpMyAdmin.
slaug
Nie wiem na ile jest jeszcze ten post aktualny, ale jeżeli chodzi o zapytanie wcześniej podawane, to przy podawaniu ścieżki powinny być trzy znaki \ u mnie wygląda to tak:

$zapytanie = "SELECT * INTO OUTFILE 'c:\\\a.txt' FIELDS TERMINATED BY ',' FROM klienci"; i jeżeli poprawnie łączy się z bazą jest wszystko w porządku.

A tak wogóle to dzięki za pomysły, też poszukiwałem skryptowego zapisywania bazy i to sprawuje się bardzo dobrze.

Pozdrawiam,
Daniel
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.