Programowanie w języku PHP » FAQ

Jak zrobić kopię zapasową bazy mySQL za pomocą php

  • 2009-12-20 14:45
  • 5 komentarzy
  • 3637 odsłon
  • Oceń ten tekst jako pierwszy
Kod, który tu przedstawiam powinien skopiować zawartość podanej bazy danych i zapisać ją w pliku test.sql.

<?php
$link = mysql_connect('127.0.0.1', 'root', 'haslo') or die('Connection error : ' . mysql_error());
 
mysql_select_db('nazwa bazy') or die('Could not select database');
 
$sql = '';
$crlf = "\r\n";
 
$time = date('Y m d, H:i', time());
$sql .= '#' . $crlf;
$sql .= '# Zrzut bazy danych ' . $crlf;
$sql .= '# Wygenerowano: ' . $time . $crlf;
$sql .= '#' . $crlf . $crlf;
 
$res = mysql_list_tables('nazwa bazy');
while($row = mysql_fetch_array($res))
{
  $table_name = $row[0];
  $table_fields = array();
 
  $sql .= '#' . $crlf;
  $sql .= '# Struktura tabeli ' . $table_name . $crlf;
  $sql .= '#' . $crlf;
 
  $sql .= 'DROP TABLE IF EXISTS ' . $table_name . ';' . $crlf;
  $sql .= 'CREATE TABLE ' . $table_name . ' ( ' . $crlf;
 
  /* Generujemy strukture tabeli. Najpierw wyciagamy pola */
  $res2 = mysql_query('SHOW FIELDS FROM ' . $table_name);
  while($fields = mysql_fetch_array($res2))
  {
      $sql .= '   ';
      $sql .= $fields['Field'] . ' ' . $fields['Type'];
      if (!empty($fields['Default']))
      {
          $sql .= 'DEFAULT \'' . $fields['Default'] . '\'';
      }
 
      if ($fields['Null'] != 'Yes')
      {
          $sql .= ' NOT NULL';
      }
 
      if (!empty($fields['Extra']))
      {
          $sql .= ' ' . $fields['Extra'];
      }
 
      $sql .= ',' . $crlf;
 
      $table_fields[] = $fields['Field'];
  }
 
  $index = '';
 
  /* Teraz wyciagamy pola typu KEY */
  $res2 = mysql_query('SHOW KEYS FROM ' . $table_name);
  while ($keys = mysql_fetch_assoc($res2))
  {
      $kname = $keys['Key_name'];
      if(($kname != 'PRIMARY') && ($keys['Non_unique'] == 0))
      {
          $kname = 'UNIQUE|' . $kname;
      }
 
      $index[$kname] = array();
      $index[$kname][] = $keys['Column_name'];
  }
 
  while(list($n, $columns) = @each($index))
  {
      if ($n == 'PRIMARY')
      {
          $sql .= '   PRIMARY KEY (' . implode($columns, ', ') . ')';
      }
      elseif (substr($n, 0, 6) == 'UNIQUE')
      {
          $sql .= '   UNIQUE ' . substr($n, 7) . ' (' . implode($columns, ', ') . ')';
      }
      else
      {
          $sql .= '   KEY ' . $n . ' (' . implode($columns, ', ') . ')';
      }
      $sql .= $crlf;
  }
 
  $sql .= ');' . $crlf;
  $sql .= $crlf . $crlf;
 
  $sql .= '#' . $crlf;
  $sql .= '# Dane z tabeli ' . $table_name . $crlf;
  $sql .= '#' . $crlf;
 
  /* Mamy juz strukture, wiec teraz czas
     wyciagnac dane z tabeli */
  $d_res = mysql_query('SELECT * FROM ' . $table_name);
  while ($data = mysql_fetch_array($d_res))
  {
      $sql .= 'INSERT INTO ' . $table_name . ' (' . implode(', ', $table_fields) . ') VALUES(';
 
      $field_count = count($table_fields);
      $f_data = array();
      for ($i = 0; $i < $field_count; $i++)
      {
          $f_data[] .= '\'' . $data[$i] . '\'';
      }
      $sql .= implode(', ', $f_data);
      $sql .= ');' . $crlf;
  }
  $sql .= $crlf . $crlf;
}
 
 
$file = fopen('test.sql', 'w');
fwrite($file, $sql);
fclose($file);
 
?>


Wersja dla klasy PDO


<?php
/***************************************************************************
****************            XVweb Project          *************************
****************  Name     :  SQL Dump/Export      *************************
****************  License  :  GNU                  *************************
****************  Authors  :  Krzysztof Bednrczyk  *************************
*************************XVweb Team*****************************************
***************************************************************************/
 
