Projektowanie stron WWW od podszewki

Artykuły na każdy temat

[MSSQL] Tworzenie kopii zapasowej bazy danych, czyli tzw. backupu

Dodano 03.05.2011r. o 14:42
Ostatnimi czasy zacząłem bawić się bazami danych MSSQL. Muszę przyznać, że są stanowczo wygodniejsze, aniżeli te MySQL'owe. Narzędzia oraz silnik są świetnie przemyślane i zaprojektowane. Kto by pomyślał, że w MSSQL wystarczy jedno proste zapytanie i możemy sobie wyeksportować cała bazę danych do pliku?
Kod:
BACKUP DATABASE nazwa_bazy_danych 
TO DISK = 'c:\ścieżka\do\pliku\backup.bak'
Zapytanie tak proste, że chyba nikomu nie trzeba tłumaczyć, które wartości trzeba podmienić? Ponadto zleceniodawca poprosił mnie, abym stworzył skrypt, który będzie tworzył backup'y o określonej porze, pakował je do archiwum i wysyłał na zewnętrzny serwer. Wystarczy odpowiednio skonfigurować i dodać zadanie do CRON'a aby wszystko grało jak trzeba. Aplikacja jest tak prosta, że każdy z Was może się pokusić o modyfikacje wedle swoich potrzeb.
Kod:
<?php
// Prekonfiguracja
set_time_limit(0);
// Konfiguracja
$config['odbc']['dns'] = '';
$config['odbc']['login'] = '';
$config['odbc']['password'] = '';
$config['odbc']['database'] = '';
$config['ftp']['host'] = '';
$config['ftp']['login'] = '';
$config['ftp']['password'] = '';
$config['dir']['backups'] = 'backups';
// Tworzenie kopii zapasowej
$date = array(date('Y-m-d'), date('H-i'));
$path[] = dirname(__FILE__).'\\'.$config['dir']['backups'].'\\'.$date[0].'\\';
$path[] = $date[1].'.zip';
$path[] = $path[0].$date[1].'.bak';
$path[] = $path[0].$path[1];
$path[] = $date[0].' '.$date[1].'.bak';

if(!file_exists($path[0]))
{
 mkdir($path[0]);
}

$odbc_connection_handle odbc_connect($config['odbc']['dns'], $config['odbc']['login'], $config['odbc']['password']);
odbc_exec($odbc_connection_handle"BACKUP DATABASE ".$config['odbc']['database']." TO DISK = '".$path[2]."'");
odbc_close($odbc_connection_handle);
$zip = new ZipArchive;
$zip -> open($path[3], ZIPARCHIVE::CREATE);
$zip -> addFile($path[2], $path[4]);
$zip -> close();
unlink($path[2]);
$ftp_conneciton_handle ftp_connect($config['ftp']['host']);
ftp_login($ftp_conneciton_handle$config['ftp']['login'], $config['ftp']['password']);
$dir_list ftp_nlist($ftp_conneciton_handle'.');

foreach($dir_list as $file)
{
 if($file != '.' && $file != '..' && $file == $date[0])
 {
  $catch_dir true;
  break;
 }
}

if(!$catch_dir)
{
 ftp_mkdir($ftp_conneciton_handle$date[0]);
}

ftp_chdir($ftp_conneciton_handle$date[0]);
ftp_put($ftp_conneciton_handle$path[1], $path[3], FTP_BINARY);
ftp_close($ftp_conneciton_handle);
?>
Jeżeli chodzi o wykonanie skryptu, to miałem do dyspozycji tylko moduły FTP, ODBC i ZIP. Dla tych ludzi, co lubią komplikować sobie życie, proponuję zmianę ODBC na PDO albo mssql_*, użycie SSL podczas transferu plików przez FTP oraz zmienienie ZIP'a na RAR'a. Ponadto, jeżeli w głównym folderze na serwerze zewnętrznym mają znajdować się nie tylko foldery z backup'ami, to trzeba będzie nieco przeedytować pętle sprawdzającą czy dany folder istnieje już na serwerze. Jak już pewnie zauważyliście, pominąłem obsługę jakichkolwiek błędów w powyższym kodzie. Jeżeli lubicie logować wszystkie niepowodzenia to z łatwością podepniecie jakiś logger (obsługę nieoczekiwanych zdarzeń).

Zaplanowanie zadania

Jeżeli chodzi o uruchamianie zadań cyklicznych przez CRON'a, to wystarczy odpowiednio zmienić poniższą linijkę (dostosować ścieżki) i wsadzić ją w tzw. element docelowy w oknie ustawiania zadania.
Kod:
d:\xampp\php\php.exe -f "d:\xampp\htdocs\mssql-backuper\index.php"

Komentarze

Publikowane komentarze są prywatnymi opiniami użytkowników serwisu. Serwis nie ponosi odpowiedzialności za treść opinii. W trosce o zachowanie poziomu dyskusji wszystkie komentarze podlegają akceptacji przed ich publikacją dlatego proszę cierpliwie czekać aż komentarz zostanie opublikowany.

CapaciousCore

Dodano 04.05.2011r. o 14:38
@Drraven nie dodałem z prostego powodu. Każdy stosuje własne rozwiązania (w tym i logger). W jednym z najbliższych artykułów napiszę o loggerze i wzorcu obserwatora.

Jeżeli chodzi o Twój pomysł to jest średni. Przepisywać wszystko tylko dlatego, że chcesz użyć MSSQL? Pamiętaj, że ten silnik można uruchomić tylko na hostingu z zainstalowanym Windowsem. Znam tylko kilka firm świadczących usługi tego typu w Polsce. Zapewniam Ciebie, że tanie to one nie są.

Drraven

Dodano 03.05.2011r. o 21:04
Właśnie poczytałem o MSSQL i może użyję tego w moim nowym blogu (znów przepiszę wszystko).

Można wiedzieć dlaczego nie zrobiłeś mu tam logera?

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)