Архивирование списаний

Технические вопросы по UTM 5.0
Ответить
Gezm0
Сообщения: 95
Зарегистрирован: Вт июн 24, 2008 22:00

Архивирование списаний

Сообщение Gezm0 »

Кто-нибудь уже писал скрипты для архивирования списаний с помощью механизма, который появился в 5.2.1–006? Очень хотелось бы посмотреть)

Borisov_a
Сообщения: 26
Зарегистрирован: Сб июн 21, 2008 01:11

Re: Архивирование списаний

Сообщение Borisov_a »

Gezm0 писал(а):Кто-нибудь уже писал скрипты для архивирования списаний с помощью механизма, который появился в 5.2.1–006? Очень хотелось бы посмотреть)
Вопросы, касательно способов манипуляции данными средствами СУБД останутся без ответа по существу, в том числе и если они будут заданы в hotline. Когда мы были у них в офисе, они за небольшую сумму(30000 русских рублей) были готовы предоставить скриптик, правда без каких либо гарантий и только на конкретную версию -005.
На что мы решили: DELETE FROM ... рулит. :icon_2:

mikkey finn
Сообщения: 1612
Зарегистрирован: Пт ноя 10, 2006 15:23

Сообщение mikkey finn »

перед делетом лучше в доп табличку скопировать

Gezm0
Сообщения: 95
Зарегистрирован: Вт июн 24, 2008 22:00

Сообщение Gezm0 »

Ход мысли ясен. Будем делать сами)

cooler85
Сообщения: 31
Зарегистрирован: Чт июл 19, 2007 11:44
Откуда: Ryazan

Сообщение cooler85 »

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

#!/usr/local/bin/perl