DEFINE('BdServer', 'LOCALHOST', true); // MySQL server / Serwer MySQL
DEFINE('BdServer_User', 'USER', true); // MySQL user / Użytkownik MySQL
DEFINE('BdServer_Password', 'PASSWORD', true); // MySQL Password / Hasło MySQL
DEFINE('BdServer_Base', 'DATABASE', true); // MySQL DataBase / Baza danych
DEFINE('Dump_File', 'dump.sql', true);  // Name generated file / Nazwa wygenerowanego pliku
 
 
$SQLDump   = '/*'.chr(13); // Header for file / Nagłówek dla pliku
$SQLDump  .= '# SQL DUMP: '.(BdServer_Base).chr(13); // Name database / Nazwa bazy danych
$SQLDump  .= '# GENERATED: '.date("d.m.Y H:i:s").chr(13); //Date generated / Data wygenerowania
$SQLDump  .= '*/'.chr(13); // END Header
try { //Try / próbój
        $dbh = new PDO('mysql:host='.BdServer.';dbname='.BdServer_Base, BdServer_User, BdServer_Password); // Connecting with database /Łączenie się z bazą danych
 
        foreach ($dbh->query('SHOW TABLES;') as $Table) { // Get tables / Pobieranie tabel
                $TableStructure = $dbh->query('SHOW CREATE TABLE `'.$Table[0].'`')->fetch(); // Get table structure / Pobieranie struktury tabeli
                $SQLDump .= '/*TABLE STRUCTURE FOR `'.$Table[0].' */ '.chr(13).chr(13); //Header for table structure / Nagłówek dla struktury tabeli
                $SQLDump .= $TableStructure[1].chr(13);  //Adding table structure to variable / Dodawanie struktury tabeli do zmiennej
                $SQLDump .= chr(13).'/*SQL TABLE RECORDS FOR `'.$Table[0].' */ '.chr(13).chr(13); // Header for table records / Nagłówek dla rekordów tabeli
                foreach($dbh->query('SELECT * FROM `'.$Table[0].'`;')->fetchAll(PDO::FETCH_ASSOC) as $SelectRow) // Foreach loop with records / Pętla z reordami tabeli
                        $SQLDump .= sprintf('INSERT INTO `'.$Table[0].'` (%s) VALUES (%s);', implode(', ', array_map(function($n){ return '`'.$n.'`';} ,array_keys($SelectRow))), implode(', ',array_map(array($dbh, 'quote'), $SelectRow))).chr(13); //Generate sql query with records / Generowanie zapytań SQL z rekordami
                $SQLDump .= chr(13).chr(13); //Two empty lines for aesthetics / Dwie puste linie dla estetyki
        }
 
} catch (PDOException $e) { //Catching errors / Łapanie błędów
        exit(sprintf("SQL error: %s", ($e->getMessage()))); // If error, then print message and quit / Jeśli błąd, wyświetl komunikat i zakończ pracę
}
 
file_put_contents(Dump_File, $SQLDump); //Save to file / Zapisz do pliku
echo "Done!"; //Done / Zakończenie
?>

5 komentarzy

bordeux 2009-12-23 07:03

Zrobiłem błąd. Zamiencie

    $SQLDump .= $TableStructure[1].chr(13);  //Adding table structure to variable / Dodawanie struktury tabeli do zmiennej

na
    $SQLDump .= $TableStructure[1].';'.chr(13);  //Adding table structure to variable / Dodawanie struktury tabeli do zmiennej

molek12 2009-12-20 21:10

wiekszos serwisow udostepnia phpmyadmina a nawet bez shela odpalic dumpa
<?php
shell_exec('mysqldump dbName -uDBuser -pDBpass | gzip > date +%Y%m%d%H%M%S_fileName.gz');
?>

Snowak 2008-06-20 09:10

Nie prościej SHOW CREATE TABLE test?

Olimpia_ona 2004-12-06 21:31

Jest tylko mały problem gdy tabela nie ma klucze np.:
CREATE TABLE archiwum_komunikatow (
   kom_ID int(11) NOT NULL,
   temat text NOT NULL,
   tresc text NOT NULL,
   data_nad datetimeDEFAULT '0000-00-00 00:00:00' NOT NULL,
);
i jak widać w ostatniej linii dodało znak: ' , '(przecinek), przez co w czasie wykonywania pliku baza zwraca błąd

Adam Boduch 2004-08-03 00:12

Przydaloby sie wiecej komentarzy dotyczacych kodu.

Poza tym majac dostep do serwera MySQL, najlepiej zrobic to przy pomocy mysqldump.