Здравсвуйте начинающие и другие администраторы unix.
Опробовав кучу решений для создания бэкапов (платных и не платных) пришел к выводу, что да они хороши, но не всегда все выглядит радужно. Поэтому .. поседев и покумекав написал небольшой скрипт для создания backupов.
#!/usr/bin/perl
use Class::Date qw(:errors date localdate gmdate now -DateParse);
use DBI;
use vars qw(%userdata *fname $admin %legend);
use Sys::Hostname::FQDN qw(
asciihostinfo
gethostinfo
inet_ntoa
inet_aton
fqdn
short
);
$host=short();
# Здесь описано коннет к базе данных сферы для сравнения юзеров в Passwd и теми, что есть в базе данных
$dbname = "hsphere";
$username = "xxxxxx";
$dbhost="host_postgres";
$password="xxxxx";
$dbport = "5432";
$dboptions = "-e";
$dbtty = "ansi";
#
$myhost="mysql_host";
$myusername="xxxxx";
$mypassword="xxxxxx";
$options="--compress -a --allow-keywords --add-drop-database --quote-names --opt";
#
$dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;;port=$dbport;options=$dboptions;tty=$dbtty","$username","$password",
{PrintError => 0});
if ($DBI::err != 0) {
print $DBI::errstr . "\n";
exit($DBI::err);
}
$date = new Class::Date [$year,$month,$day,$hour,$min,$sec];
$date=now;
my $dt=$date->year."-".$date->month."-".$date->day;
#--------------------------------------------------------------------------------------------------------------------------------------
sub fetchUsers {
while (my ($user, $uid, $home, $shell) = (getpwent())[0,2,7,8]) {
# if you have a UID smaller than 500, skip it
next if ($uid < 500);
# skip specific users we don't want touched
next if ($user =~ m/cpanel/);
# build their data reference and add them
$userdata{$user}->{'home'} = $home;
}
}
#--------------------------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------------------------
sub findScripts {
foreach my $user (keys(%userdata)) {
my $webdir = $userdata{$user}->{'home'};
$sth = $dbh->prepare("SELECT username FROM users WHERE username= '$user' or username='".ucfirst($user)."' or username='".uc($user)."' ");
$sth->execute;
while ( @row = $sth->fetchrow_array ) {
push (@newusers,$row[0]);
}
}
create_backups();
}
#--------------------------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------------------------
sub create_backups()
{
foreach $n_user (@newusers)
{
next if $n_user eq "kreffakg";
#now make a backup
#create backup folder
$backup_folder="/hsphere/local/home/".lcfirst($n_user);
$backup_folder1="/backups/$host/backups/".lcfirst($n_user);
system ("mkdir -p $backup_folder1");
$backup_mysql=$backup_folder1."/mysql";
if (-d $backup_mysql)
{
# print "we have this folder";
}
else
{
mkdir ($backup_mysql);
}
if (-d $backup_folder1)
{
# print "we have this folder";
}
else
{
mkdir ($backup_folder);
}
remove_it("$backup_folder1");
print "\n";
print "Create backup for user $n_user\n";
system ("cd $backup_folder; nice -n 15 tar --numeric-owner -czf $backup_folder1/$n_user-$dt.tar.gz ./ -X /root/exclude");
print "Done.\n";
print "Create mysql DB backup for user $n_user\n";
backup_mysql($n_user,$backup_mysql);
}
}
#--------------------------------------------------------------------------------------------------------------------------------------
#----------------------------------------------------------------
sub remove_it ($rem_dir)
{
my $rm_dir=$_[0];
`find $rm_dir -type f -ctime +2 -exec rm -f '{}' ';'`;
}
#---------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------------------------
sub backup_mysql ($n_user,$mysqlback) {
my $usr=$_[0];
my $dir=$_[1];
if (-d "$dir")
{
# print "we have this folder";
}
else
{
mkdir ("$dir");
}
#get size of str usr
if (length($usr)>6)
{
$usr=substr($usr,0,7);
}
#get list of DBs
$sth1 = $dbh->prepare("SELECT db_name FROM mysqldb WHERE db_name like '$usr%' or db_name like '".ucfirst($usr)."%'");
$sth1->execute;
while ( @row1 = $sth1->fetchrow_array ) {
system ("/usr/bin/mysqldump -u $myusername -p$mypassword $options $row1[0] -h $myhost > $dir/$row1[0]-$dt.sql");
}
}
print "Fetching users... \r\n";
&fetchUsers;
print "Start Backups....\r\n";
&findScripts;
Работает на ура, создает полные бэкапы и удаляет бэкапы старше 3 дней
Сохраняете данный скрипт в какой-либо директории и добавляете в крон задачу. Примерно так:
0 0 * * * /root/backhups.pl
И все. Теперь в 00:00 скрипт будет запускаться и делать свою работу.