Автор Тема: архивиране с tar  (Прочетена 735 пъти)

prilep

  • Напреднали
  • *****
  • Публикации: 94
    • Профил
архивиране с tar
« -: 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();
}




Активен

Powered By DomashnaGROZDOVA & ShopskaSalata