Автор Тема: кажете някоя програма за архивиране  (Прочетена 1588 пъти)

wasil2007

  • Напреднали
  • *****
  • Публикации: 32
    • Профил
Кажете някоя програма за архивиране под линукс на определна папка в определен час.

да има възможност архивирането да се извършва на основния компютър и на друк ком от мрежата

---------------------------------------
проблема ми е следния имам база данни искам през определно време да се архивира - да се запазва резервно копие на същия комп и на друг комп.
Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
кажете някоя програма за архивиране
« Отговор #1 -: Feb 22, 2007, 11:54 »
Базата данни ако не е текстово файлче, а RDBMS (като MySQL или PostgreSQL), е добре да се архивира с инструментите на съответната база (примерно mysql_dump и pg_dump).

След това с tar + gz + ssh + rsync + cron можеш да направиш това, което искаш.

Кажи по-подробно каква е крайната цел на задачата, за да можем да ти помогнем. Така много неясно и малко далеч от целта...
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
кажете някоя програма за архивиране
« Отговор #2 -: Feb 22, 2007, 12:37 »
Аз програма не знам, но ето скрипт, който използвам за архивиране. Понеже архивирам много папки, използвам няколко скрипта, но на теб са ти достатъчни тези три, които ще ти покажа след малко. Понагласил съм ги, но все пак твоите пътища е възможно да са различни. Като начало, направи си една папка /usr/local/backup и сложи скриптовете там, като след това направиш файловете изпълними.
Ето го първия. Този го кръсти conf.pl

Цитат
#!/usr/bin/perl

$tarpath = "/home/backup";

##If you want to timestamp the filename, select this as 1, otherwise 0;

$date_yes = 1;

## samo ahrhivirane, bez ftp transfer

$just_back_up = 0;
$delete_source = 0;

$ftpserver = "111.222.333.444";
$ftpusername = "username";
$ftppass = "password";

$notify = 1;

#path to sendmail

$sendmail = "/usr/sbin/sendmail";

##email address:

$to = 'your@email.address';

##Who will the email address be from

$from = 'some@email.address';


В този файл ще описваш настройките за архивиране. Нагласил съм $just_back_up = 0;
$delete_source = 0;
за да имаш едновременно копие в компютъра, от който се изпълнява скрипта и копие на някой ftp сървър.

Следващият скрипт го кръсти arh_mysql.pl

Цитат
#!/usr/bin/perl

require "/usr/local/backup/conf.pl";

use CGI::Carp qw(fatalsToBrowser);

## CWD directory, in other words, when the script logs into the FTP server,
## where would you like the backup.tar.gz file to be placed

$basepath = "/var/lib/mysql";
$ime = "arhiv_mysql";
$cwdd = "mysql";
$subj = "MySQL";

##############################NO MORE EDITING REQUIRED ####################################

use Net::FTP;

$hitch = ();
($day, $month, $year) = (localtime)[3,4,5];
$year = $year + 1900; $month++;
$month = sprintf("%02d" ,$month) if $month <= 9;
$day = sprintf("%02d" ,$day) if $day <= 9;

if ($date_yes) { $hitch = "$day-$month-$year"; }

$filename = $ime . "_" . $hitch . ".tar" . ".gz";
print "\n\n           ARHIVIRANE NA FAILOVETE           \n\n";
@the = `tar -czf $tarpath/$filename $basepath`;
@mat = stat("$tarpath/$filename");

if ($mat[7] <= 0) { print "Arhiviraneto e prekusnato !!! Vuzmojna greshka w sistemata -  @the\n"; &send("Arhiviraneto NEUSPESHNO !!!", "Arhiviraneto NEUSPESHNO !!!"); exit; }

print "Failovete sa kompresirani v $filename\nRazmera na faila e ...................... $mat[7] Bytes\n";

if ($just_back_up) {

&send("Arhiviraneto zawurshi uspeshno. Razmera na arhivirania fail e:  $mat[7] bytes", "Arhiviraneto e uspeshno.");

print "Arhivirane bez ftp transfer ..........................OK\n\n";

exit;
}

print "Vruzka kum ftp server-a .......................OK\n";

if ($ftp = Net::FTP->new("$ftpserver", Debug => 0)) { print "Autorizazia kum ftp servera .......................OK\n"; } else { print "ne namiram posochenia ftp server !!!\n"; &send("Arhiviraneto NEUSPESHNO !!!. Ne e osushtestena wruzka s ftp server:  $ftpserver", "Arhiviraneto NEUSPESHNO"); exit; }

if ($ftp->login("$ftpusername","$ftppass")) { print "Username and Password .......................OK\n"; } else { print "could not log into server with Username and Password. Exiting!\n"; &send("Backup FAILED. Could NOT connect to $ftpserver with the Username And Password provided - Authentication error.", "Backup FAILED"); exit; }

$ftp->binary();

