Архивация списаний

Форум для размещения материалов по реализации различных схем использования ПО, решению частых проблем и предупреждению частых ошибок
JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

В процессе изготовления скрипт архивации для UTM 5.3

Cramac
Сообщения: 454
Зарегистрирован: Сб июл 01, 2006 17:59

Сообщение Cramac »

всем привет. А никто не пробовал делать через партицию таблиц?

Point
Сообщения: 241
Зарегистрирован: Вт ноя 23, 2010 15:42

Сообщение Point »

JAO писал(а):В процессе изготовления скрипт архивации для UTM 5.3
Есть ли продвижения?

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Есть. Но они не понадобились. В связи с появлением в UTM 5.3-003 встроенного функционала архивации я прекращаю дальнейшую работу в этом направлении. Спасибо всем, кто принимал участие в разработке и тестировании. Скрипты для версий 5.2 по-прежнему доступны для скачивания.

chipset
Сообщения: 6
Зарегистрирован: Ср окт 01, 2014 12:38

Сообщение chipset »

JAO писал(а):
2) переписанные скрипты архивации, умеющие создавать архив с нуля

utm521007_arc
Не подскажите возможно ли его выполнение при работающем биллинге? Не хотелось бы его отключать просто.

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Возможно, у меня работает по сей день, запускается по крону раз в месяц. Но лучше перед первым запуском сделать резервную копию базы. Потому что то, что работает у меня, не обязано работать у других, даже абсолютно одинаковые скрипты.

chipset
Сообщения: 6
Зарегистрирован: Ср окт 01, 2014 12:38

Сообщение chipset »

Бекап базы снимаю за каждый день. Надо бы просто ее уменьшить сильно тяжелая стала.

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

У меня архив за три последних года, всё, что старше, чистится по крону отдельным скриптом. Кстати, в архиве, который я выложил, этот скрипт есть. Его надо использовать вместе со скриптом архивации.

ps/2
Сообщения: 3
Зарегистрирован: Вт апр 19, 2016 20:41

Сообщение ps/2 »