use IO::Handle;
use DBI;

  $dbh = DBI->connect("DBI:mysql:UTM5:localhost", "user", "yourpass", {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'));");
  $sth -> execute();
  $enddate=$sth->fetchrow_array;

  ############################################
  #Prepare to archive discount_transactions_all
  print "Prepare to archive discount_transactions_all \n";

  #get last archive id
  $sth = $dbh->prepare("select max(archive_id) from archives where table_type=1");
  $sth -> execute();
  $archiveid_type1=$sth->fetchrow_array;    $archiveid_type1++;
  print "Last archive id=".$archiveid_type1."\n";

  #get start date to archive
  $sth = $dbh->prepare("select min(discount_date) from discount_transactions_all");
  $sth -> execute();
  $start_date=$sth->fetchrow_array;


  print "Start date of  archive period : ".$start_date."\n";
  print "End date of  archive period : ".$enddate."\n";

  $arch_table_name="discount_transactions_all_".$enddate;
  print "Name of new archive table : ".$arch_table_name."\n";


  #Create new archive table
  $sth =  $dbh->prepare("CREATE TABLE ".$arch_table_name." (
  id int(11) NOT NULL auto_increment,
  account_id int(11) default NULL,
  incoming_rest double default NULL,
  outgoing_rest double default NULL,
  discount double default NULL,
  discount_without_tax double default NULL,
  discount_with_tax double default NULL,
  service_id int(11) default NULL,
  service_type int(11) default NULL,
  discount_period_id int(11) default NULL,
  slink_id int(11) default NULL,
  discount_date int(11) default NULL,
  `comment` varchar(255) collate utf8_unicode_ci default NULL,
  dealer_transaction_id int(11) default NULL,
  dealer_payment_transaction_id int(11) default NULL,
  is_canceled int(11) default '0',
  cancel_id int(11) default '0',
  charge_type int(11) NOT NULL default '0',
  PRIMARY KEY  (id),
  KEY first_disc (discount_date),
  KEY first_disc1 (account_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;");
  $sth -> execute();

  #prepare data to move in new table
  print "Copy transactions to new archive table....\n";
  $sth =  $dbh->prepare&#40;"INSERT INTO ".$arch_table_name." SELECT * FROM discount_transactions_all where discount_date<".$enddate&#41;;
  $sth -> execute&#40;&#41;;

  print "Delete transactions from discount_transactions_all....\n";
  $sth =  $dbh->prepare&#40;"DELETE FROM discount_transactions_all USING discount_transactions_all
                         INNER JOIN ".$arch_table_name." ON discount_transactions_all.id =".$arch_table_name.".id;"&#41;;
  $sth -> execute&#40;&#41;;

  $sth =  $dbh->prepare&#40;"SELECT min&#40;discount_date&#41;,max&#40;discount_date&#41; from ".$arch_table_name&#41;;
  $sth -> execute&#40;&#41;;
  &#40;$start_date,$end_date&#41;=$sth->fetchrow_array;
  $sth =  $dbh->prepare&#40;"INSERT INTO archives &#40;archive_id,table_type,table_name,
                        start_date,end_date&#41; VALUES &#40;".$archiveid_type1.",1,'".$arch_table_name."',".$start_date.",".$end_date."&#41;;"&#41;;
  $sth -> execute&#40;&#41;;

  ############################################
  #Prepare to archive discount_transactions_iptraffic_all
  print "\n\nPrepare to archive discount_transactions_iptraffic_all \n";

  #get last archive id
  $sth = $dbh->prepare&#40;"select max&#40;archive_id&#41; from archives where table_type=2"&#41;;
  $sth -> execute&#40;&#41;;
  $archiveid_type2=$sth->fetchrow_array;    $archiveid_type2++;
  print "Last archive id=".$archiveid_type2."\n";

  #get start date to archive
  $sth = $dbh->prepare&#40;"select min&#40;discount_date&#41; from discount_transactions_iptraffic_all"&#41;;
  $sth -> execute&#40;&#41;;
  $start_date=$sth->fetchrow_array;

  print "Start date of  archive period &#58; ".$start_date."\n";
  print "End date of  archive period &#58; ".$enddate."\n";

  $arch_table_name="discount_transactions_iptraffic_all_".$enddate;
  print "Name of new archive table &#58; ".$arch_table_name."\n";


  #Create new archive table
  $sth =  $dbh->prepare&#40;"CREATE TABLE ".$arch_table_name." &#40;
  id int&#40;11&#41; NOT NULL auto_increment,
  account_id int&#40;11&#41; default NULL,
  discount double default NULL,
  discount_with_tax double default NULL,
  service_id int&#40;11&#41; default NULL,
  discount_period_id int&#40;11&#41; default NULL,
  slink_id int&#40;11&#41; default NULL,
  discount_date int&#40;11&#41; default NULL,
  discount_date_hour int&#40;11&#41; default NULL,
  discount_date_day int&#40;11&#41; default NULL,
  discount_date_month int&#40;11&#41; default NULL,
  t_class int&#40;11&#41; default '0',
  base_cost double default '0',
  ipid int&#40;11&#41; default '0',
  bytes bigint&#40;20&#41; default NULL,
  is_canceled int&#40;11&#41; default '0',
  cancel_id int&#40;11&#41; default '0',
  PRIMARY KEY  &#40;id&#41;,
  KEY first_dtr &#40;discount_date,account_id,slink_id&#41;
&#41; ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"&#41;;
  $sth -> execute&#40;&#41;;

  #prepare data to move in new table
  print "Copy transactions to new archive table....\n";
  $sth =  $dbh->prepare&#40;"INSERT INTO ".$arch_table_name." SELECT * FROM discount_transactions_iptraffic_all where discount_date<".$enddate&#41;;
  $sth -> execute&#40;&#41;;

  print "Delete transactions from discount_transactions_all....\n";
  $sth =  $dbh->prepare&#40;"DELETE FROM discount_transactions_iptraffic_all USING discount_transactions_iptraffic_all
                         INNER JOIN ".$arch_table_name." ON discount_transactions_iptraffic_all.id =".$arch_table_name.".id;"&#41;;
  $sth -> execute&#40;&#41;;

  $sth =  $dbh->prepare&#40;"SELECT min&#40;discount_date&#41;,max&#40;discount_date&#41; from ".$arch_table_name&#41;;
  $sth -> execute&#40;&#41;;
  &#40;$start_date,$end_date&#41;=$sth->fetchrow_array;
  #print $start_date,$end_date,"\n";
  $sth =  $dbh->prepare&#40;"INSERT INTO archives &#40;archive_id,table_type,table_name,
                        start_date,end_date&#41; VALUES &#40;".$archiveid_type2.",2,'".$arch_table_name."',".$start_date.",".$end_date."&#41;;"&#41;;
  $sth -> execute&#40;&#41;;



  $sth->finish;
  $dbh->disconnect;

неуклюже но работает... на тестовом стенде оптимальным показалось архивирование каждый месяц.

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

Сообщение JAO »

За сколько русских рублей они там скриптик писать собрались? :shock: Да я б себе уже квартиру купил, если б мне за каждый скриптик столько платили. Вспоминается бородатый анекдот: "Ну и запросы у вас!" - сказала база данных и повисла.

Я тоже подумываю о внедрении такого механизма. Только скриптики я если что сам писать буду, а сэкономленный тридцатник пустим на что-нибудь полезное.

cooler85
Сообщения: 31
Зарегистрирован: Чт июл 19, 2007 11:44
Откуда: Ryazan

Сообщение cooler85 »

да как бы тож сам ... :oops:

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

Сообщение JAO »

Ну и вот, уже ребята 60 тысяч недосчитались

Blackmore
Сообщения: 365
Зарегистрирован: Вс фев 06, 2005 09:24
Откуда: подмосковье

Сообщение Blackmore »

90 :) - попробовал на тестовой базе - работает - буду пользовать - спасибо :)

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

Сообщение JAO »

Вау, какие убытки!

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

JAO писал(а):Вау, какие убытки!
Небольшой тюнинг:
1) при создании архивных таблиц поля некоторые можно грохнуть, они уже не испоользуются
2) В полях дат надо уменьшить размер поля на 1 знак, т.е. точность понизится на несколько секунд, но этим мы уменьшим индексы
3) после создания и заполнения таблицы ее надо пересоздать с сортировкой по аккаунтам, этим данные по пользователю быдут хранится в одном месте на файловой системе, будет меньше нагрузка на биллинг и быстрее отчеты у юзеров
4) Совсем в самом конце у свежесозданных таблиц сменить тип на упакованные, писать в них ниче мы уже не будем, но этим добьемся уменьшения размера на диске и более быстрой работы с индексами.
5) В таблице по транзакциям трафика удалить нафиг инкремент с поля id и примари индекс с него..
6) удалить нафиг существующие индексы и создать свои по месту :)

cooler85
Сообщения: 31
Зарегистрирован: Чт июл 19, 2007 11:44
Откуда: Ryazan

Сообщение cooler85 »

гммм... учтем-с... реализуем-с....

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

cooler85 писал(а):гммм... учтем-с... реализуем-с....
Пункт 4 читать как:

В полях дат надо заменить последние знаки на 0, т.е. точность понизится на несколько секунд, но этим мы уменьшим индексы
например был юникстайм 9876543210 мы округляем до 9876543000
итого теперь у нас погрешность во времени примерно 15 минут, но зато размер индекса будет в пару десятков раз меньше.

cooler85
Сообщения: 31
Зарегистрирован: Чт июл 19, 2007 11:44
Откуда: Ryazan

Сообщение cooler85 »

про упаковку таблицы расскажи поподробнее, не особо я в теории мускуля силен.

Аватара пользователя
Magnum72
Сообщения: 1947
Зарегистрирован: Чт сен 22, 2005 06:54
Контактная информация:

Сообщение Magnum72 »

cooler85 писал(а):про упаковку таблицы расскажи поподробнее, не особо я в теории мускуля силен.
myisampack

Ответить