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

-
- Сообщения: 1612
- Зарегистрирован: Пт ноя 10, 2006 15:23
Код: Выделить всё
#!/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("INSERT INTO ".$arch_table_name." SELECT * FROM discount_transactions_all where discount_date<".$enddate);
$sth -> execute();
print "Delete transactions from discount_transactions_all....\n";
$sth = $dbh->prepare("DELETE FROM discount_transactions_all USING discount_transactions_all
INNER JOIN ".$arch_table_name." ON discount_transactions_all.id =".$arch_table_name.".id;");
$sth -> execute();
$sth = $dbh->prepare("SELECT min(discount_date),max(discount_date) from ".$arch_table_name);
$sth -> execute();
($start_date,$end_date)=$sth->fetchrow_array;
$sth = $dbh->prepare("INSERT INTO archives (archive_id,table_type,table_name,
start_date,end_date) VALUES (".$archiveid_type1.",1,'".$arch_table_name."',".$start_date.",".$end_date.");");
$sth -> execute();
############################################
#Prepare to archive discount_transactions_iptraffic_all
print "\n\nPrepare to archive discount_transactions_iptraffic_all \n";
#get last archive id
$sth = $dbh->prepare("select max(archive_id) from archives where table_type=2");
$sth -> execute();
$archiveid_type2=$sth->fetchrow_array; $archiveid_type2++;
print "Last archive id=".$archiveid_type2."\n";
#get start date to archive
$sth = $dbh->prepare("select min(discount_date) from discount_transactions_iptraffic_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_iptraffic_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,
discount double default NULL,
discount_with_tax double default NULL,
service_id int(11) default NULL,
discount_period_id int(11) default NULL,
slink_id int(11) default NULL,
discount_date int(11) default NULL,
discount_date_hour int(11) default NULL,
discount_date_day int(11) default NULL,
discount_date_month int(11) default NULL,
t_class int(11) default '0',
base_cost double default '0',
ipid int(11) default '0',
bytes bigint(20) default NULL,
is_canceled int(11) default '0',
cancel_id int(11) default '0',
PRIMARY KEY (id),
KEY first_dtr (discount_date,account_id,slink_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("INSERT INTO ".$arch_table_name." SELECT * FROM discount_transactions_iptraffic_all where discount_date<".$enddate);
$sth -> execute();
print "Delete transactions from discount_transactions_all....\n";
$sth = $dbh->prepare("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;");
$sth -> execute();
$sth = $dbh->prepare("SELECT min(discount_date),max(discount_date) from ".$arch_table_name);
$sth -> execute();
($start_date,$end_date)=$sth->fetchrow_array;
#print $start_date,$end_date,"\n";
$sth = $dbh->prepare("INSERT INTO archives (archive_id,table_type,table_name,
start_date,end_date) VALUES (".$archiveid_type2.",2,'".$arch_table_name."',".$start_date.",".$end_date.");");
$sth -> execute();
$sth->finish;
$dbh->disconnect;
неуклюже но работает... на тестовом стенде оптимальным показалось архивирование каждый месяц.
За сколько русских рублей они там скриптик писать собрались?
Да я б себе уже квартиру купил, если б мне за каждый скриптик столько платили. Вспоминается бородатый анекдот: "Ну и запросы у вас!" - сказала база данных и повисла.
Я тоже подумываю о внедрении такого механизма. Только скриптики я если что сам писать буду, а сэкономленный тридцатник пустим на что-нибудь полезное.

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

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