Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prośba o ocenę efektywności skryptu
Forum PHP.pl > Forum > PHP
ktuvok
Polecony mi przez kogoś przykładowy skrypt do backupu bazy MySQL, który znajduje się tutaj przerobiłem po swojemu - tak aby poddawał dane kompresji. Rezultat poniżej.

Jeśli ktoś znajdzie w nim jakieś ewidentne babole lub zwróci uwagę na coś, o czym zapomniałem, to będę wdzięczny za jakieś info. Skrypt się wykonuje, ale zbyt szybko toto nie działa...

Pozdrawiam,
K


  1. <?php
  2.  
  3.  
  4. //pomijam połączenie z bazą danych - oczywista rzecz.
  5.  
  6. $crlf = &#092;"rn\";
  7.  
  8. $time = date('Y-m-d H-i-s', time());
  9. $NazwaPliku = $time.&#092;".txt.gz\";
  10. $PlikArchiwum = gzopen(&#092;"backupy/\".$NazwaPliku, \"wb9\");
  11.  
  12. gzwrite($PlikArchiwum, '#' . $crlf);
  13. gzwrite($PlikArchiwum, '# Zrzut bazy danych' . $crlf);
  14. gzwrite($PlikArchiwum, '# Moment wygenerowania: ' . $time . $crlf);
  15. gzwrite($PlikArchiwum, '#' . $crlf . $crlf);
  16.  
  17. $res = mysql_list_tables(&#092;"nazwa_bazy\");
  18. while($row = mysql_fetch_array($res))
  19. {
  20. $table_name = $row[0];
  21. $table_fields = array();
  22.  
  23. gzwrite($PlikArchiwum, '#' . $crlf);
  24. gzwrite($PlikArchiwum, '# Struktura tabeli ' . $table_name . $crlf);
  25. gzwrite($PlikArchiwum, '#' . $crlf);
  26.  
  27. gzwrite($PlikArchiwum, 'DROP TABLE IF EXISTS ' . $table_name . ';' . $crlf);
  28. gzwrite($PlikArchiwum, 'CREATE TABLE ' . $table_name . ' ( ' . $crlf);
  29.  
  30. $res2 = mysql_query('SHOW FIELDS FROM ' . $table_name);
  31. while($fields = mysql_fetch_array($res2))
  32. {
  33. gzwrite($PlikArchiwum,'  ');
  34. gzwrite($PlikArchiwum, $fields['Field'] . ' ' . $fields['Type']);
  35. if (!empty($fields['Default']))
  36. {
  37. gzwrite($PlikArchiwum, ' DEFAULT '' . $fields['Default'] . ''');
  38. }
  39.  
  40. if ($fields['Null'] != 'Yes')
  41. {
  42. gzwrite($PlikArchiwum, ' NOT NULL');
  43. }
  44.  
  45. if (!empty($fields['Extra']))
  46. {
  47. gzwrite($PlikArchiwum, ' ' . $fields['Extra']);
  48. }
  49.  
  50. gzwrite($PlikArchiwum, ',' . $crlf);
  51.  
  52. $table_fields[] = $fields['Field'];
  53. }
  54.  
  55. $index = '';
  56.  
  57. $res2 = mysql_query('SHOW KEYS FROM ' . $table_name);
  58. while ($keys = mysql_fetch_assoc($res2))
  59. {
  60. $kname = $keys['Key_name'];
  61. if(($kname != 'PRIMARY') && ($keys['Non_unique'] == 0))
  62. {
  63. $kname = 'UNIQUE|' . $kname;
  64. }
  65.  
  66. $index[$kname] = array();
  67. $index[$kname][] = $keys['Column_name'];
  68. }
  69.  
  70. while(list($n, $columns) = @each($index))
  71. {
  72. if ($n == 'PRIMARY')
  73. {
  74. gzwrite($PlikArchiwum, '  PRIMARY KEY (' . implode($columns, ', ') . ')');
  75. }
  76. elseif (substr($n, 0, 6) == 'UNIQUE')
  77. {
  78. gzwrite($PlikArchiwum, '  UNIQUE ' . substr($n, 7) . ' (' . implode($columns, ', ') . ')');
  79. }
  80. else
  81. {
  82. gzwrite($PlikArchiwum, '  KEY ' . $n . ' (' . implode($columns, ', ') . ')');
  83. }
  84. gzwrite($PlikArchiwum, $crlf);
  85. }
  86.  
  87. gzwrite($PlikArchiwum, ');' . $crlf);
  88. gzwrite($PlikArchiwum, $crlf . $crlf);
  89.  
  90. gzwrite($PlikArchiwum, '#' . $crlf);
  91. gzwrite($PlikArchiwum, '# Dane z tabeli ' . $table_name . $crlf);
  92. gzwrite($PlikArchiwum, '#' . $crlf);
  93.  
  94. $d_res = mysql_query('SELECT * FROM ' . $table_name);
  95. while ($data = mysql_fetch_array($d_res))
  96. {
  97. gzwrite($PlikArchiwum, 'INSERT INTO ' . $table_name . ' (' . implode(', ', $table_fields) . ') VALUES(');
  98.  
  99. $field_count = count($table_fields);
  100. $f_data = array();
  101. for ($i = 0; $i < $field_count; $i++)
  102. {
  103. $f_data[] .= ''' . $data[$i] . ''';
  104. }
  105. gzwrite($PlikArchiwum, implode(', ', $f_data));
  106. gzwrite($PlikArchiwum, ');' . $crlf);
  107. }
  108. gzwrite($PlikArchiwum, $crlf . $crlf);
  109. }
  110.  
  111. gzclose($PlikArchiwum);
  112.  
  113. ?>
enceladus
Powiem tak ... 1000 razy lepsza metoda to mysqldump smile.gif w koncu do tego został stworzony. Dumpujesz poszczególne bazy (warto z rozbiciem na tabele by potem łatwiej dotrzec do jakichs danych a nie parsować ogromny plik), tarujesz, gzipujesz i gotowe.....
Kod
#!/bin/sh
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
OUTDIR=/sciezka/do/kopii/$YEAR/$MONTH/$DAY
BKSTART=$(date +%m%d-%H%M)
/bin/mkdir -p $OUTDIR

for TABLE in `/usr/local/bin/mysql -Be 'show tables;' nazwa_bazy | grep -v 'Tables_in'`
do
  FNAME="BAK_$BKSTART.$TABLE.sql"
   /usr/local/bin/mysqldump --add-drop-table nazwa_bazy $TABLE > $OUTDIR/$FNAME
done
cd $OUTDIR
/usr/bin/tar cjf DB_BAK_$BKSTART.tar.bz2 --remove-files *.sql

Każda tabelka jest w oddzielnym pliku, dzień ztarowany w całość, każdy dzień, miesiąc, rok to oddzielny katalog - można robić kilka kopii dziennie ....
ktuvok
Fajnie, tylko że nie bardzo rozumiem Twój kod... Skąd się to odpala?

Korzystam z serwera wirtualnego i mój dostęp do katalogów jest ograniczony. A chciałem zautomatyzować sobie backup ładując mój skrypt do crona i uruchamiać go w nocy.

Jednym słowem napisz coś więcej bo ni w ząb nie rozumiem. smile.gif

Pozdrawiam,
Krzysiek
enceladus
Kod
#!/bin/sh

TO jest skrypt w shellu wykonywany właśnie w cronie - jeśli masz dostęp do crona - to i do shella pewnie tez.
MoD
Cytat(enceladus @ 2004-09-27 14:13:50)
Powiem tak ... 1000 razy lepsza metoda to mysqldump smile.gif w koncu do tego został stworzony. Dumpujesz poszczególne bazy (warto z rozbiciem na tabele by potem łatwiej dotrzec do jakichs danych a nie parsować ogromny plik), tarujesz, gzipujesz i gotowe.....
Kod
#!/bin/sh
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
OUTDIR=/sciezka/do/kopii/$YEAR/$MONTH/$DAY
BKSTART=$(date +%m%d-%H%M)
/bin/mkdir -p $OUTDIR

for TABLE in `/usr/local/bin/mysql -Be 'show tables;' nazwa_bazy | grep -v 'Tables_in'`
do
 FNAME="BAK_$BKSTART.$TABLE.sql"
  /usr/local/bin/mysqldump --add-drop-table nazwa_bazy $TABLE > $OUTDIR/$FNAME
done
cd $OUTDIR
/usr/bin/tar cjf DB_BAK_$BKSTART.tar.bz2 --remove-files *.sql

Każda tabelka jest w oddzielnym pliku, dzień ztarowany w całość, każdy dzień, miesiąc, rok to oddzielny katalog - można robić kilka kopii dziennie ....

Taaaa... a weź pod uwagę to, że na darmowych serwerach nie ma shella ani nawet funckji exec" title="Zobacz w manualu PHP" target="_manual. No i co wtedy?? Pozostaje skrypt ktuvoka.
Vertical
Oceny chyba się daje na forum "Oceny" ?
enceladus
Cytat(MoD @ 2004-10-02 13:05:39)
Taaaa... a weź pod uwagę to, że na darmowych serwerach nie ma shella ani nawet funckji exec" title="Zobacz w manualu PHP" target="_manual. No i co wtedy?? Pozostaje skrypt ktuvoka.

Jak już napisałem - jeśli ktoś ma dostęp do cron-a ma pewnie też do shella....
Ale jeśli i z tym masz problem to w mysql-u możesz:
  1. SELECT * FROM tabela INTO OUTFILE 'jakis_pliczek'
(polecam: http://dev.mysql.com/doc/mysql/en/SELECT.html )
a potem:
  1. LOAD DATA INFILE jakis_pliczek INTO TABLE tabela
(polecam: http://dev.mysql.com/doc/mysql/en/LOAD_DATA.html )
To będzie chyba metoda szybsza (nie sprawdzałem), ale z pewnością zdecydowanie prostsza i pewniejsza..... i nie trzeba konta z shellem tongue.gif
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.