Титла: архивиране с tar
Публикувано от: prilep в Jun 16, 2008, 12:39
Вчера реших, че е крайно време да си направя скрипт за архивиране и попаднах на тази статия: Създаване на резервни копия с TARЕдин от коментарите към статията на Георги Андонов ми се стори особено полезен, ето част от него: Цитат | А сега няколко примерни стратегии: ---------------------------------- 1. Месечна. - Първият петък на месеца се прави пълен архив. - Дневните архиви съдържат данните променени в текущия ден. - Седмичните архиви (Петък) съдържат данните променени в текущата седмица. - Събота и неделя не се правят архиви :-)
П В С Ч П С Н 1. 0 2. 2 2 2 2 1 3. 3 3 3 3 2 4. 4 4 4 4 3 5. 5 5 5 5 4
Възстановяване при срив: Най-лошият случай е "Срив в последния петък на месеца". Възстановяването на системата изглежда така: - Архив 0 от първия Петък. - Архив 1 от втория Петък. - Архив 2 от третия Петък. - Архив 3 от четвъртия Петък. - Архив 5 от последния Понеделник. - Архив 5 от последния Вторник. - Архив 5 от последната Сряда. - Архив 5 от последния Четвъртък. Данните от последния Петък са загубени.
Предимства и недостатъци: - Бързо се създават архивите. - Бавно се възстановяват.
|
Реших това нещо да го реализирам и резултата е скрипта по-долу, който пускам в случай, че ще е от полза на някого.
Примерен код | <?php define("BIN_MYSQLDUMP", "/usr/local/bin/mysqldump"); define("BIN_TAR", "/usr/local/bin/gtar"); define("BIN_CP", "/bin/cp"); define("MYSQL_ROOT_PASSWORD", "myrootpassword"); define("BACKUP_INCLUDE", "/root/etc/backup.include"); define("BACKUP_EXCLUDE", "/root/etc/backup.exclude"); define("BACKUP_LOCATION", "/var/backup");
function usage(){ echo "Usage: backup.php [--init]\n"; echo "Create backup for today if no parameters are passed.\n"; echo "--init Creates all backups from the beginig of the month until today\n"; exit(); }
function mysql_dump(){ exec(BIN_MYSQLDUMP . " -u root -A -p" . MYSQL_ROOT_PASSWORD . " > /var/sqldumps/mysql_backup.sql"); }
function copy_snar($snar_old, $snar_new){ exec(BIN_CP . " /var/backup/$snar_old /var/backup/$snar_new"); }
function tar_exec($archive_name, $snar_name){ exec(BIN_TAR . " --create \ --gunzip \ --exclude-from=" . BACKUP_EXCLUDE . " \ --files-from=" . BACKUP_INCLUDE . " \ --file=" . BACKUP_LOCATION . "/$archive_name \ --listed-incremental=" . BACKUP_LOCATION . "/$snar_name"); }
function backup($date = false){ if ($date == false) { $date = date('d'); }
// get the day of the week $day = date('N', mktime(0, 0, 1, date('m'), $date));
// get the first friday $first_day_of_the_month = date('j', mktime(0, 0, 0, date('m'), 1)); switch (date('N', mktime(0, 0, 1, date('m'), $first_day_of_the_month))){ case 1: $number_of_days_to_friday = 4; break; case 2: $number_of_days_to_friday = 3; break; case 3: $number_of_days_to_friday = 2; break; case 4: $number_of_days_to_friday = 1; break; case 5: $number_of_days_to_friday = 0; break; case 6: $number_of_days_to_friday = 6; break; case 7: $number_of_days_to_friday = 5; break; } $first_friday = $first_day_of_the_month + $number_of_days_to_friday;
// get the week $first_week = date('W', mktime(0, 0, 0, date('m'), $first_friday)); $todays_week = date('W', mktime(0, 0, 0, date('m'), $date)); $week = $todays_week - $first_week + 1;
// callculate the tar level $level = $week; if ($day == 5){ $level = $level - 1; }elseif ($week == 1){ $level = 5; }
$archive_name = date('Ymd', mktime(0, 0,0 , date('m'), $date)) . '.' . $level . '.tar.gz'; $snar_name = $level . '.snar';
// copy snar files only on monday and friday if ($day == 1) { $snar_old_name = $level - 2 . '.snar'; copy_snar($snar_old_name, $snar_name);
}else if ($day == 5 && $first_friday != $date) {
$snar_old_name = $level - 1 . '.snar'; copy_snar($snar_old_name, $snar_name); }
// create archives only in working days if ($day >= 1 && $day <= 5) { tar_exec($archive_name, $snar_name); } }
// start if (isset($argv[1]) && $argv[1] == '--init') { mysql_dump();
$first_day_of_the_month = date('j', mktime(0, 0, 0, date('m'), 1)); switch (date('N', mktime(0, 0, 1, date('m'), $first_day_of_the_month))){ case 1: $number_of_days_to_friday = 4; break; case 2: $number_of_days_to_friday = 3; break; case 3: $number_of_days_to_friday = 2; break; case 4: $number_of_days_to_friday = 1; break; case 5: $number_of_days_to_friday = 0; break; case 6: $number_of_days_to_friday = 6; break; case 7: $number_of_days_to_friday = 5; break; } $first_friday = $first_day_of_the_month + $number_of_days_to_friday;
for ($i = $first_friday; $i <= date('j'); $i++){ backup($i); } }else if (!isset($argv[1])) { mysql_dump(); backup(); }else { usage(); }
|
|