Архивация списаний
коллеги, где-то можно эти скрипты сейчас выкачать? ссылка нерабочая
JAO писал(а): Архив со скриптами: http://jao.passim-service.ru/files/utm52arc.zip
Если кто хочет дать копейку за это творчество, отправляйте на Paypal dmk75@yandex.ru или Яндекс.Деньги 410011373875933
Выкладываю скрипты JAO текстом:
cat utm521_arc_clear_old
cat utm521007_arc
cat utm521_arc_clear_old
Код: Выделить всё
#!/usr/bin/perl
use DBI;
$db_host = 'localhost';
$db_user = 'utm5';
$db_pass = 'пароль от базы';
$db_name = 'UTM5';
$dbh = DBI->connect("DBI:mysql:$db_name:$db_host",$db_user,$db_pass,{ RaiseError => 1}) or die "\nConnection failed...\nError: $DBI::errstr\n";
$sth = $dbh->prepare ("SELECT UNIX_TIMESTAMP(NOW()-INTERVAL 3 YEAR)");
$sth->execute ();
$last_date = ($sth->fetchrow_array ())[0];
undef $sth;
$sth = $dbh->prepare (sprintf ("SELECT table_name FROM archives WHERE end_date<='%s'",$last_date));
$sth->execute ();
@tables = ();
while (@row = $sth->fetchrow_array ())
{ push (@tables,$row[0]);
}
undef $sth;
$dbh->do (sprintf ("DELETE FROM archives WHERE end_date<='%s'",$last_date));
$dbh->do ("OPTIMIZE TABLE archives");
foreach $t (@tables)
{ $dbh->do (sprintf ("DROP TABLE %s",$t));
}
$dbh->disconnect ();
Код: Выделить всё
#!/usr/bin/perl
use DBI;
$db_host = 'localhost';
$db_user = 'utm5';
$db_pass = 'пароль от базы';
$db_name = 'UTM5';
$db_arc_name = 'UTM5arc';
$tbl_count = 7;
@tbl_names = ('discount_transactions_all','discount_transactions_iptraffic_all',
'tel_sessions_log','tel_sessions_detail','dhs_sessions_log','dhs_sessions_detail',
'payment_transactions');
@tbl_types = (1,2,3,4,5,6,7);
@tbl_datefields = ('discount_date','discount_date','recv_date','recv_date','recv_date','recv_date','payment_enter_date');
@tbl_shortnames = ('dta','dti','tsl','tsd','dsl','dsd','ptr');
$dbh = DBI->connect("DBI:mysql:$db_name:$db_host",$db_user,$db_pass,{ RaiseError => 1}) or die "\nConnection failed...\nError: $DBI::errstr\n";
$sth = $dbh->prepare ("SELECT YEAR(NOW())");
$sth->execute ();
$y_end = ($sth->fetchrow_array ())[0];
$sth = $dbh->prepare ("SELECT MONTH(NOW())");
$sth->execute ();
$m_end = ($sth->fetchrow_array ())[0];
$sth = $dbh->prepare (sprintf ("SELECT UNIX_TIMESTAMP('%d-%d-01 0:00:00')",$y_end,$m_end));
$sth->execute ();
$end_date = ($sth->fetchrow_array ())[0];
$m_start = $m_end;
$y_start = $y_end;
$m_start--;
if ($m_start == 0)
{ $m_start = 12;
$y_start--;
}
$sth = $dbh->prepare (sprintf ("SELECT UNIX_TIMESTAMP('%d-%d-01 0:00:00')",$y_start,$m_start));
$sth->execute ();
$start_date = ($sth->fetchrow_array ())[0];
print "Processing current month\n";
for ($j = 0;$j < $tbl_count;$j++)
{ $tbl_orig = $tbl_names[$j];
$tbl_shortname = $tbl_shortnames[$j];
$tbl_bkp = 'arc_' . $tbl_shortname;
$datefield = $tbl_datefields[$j];
$dbh->do (sprintf ("ALTER TABLE %s RENAME TO %s",$tbl_orig,$tbl_bkp));
$dbh->do (sprintf ("CREATE TABLE %s LIKE %s",$tbl_orig,$tbl_bkp));
$dbh->do (sprintf ("INSERT INTO %s SELECT * FROM %s WHERE %s>=%d",$tbl_orig,$tbl_bkp,$datefield,$end_date));
$dbh->do (sprintf ("DELETE FROM %s WHERE %s>=%d",$tbl_bkp,$datefield,$end_date));
$dbh->do (sprintf ("ALTER TABLE %s ENGINE=MyISAM",$tbl_bkp));
}
$sth = $dbh->prepare ("SELECT COUNT(*) FROM archives");
$sth->execute ();
@row = $sth->fetchrow_array ();
if ($row[0] > 0)
{ undef $row;
$sth = $dbh->prepare ("SELECT MAX(archive_id) FROM archives");
$sth->execute ();
@row = $sth->fetchrow_array ();
$arc_id = $row[0] + 1;
undef $row;
}
else
{ $arc_id = 1;
}
$stop = 0;
while ($stop == 0)
{ $suffix = sprintf ("%04d_%02d",$y_start,$m_start);
$rows_count = 0;
for ($j = 0;$j < $tbl_count;$j++)
{ $tbl_shortname = $tbl_shortnames[$j];
$tbl_bkp = sprintf ("arc_%s",$tbl_shortname);
$datefield = $tbl_datefields[$j];
$sth = $dbh->prepare (sprintf ("SELECT COUNT(*) FROM %s WHERE %s>=%d AND %s<%d",$tbl_bkp,$datefield,$start_date,$datefield,$end_date));
$sth->execute ();
$rows_count += ($sth->fetchrow_array ())[0];
}
if ($rows_count > 0)
{ printf ("Processing period from %02d-%04d to %02d-%04d\n",$m_start,$y_start,$m_end,$y_end);
for ($j = 0;$j < $tbl_count;$j++)
{ $tbl_type = $tbl_types[$j];
$datefield = $tbl_datefields[$j];
$tbl_shortname = $tbl_shortnames[$j];
$tbl_bkp = sprintf ("arc_%s",$tbl_shortname);
$full_arcname = sprintf ("%s.%s_%s",$db_arc_name,$tbl_shortname,$suffix);
$dbh->do (sprintf ("CREATE TABLE %s LIKE %s",$full_arcname,$tbl_bkp));
$dbh->do (sprintf ("ALTER TABLE %s ENGINE=MyISAM",$full_arcname));
$dbh->do (sprintf ("INSERT INTO %s SELECT * FROM %s WHERE %s>=%d AND %s<%d",$full_arcname,$tbl_bkp,$datefield,$start_date,$datefield,$end_date));
$dbh->do (sprintf ("INSERT INTO archives (archive_id,table_type,table_name,start_date,end_date) VALUES ('%d','%s','%s','%d','%d')",$arc_id,$tbl_type,$full_arcname,$start_date,$end_date-1));
}
$m_start--;
if ($m_start == 0)
{ $m_start = 12;
$y_start--;
}
$sth = $dbh->prepare (sprintf ("SELECT UNIX_TIMESTAMP('%d-%d-01 0:00:00')",$y_start,$m_start));
$sth->execute ();
$start_date = ($sth->fetchrow_array ())[0];
$m_end--;
if ($m_end == 0)
{ $m_end = 12;
$y_end--;
}
$sth = $dbh->prepare (sprintf ("SELECT UNIX_TIMESTAMP('%d-%d-01 0:00:00')",$y_end,$m_end));
$sth->execute ();
$end_date = ($sth->fetchrow_array ())[0];
$arc_id++;
}
else
{ $stop = 1;
}
}
undef $sth;
for ($j = 0;$j < $tbl_count;$j++)
{ $tbl_shortname = $tbl_shortnames[$j];
$tbl_bkp = sprintf ("arc_%s",$tbl_shortname);
$dbh->do (sprintf ("DROP TABLE %s",$tbl_bkp));
}
$dbh->disconnect ();
Насколько я понял каждый скрипт пригоден исключительно для своей версии UTM.
У нас стоит 5.3-002.
perl я не знаю, поэтому самостоятельно, выложенные выше скрипты, под 5.3-002 переписать не смогу.
У нас по всем признакам раньше таблицы архивировалась в эту же базу, а по скриптам вреде они архивируются в отдельную базу UTM5arc. Как правильно?
У нас стоит 5.3-002.
perl я не знаю, поэтому самостоятельно, выложенные выше скрипты, под 5.3-002 переписать не смогу.
У нас по всем признакам раньше таблицы архивировалась в эту же базу, а по скриптам вреде они архивируются в отдельную базу UTM5arc. Как правильно?
Наверно, просто запускать по крону раз в месяц, пока эти опции там не реализуют. И неким скриптом вычищать старое из базы, чтоб не зарастало. Я писал скрипты архивации, и согласно одному сообщению от человека, ими пользующегося, они работают и на версии 5.3. Хотя не должны. По всей видимости, он обновился с версии 5.2, а не ставил 5.3 с нуля. В этом случае в таблицах остаются поля, на которые опирается скрипт архивации, и он работает. При установке с нуля этих полей в таблицах нет, соответственно скрипт работать не обязан и не будет.
Почему не стал писать это под версию 5.3? Две причины.
1) слишком много изменений в таблицах было произведено в процессе написания скрипта ("помедленнее, я записываю")
2) в версии 5.3 был написан штатный бинарник для архивации, а раз так, то моя миссия окончена
Почему не стал писать это под версию 5.3? Две причины.
1) слишком много изменений в таблицах было произведено в процессе написания скрипта ("помедленнее, я записываю")
2) в версии 5.3 был написан штатный бинарник для архивации, а раз так, то моя миссия окончена