if ($ftp->cwd("$cwdd")) { print "Vlizam w poddirektoria (/$cwdd)...............OK\nKopiram faila $filename na ftp servera . . . . . . . .\n"; } else { print
"Ne e izbrana direktoria kudeto da se kopira faila na FTP servera,/n vupreki towa faila shte bude kopiran w
glavnata direktoria na servera\n"; }

if ($ftp->put("$tarpath/$filename")) { print "Transferirane na  $filename ......................OK\n"; } else { print
"FAILA NE E KACHEN NA FTP SERVERA $!\n KRAI\n"; &send("ARHIVIRANETO NEUSPESHNO. FAILA NE E KACHEN NA FTP SERVERA: $ftpserver. $1", "ARHIVIRANETO NEUSPESHNO"); exit; }

$ftp->quit;

if ($delete_source) {

print "Faila ($filename) koito arhivirahme shte bude iztrit ot diska, sled kato veche e kachen na FTP server-a! Iztriwam $tarpath/$filename........";

unlink("$tarpath/$filename") or print "NE MOGA DA IZTRIA FAILA! $!";

print "\nFaila e iztrit ................................OK!\n";

}

print "Arhiviraneto e uspeshno ................. OK!\n>>>  Lek den\n\n";

if ($notify) {

#&send("Arhiviraneto e uspeshno!!!. Transferirani sa $mat[7] bytes kym bakcup server-a : $ftpserver", "$subj-Arhiviraneto uspeshno");

}



sub send {

if ($notify) {

open MAIL, "|$sendmail -t" or print "Ne moga da otworia Sendmail $!\n";

print MAIL "To: $to\nFrom: $from\nSubject: $_[1]\n\n$_[0]\n\n.\n";

close MAIL;

}

}


По този скрипт имаш работа само по четирите реда горе, за да зададеш коя папка ще се архивира и имена на файловете.

Третият (последен) скрипт го кръсти както искаш. Аз за примера ще го кръстя arhivirane

Цитат
#!/bin/bash

perl /usr/local/backup/arh_mysql.pl


Този скрипт ще изпълнява архивирането. Тъй като искаш да се изпълнява на всеки час, то трябва да добавиш в crontab-а следния ред:
45 * * * * /usr/local/backup/arhivirane
По този начин на всеки час (1:45, 2:45, 3:45 и т.н.), скриптът ще се изпълнява и ще архивира.

Заради дадените кодове, поста ми стана доста дълъг и обясненията ми са що годе постни, така че ако имаш някакъв проблем или нещо не ти е ясно - кажи и ще ти обясня по-добре  '<img'>

edit: Тези скриптове ще правят архиви, които ще се трупат с времето (т.е. първото денонощие ще станат 24, след второто вече ще имаш 48 файла и т.н.), така че е хубаво да сложиш едно скриптче и за чистене на старите архиви. Ето един пример

Цитат
#!/usr/bin/perl                                                                                                                    
                                                                                                                                    
$dir = "/папката/с/архивите";
$days = "2";                                                                                              
                                                                                                                                    
opendir (DIR, "$dir/");                                                                                                            
@FILES = grep(//,readdir(DIR));                                                                                                    
closedir (DIR);                                                                                                                    
                                                                                                                                    
foreach $FILES (@FILES) {                                                                                                          
   if (-M "$dir/$FILES" > $days) {                                                                                                      
         unlink("$dir/$FILES");                                                                                                    
    }                                                                                                                              
}


Сложи го и него в /usr/local/backup (сложи го и на отдалечения сървър, където пращаш копие от архивите), направи го изпълним, кръсти го backup_cleaner и добави този ред в crontab-a
45 1 * * * /usr/local/backup/backup_cleaner
По този начин, всеки ден в 1:45, ще се изтриват всички архиви, които са по-стари от 2 дена.



Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

wasil2007

  • Напреднали
  • *****
  • Публикации: 32
    • Профил
кажете някоя програма за архивиране
« Отговор #3 -: Feb 22, 2007, 15:12 »
много ти благодаря това ще ми сърши добра работа
Активен

growchie

  • Напреднали
  • *****
  • Публикации: 623
    • Профил
кажете някоя програма за архивиране
« Отговор #4 -: Feb 22, 2007, 15:50 »
Май съм срещал в подобни скриптове, че SQL-а трябва да се спира преди архивиране и да се пуска след това.
http://linux-bg.org/cgi-bin....3636577
Тази статия ме вдъхнови за моите скриптове.
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
кажете някоя програма за архивиране
« Отговор #5 -: May 09, 2007, 19:02 »
Не е задължително SQL сървъра да е спрян по време на архивирането. Нека кажем, че е препоръчително. Но има ситуации, в които редовното спиране на SQL сървъра може да доведе до по-голяма вреда, отколкото един счупен архив. Човек си преценя сам за себе си. Ако няма лошо сървъра да бъде спиран по време на архивирането, то достатъчно е да се добавят два реда за целта във файла (в случая) arhivirane. Например:
Примерен код
#!/bin/bash

/etc/init.d/mysql stop
perl /usr/local/backup/arh_mysql.pl
/etc/init.d/mysql start

Ако някой ден се видя в малко повече поредни свободни минути, ще драсна една статия, в която ще опиша нещата подробно и ще разгледам няколко ситуации.
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

NikDaPhreak

  • Напреднали
  • *****
  • Публикации: 37
    • Профил
кажете някоя програма за архивиране
« Отговор #6 -: May 09, 2007, 21:29 »
Не е нужно да се спира MySQL за създаване на копие от базата му. Има една програмка - mysqlhotcopy, която го прави "на живо". Има и вариант, който аз ползвам - казваш на MySQL-а да си запише cache-а на диска и да заключи базата. Копираш файловете с базата и после я отключваш. Работи безотказно.

Have Phun!
NikDaPhreak
Активен