<?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);
?>
Powyższy kod działa bez problemu na mniejszych bazach danych. Jednak moja baza ma ok 150mb i działanie tego kodu konczy się zawieszką serwera lub "nie mozna wyswietlic strony..". Czy da się poprawić powyższy kod tak aby robil backup jakos stopniowo, zeby nie zawiesil serwera?
PS. bardzo podoba mi sie dbloader znany z phpBB by przemo, ktory wczytuje backup bazy stopniowo a na ekranie wyświetla postęp wczytywania w %. Czy da sie zrobić cos podobnego z powyższym skryptem?