Artykuły na każdy temat
[MSSQL] Tworzenie kopii zapasowej bazy danych, czyli tzw. backupu
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.
<?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ń).
d:\xampp\php\php.exe -f "d:\xampp\htdocs\mssql-backuper\index.php"
Komentarze
Dodaj komentarz
CapaciousCore
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ą.