коллеги, где-то можно эти скрипты сейчас выкачать? ссылка нерабочая :(
JAO писал(а): Архив со скриптами: http://jao.passim-service.ru/files/utm52arc.zip

Если кто хочет дать копейку за это творчество, отправляйте на Paypal dmk75@yandex.ru или Яндекс.Деньги 410011373875933

dutyadmin
Сообщения: 2
Зарегистрирован: Чт сен 25, 2014 14:04

Сообщение dutyadmin »

Поддержу вопрос, если у кого остались скрипты - киньте пожалуйста в личку!

Rico-X
Сообщения: 164
Зарегистрирован: Вт окт 25, 2011 12:04

Сообщение Rico-X »

Выкладываю скрипты JAO текстом:
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 &#40;sprintf &#40;"SELECT table_name FROM archives WHERE end_date<='%s'",$last_date&#41;&#41;;
$sth->execute &#40;&#41;;
@tables = &#40;&#41;;
while &#40;@row = $sth->fetchrow_array &#40;&#41;&#41;
&#123; push &#40;@tables,$row&#91;0&#93;&#41;;
&#125;
undef $sth;
$dbh->do &#40;sprintf &#40;"DELETE FROM archives WHERE end_date<='%s'",$last_date&#41;&#41;;
$dbh->do &#40;"OPTIMIZE TABLE archives"&#41;;
foreach $t &#40;@tables&#41;
&#123; $dbh->do &#40;sprintf &#40;"DROP TABLE %s",$t&#41;&#41;;
&#125;
$dbh->disconnect &#40;&#41;;
cat utm521007_arc

Код: Выделить всё

#!/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 = &#40;'discount_transactions_all','discount_transactions_iptraffic_all',
	      'tel_sessions_log','tel_sessions_detail','dhs_sessions_log','dhs_sessions_detail',
	      'payment_transactions'&#41;;
@tbl_types = &#40;1,2,3,4,5,6,7&#41;;
@tbl_datefields = &#40;'discount_date','discount_date','recv_date','recv_date','recv_date','recv_date','payment_enter_date'&#41;;
@tbl_shortnames = &#40;'dta','dti','tsl','tsd','dsl','dsd','ptr'&#41;;

$dbh = DBI->connect&#40;"DBI&#58;mysql&#58;$db_name&#58;$db_host",$db_user,$db_pass,&#123; RaiseError => 1&#125;&#41; or die "\nConnection failed...\nError&#58; $DBI&#58;&#58;errstr\n";
$sth = $dbh->prepare &#40;"SELECT YEAR&#40;NOW&#40;&#41;&#41;"&#41;;
$sth->execute &#40;&#41;;
$y_end = &#40;$sth->fetchrow_array &#40;&#41;&#41;&#91;0&#93;;
$sth = $dbh->prepare &#40;"SELECT MONTH&#40;NOW&#40;&#41;&#41;"&#41;;
$sth->execute &#40;&#41;;
$m_end = &#40;$sth->fetchrow_array &#40;&#41;&#41;&#91;0&#93;;
$sth = $dbh->prepare &#40;sprintf &#40;"SELECT UNIX_TIMESTAMP&#40;'%d-%d-01 0&#58;00&#58;00'&#41;",$y_end,$m_end&#41;&#41;;
$sth->execute &#40;&#41;;
$end_date = &#40;$sth->fetchrow_array &#40;&#41;&#41;&#91;0&#93;;
$m_start = $m_end;
$y_start = $y_end;
$m_start--;
if &#40;$m_start == 0&#41;
&#123; $m_start = 12;
  $y_start--;
&#125;
$sth = $dbh->prepare &#40;sprintf &#40;"SELECT UNIX_TIMESTAMP&#40;'%d-%d-01 0&#58;00&#58;00'&#41;",$y_start,$m_start&#41;&#41;;
$sth->execute &#40;&#41;;
$start_date = &#40;$sth->fetchrow_array &#40;&#41;&#41;&#91;0&#93;;
print "Processing current month\n";
for &#40;$j = 0;$j < $tbl_count;$j++&#41;
&#123; $tbl_orig = $tbl_names&#91;$j&#93;;
  $tbl_shortname = $tbl_shortnames&#91;$j&#93;;
  $tbl_bkp = 'arc_' . $tbl_shortname;
  $datefield = $tbl_datefields&#91;$j&#93;;
  $dbh->do &#40;sprintf &#40;"ALTER TABLE %s RENAME TO %s",$tbl_orig,$tbl_bkp&#41;&#41;;
  $dbh->do &#40;sprintf &#40;"CREATE TABLE %s LIKE %s",$tbl_orig,$tbl_bkp&#41;&#41;;
  $dbh->do &#40;sprintf &#40;"INSERT INTO %s SELECT * FROM %s WHERE %s>=%d",$tbl_orig,$tbl_bkp,$datefield,$end_date&#41;&#41;;
  $dbh->do &#40;sprintf &#40;"DELETE FROM %s WHERE %s>=%d",$tbl_bkp,$datefield,$end_date&#41;&#41;;
  $dbh->do &#40;sprintf &#40;"ALTER TABLE %s ENGINE=MyISAM",$tbl_bkp&#41;&#41;;
&#125;
$sth = $dbh->prepare &#40;"SELECT COUNT&#40;*&#41; FROM archives"&#41;;
$sth->execute &#40;&#41;;
@row = $sth->fetchrow_array &#40;&#41;;
if &#40;$row&#91;0&#93; > 0&#41;
&#123; undef $row;
  $sth = $dbh->prepare &#40;"SELECT MAX&#40;archive_id&#41; FROM archives"&#41;;
  $sth->execute &#40;&#41;;
  @row = $sth->fetchrow_array &#40;&#41;;
  $arc_id = $row&#91;0&#93; + 1;
  undef $row;
&#125;
else
&#123; $arc_id = 1;
&#125;
$stop = 0;
while &#40;$stop == 0&#41;
&#123; $suffix = sprintf &#40;"%04d_%02d",$y_start,$m_start&#41;;
  $rows_count = 0;
  for &#40;$j = 0;$j < $tbl_count;$j++&#41;
  &#123; $tbl_shortname = $tbl_shortnames&#91;$j&#93;;
    $tbl_bkp = sprintf &#40;"arc_%s",$tbl_shortname&#41;;
    $datefield = $tbl_datefields&#91;$j&#93;;
    $sth = $dbh->prepare &#40;sprintf &#40;"SELECT COUNT&#40;*&#41; FROM %s WHERE %s>=%d AND %s<%d",$tbl_bkp,$datefield,$start_date,$datefield,$end_date&#41;&#41;;
    $sth->execute &#40;&#41;;
    $rows_count += &#40;$sth->fetchrow_array &#40;&#41;&#41;&#91;0&#93;;
  &#125;
  if &#40;$rows_count > 0&#41;
  &#123; printf &#40;"Processing period from %02d-%04d to %02d-%04d\n",$m_start,$y_start,$m_end,$y_end&#41;;
    for &#40;$j = 0;$j < $tbl_count;$j++&#41;
    &#123; $tbl_type = $tbl_types&#91;$j&#93;;
      $datefield = $tbl_datefields&#91;$j&#93;;
      $tbl_shortname = $tbl_shortnames&#91;$j&#93;;
      $tbl_bkp = sprintf &#40;"arc_%s",$tbl_shortname&#41;;
      $full_arcname = sprintf &#40;"%s.%s_%s",$db_arc_name,$tbl_shortname,$suffix&#41;;
      $dbh->do &#40;sprintf &#40;"CREATE TABLE %s LIKE %s",$full_arcname,$tbl_bkp&#41;&#41;;
      $dbh->do &#40;sprintf &#40;"ALTER TABLE %s ENGINE=MyISAM",$full_arcname&#41;&#41;;
      $dbh->do &#40;sprintf &#40;"INSERT INTO %s SELECT * FROM %s WHERE %s>=%d AND %s<%d",$full_arcname,$tbl_bkp,$datefield,$start_date,$datefield,$end_date&#41;&#41;;
      $dbh->do &#40;sprintf &#40;"INSERT INTO archives &#40;archive_id,table_type,table_name,start_date,end_date&#41; VALUES &#40;'%d','%s','%s','%d','%d'&#41;",$arc_id,$tbl_type,$full_arcname,$start_date,$end_date-1&#41;&#41;;
    &#125;
    $m_start--;
    if &#40;$m_start == 0&#41;
    &#123; $m_start = 12;
      $y_start--;
    &#125;
    $sth = $dbh->prepare &#40;sprintf &#40;"SELECT UNIX_TIMESTAMP&#40;'%d-%d-01 0&#58;00&#58;00'&#41;",$y_start,$m_start&#41;&#41;;
    $sth->execute &#40;&#41;;
    $start_date = &#40;$sth->fetchrow_array &#40;&#41;&#41;&#91;0&#93;;
    $m_end--;
    if &#40;$m_end == 0&#41;
    &#123; $m_end = 12;
      $y_end--;
    &#125;
    $sth = $dbh->prepare &#40;sprintf &#40;"SELECT UNIX_TIMESTAMP&#40;'%d-%d-01 0&#58;00&#58;00'&#41;",$y_end,$m_end&#41;&#41;;
    $sth->execute &#40;&#41;;
    $end_date = &#40;$sth->fetchrow_array &#40;&#41;&#41;&#91;0&#93;;
    $arc_id++;
  &#125;
  else
  &#123; $stop = 1;
  &#125;
&#125;
undef $sth;
for &#40;$j = 0;$j < $tbl_count;$j++&#41;
&#123; $tbl_shortname = $tbl_shortnames&#91;$j&#93;;
  $tbl_bkp = sprintf &#40;"arc_%s",$tbl_shortname&#41;;
  $dbh->do &#40;sprintf &#40;"DROP TABLE %s",$tbl_bkp&#41;&#41;;
&#125;
$dbh->disconnect &#40;&#41;;

Iskatel
Сообщения: 19
Зарегистрирован: Пт апр 15, 2016 10:08

Сообщение Iskatel »

Насколько я понял каждый скрипт пригоден исключительно для своей версии UTM.
У нас стоит 5.3-002.
perl я не знаю, поэтому самостоятельно, выложенные выше скрипты, под 5.3-002 переписать не смогу.
У нас по всем признакам раньше таблицы архивировалась в эту же базу, а по скриптам вреде они архивируются в отдельную базу UTM5arc. Как правильно?

Аватара пользователя
торопыга
Сообщения: 61
Зарегистрирован: Пн ноя 01, 2010 12:06

Сообщение торопыга »

UP Так все таки кто-нибудь делал архивацию на 5-3.002, можно ли старые скрипты использовать или может поделитесь новыми?

Vovik
Сообщения: 162
Зарегистрирован: Пт янв 21, 2005 06:18
Откуда: Omsk city

Сообщение Vovik »

Как указать сроки архивирования в 5.3.003?
а то подчистую архивирует
архивирую стандартными встроенными средствами

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Наверно, просто запускать по крону раз в месяц, пока эти опции там не реализуют. И неким скриптом вычищать старое из базы, чтоб не зарастало. Я писал скрипты архивации, и согласно одному сообщению от человека, ими пользующегося, они работают и на версии 5.3. Хотя не должны. По всей видимости, он обновился с версии 5.2, а не ставил 5.3 с нуля. В этом случае в таблицах остаются поля, на которые опирается скрипт архивации, и он работает. При установке с нуля этих полей в таблицах нет, соответственно скрипт работать не обязан и не будет.

Почему не стал писать это под версию 5.3? Две причины.

1) слишком много изменений в таблицах было произведено в процессе написания скрипта ("помедленнее, я записываю")
2) в версии 5.3 был написан штатный бинарник для архивации, а раз так, то моя миссия окончена

Ответить