Правка!!! \\ == Скрипт для архивации списаний Вариант 1 == Можно добавить "шаблоны" для новых таблиц(причесанных) по структуре. В текущем варианте скрипт не зависит от изменений структуры, т.к. переносит полностью всю структуру таблицы с текущей(рабочей). #!/usr/bin/perl -w use DBI; use strict; my $dbh; my $sth; my $ts; my @res; my $tmp; # Обязательно сменить my $dbuser=''; my $dbpass=''; my $dbhost=''; # Дальше лучше не менять $dbh=DBI->connect("DBI:mysql:UTM5:$dbhost", $dbuser, $dbpass, {RaiseError=>1}) or die "\nConnection failed...\nError: $DBI::errstr\n"; $sth=$dbh->prepare("select unix_timestamp(concat(year(now()),'-',month(now()),'-01 00:00:00'))"); $sth->execute(); $ts=($sth->fetchrow_array)[0]; $dbh->do("rename table discount_transactions_all to UTM5H.discount_transactions_all_$ts"); $dbh->do("rename table discount_transactions_iptraffic_all to UTM5H.discount_transactions_iptraffic_all_$ts"); $sth=$dbh->prepare("show create table UTM5H.discount_transactions_iptraffic_all_$ts"); $sth->execute(); if (@res=$sth->fetchrow_array) { $tmp= $res[1]; $tmp=~ s/UTM5H\.discount_transactions_iptraffic_all_$ts/discount_transactions_iptraffic_all/g; }; $dbh->do($tmp); $sth=$dbh->prepare("show create table UTM5H.discount_transactions_all_$ts"); $sth->execute(); if (@res=$sth->fetchrow_array) { $tmp= $res[1]; $tmp=~ s/UTM5H\.discount_transactions_all_$ts/discount_transactions_all/g; }; $dbh->do($tmp); $dbh->do("insert into discount_transactions_all select * from UTM5H.discount_transactions_all_$ts where discount_date>=$ts"); $dbh->do("insert into discount_transactions_iptraffic_all select * from UTM5H.discount_transactions_iptraffic_all_$ts where discount_date>=$ts"); $dbh->do("delete from UTM5H.discount_transactions_all_$ts where discount_date>=$ts"); $dbh->do("delete from UTM5H.discount_transactions_iptraffic_all_$ts where discount_date>=$ts"); $sth=$dbh->prepare("select max(archive_id) from archives"); $sth->execute(); $tmp=($sth->fetchrow_array)[0]; $tmp+=1; $dbh->do("insert into archives(archive_id,table_type,table_name,start_date,end_date) SELECT $tmp,1,".$dbh->quote("UTM5H.discount_transactions_all_$ts").",min(discount_date),max(discount_date) from UTM5H.discount_transactions_all_$ts"); $dbh->do("insert into archives(archive_id,table_type,table_name,start_date,end_date) SELECT $tmp,2,".$dbh->quote("UTM5H.discount_transactions_iptraffic_all_$ts").",min(discount_date),max(discount_date) from UTM5H.discount_transactions_iptraffic_all_$ts"); == Скрипт для архивации списаний Вариант 2 == #!/usr/bin/perl use DBI; sub move_table_tmp; sub copy_delta; sub move_to_archiv; $ArchiveDBname = "UTM5H"; $DBhost = "localhost"; $DBname = "UTM5"; $Login = "login"; $Password = "password"; $hc_locks = "discount_transactions_all WRITE, discount_transactions_iptraffic_all WRITE, dhs_sessions_log WRITE, messages WRITE"; $dbh = DBI->connect( "DBI:mysql:$DBname:$DBhost", $Login, $Password, {RaiseError=>1} ) or die "\nConnection failed...\nError: $DBI::errstr\n"; #get end_date of period to archive $sth = $dbh->prepare( "select UNIX_TIMESTAMP(concat(YEAR(now()),'-',MONTH(now()),'-1 0:0:0')),from_unixtime(UNIX_TIMESTAMP(DATE_ADD(now(), INTERVAL -1 MONTH)),'%Y%m')" ); $sth->execute() or die "DB Error: $DBI::errstr\n"; ($enddate,$date_for_name)=$sth->fetchrow_array; print "END DATE for archive: $enddate ,$date_for_name)\n"; ############################################ # MAIN START ############################################ ############################################ # TRANSACTION ############################################ $dbh->do("USE $DBname"); $dbh->do("LOCK TABLES $hc_locks"); $dbh->do("START TRANSACTION"); &move_table_tmp ("discount_transactions_all"); &move_table_tmp ("discount_transactions_iptraffic_all"); &move_table_tmp ("dhs_sessions_log"); &move_table_tmp ("messages"); $dbh->do("UNLOCK TABLES"); $dbh->do("COMMIT"); ############################################ # END TRANSACTION ############################################ ############################################ # Copy to archive ############################################ ©_delta("discount_transactions_all", "discount_date", $enddate); ©_delta("discount_transactions_iptraffic_all", "discount_date", $enddate); ©_delta("messages", "send_date", $enddate); ©_delta("dhs_sessions_log", "recv_date", $enddate); &move_to_archiv($ArchiveDBname, "dhs_sessions_log", "_$date_for_name", "recv_date"); &move_to_archiv($ArchiveDBname, "messages", "_$date_for_name", "send_date"); &move_to_archiv($ArchiveDBname, "discount_transactions_all", "_$date_for_name", "discount_date"); &move_to_archiv($ArchiveDBname, "discount_transactions_iptraffic_all", "_$date_for_name", "discount_date"); ############################################ # END Copy to archive ############################################ $sth->finish; $dbh->disconnect; ############################################ # MAIN END ############################################ sub move_table_tmp { my $t_name = shift; my $SQL = "SHOW CREATE TABLE $t_name"; $sth = $dbh->prepare($SQL); $sth->execute() or die "DB Error: $DBI::errstr\n"; my ($t_name,$t_conf_sql)=$sth->fetchrow_array; print "Movie $t_name to $t_name" . "_bak\n\n"; print "SQL: $t_conf_sql\n\n"; $SQL = "RENAME TABLE `".$DBname."`.`".$t_name."` TO `".$DBname."`.`".$t_name."_bak`"; $dbh->do($SQL); $dbh->do($t_conf_sql); } sub copy_delta { my $t_name = shift; my $t_col = shift; my $e_date = shift; print "Copy delta: $t_name\n"; $dbh->do("INSERT INTO $t_name SELECT * FROM $t_name"."_bak WHERE $t_col>=$e_date"); $dbh->do("DELETE FROM $t_name"."_bak WHERE $t_col>=$e_date"); } sub move_to_archiv { my $a_DB_name = shift; my $t_name = shift; my $t_prefix = shift; my $t_col = shift; my $a_t_name = $a_DB_name . "." . $t_name.$t_prefix; print "Copy: $t_name to archive $a_t_name\n"; $dbh->do("RENAME TABLE $t_name"."_bak TO $a_t_name"); $sth = $dbh->prepare("SELECT min($t_col),max($t_col) from $a_t_name"); $sth -> execute() or die "DB Error: $DBI::errstr\n"; my ($start_date,$end_date)=$sth->fetchrow_array; $sth = $dbh->prepare("SELECT archive_id,table_type FROM archives WHERE table_name LIKE '$a_DB_name.$t_name%' ORDER BY archive_id DESC LIMIT 0,1"); $sth -> execute() or die "DB Error: $DBI::errstr\n"; my ($archive_id,$table_type)=$sth->fetchrow_array; $dbh->do("INSERT INTO archives (archive_id,table_type,table_name,start_date,end_date) VALUES ($archive_id+1,'$table_type','$a_t_name',$start_date,$end_date)"); }