Phistory to archive

Материал из MajorDoMo инфо
Версия от 19:31, 22 мая 2020; Mixman (обсуждение | вклад) (Добалена категория)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Из телеграмчата от пользователя XOR

Описание

Для ускорения работы MajorDoMo, есть смысл перенести таблицу phistory "боевой" (читай основной рабочей) базы в таблицу отдельно созданной базы, для истории или анализа сторонними методами. Приведенный ниже код переносит данные, старше 2-х месяцев, из таблицы phistory боевой базы в таблицу history базы archive. Тут приведен пример экспорта истории в базу рядом, что даёт некоторые преимущества по ср., например, с вариантом, когда экспорт идёт во внешний файл (что актуально для малины).

Все работы проводим на свой страх и риск в phpmyadmin. Возможно позже появится что-то автоматизированное.

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

Создаем "вьюху"

// она у меня не только для этого) тут просто в очередной раз используется
// для того, чтобы от айди перейти к Объект.Свойство
// тут стандартная связь между классом, объектом, свойством и айди
// поддерживается иерархия классов глубиной в 3
CREATE OR REPLACE VIEW vw_clobjpr AS
select `v`.`ID` AS `value_id`,`v`.`PROPERTY_ID` AS `PROPERTY_ID`,`v`.`PROPERTY_NAME` AS `PROPERTY_NAME`,`v`.`UPDATED` AS `UPDATED`,
`v`.`VALUE` AS `VALUE`,`p`.`TITLE` AS `property`,
`o`.`TITLE` AS `object`,`c`.`TITLE` AS `class`,`cp`.`TITLE` AS `class_parent`,`cpp`.`TITLE` AS `class_pparent` 
from (((((`pvalues` `v` join `properties` `p` on((`v`.`PROPERTY_ID` = `p`.`ID`))) 
join `objects` `o` on((`v`.`OBJECT_ID` = `o`.`ID`))) 
left join `classes` `c` on((`o`.`CLASS_ID` = `c`.`ID`))) 
left join `classes` `cp` on((`c`.`PARENT_ID` = `cp`.`ID`))) 
left join `classes` `cpp` on((`cp`.`PARENT_ID` = `cpp`.`ID`)))

Создаем базу

//из php-скрипта, например, так. База создается с умолчаниями. 
//При необходимости, подправить CHARACTER SET, COLLATE и права
sqlExec("CREATE DATABASE IF NOT EXISTS archive");

Создаем таблицу


//создадим таблицу из скрипта (пустую) 
$sql = "CREATE TABLE archive.history (
 `ADDED` datetime DEFAULT NULL,
 `VALUE` varchar(255) NOT NULL,
 `PROPERTY_NAME` varchar(100) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
sqlExec($sql);
//или (запускать из db_terminal)
//создать таблицу history и напихать туда данные 
create table archive.history as
SELECT p.`ADDED`,p.`VALUE`,t.property_name  
FROM `phistory` p
join vw_clobjpr t on p.`VALUE_ID`=t.value_id
WHERE p.ADDED < DATE_SUB( NOW( ) , INTERVAL 2
MONTH ) ;

//желательно тут же удалить напиханные данные из пхистори
delete
FROM `phistory` 
WHERE `ADDED` < DATE_SUB( NOW( ) , INTERVAL 2 MONTH ) ;

Скрипт для запуска каждый месяц

$sql = "INSERT INTO archive.history
SELECT p.`ADDED` , p.`VALUE` , t.property_name
FROM `phistory` p
JOIN vw_clobjpr t ON p.`VALUE_ID` = t.value_id
WHERE p.ADDED < DATE_SUB( NOW( ) , INTERVAL 2 MONTH )" ;
sqlExec($sql);

$sql = "DELETE FROM `phistory` WHERE `ADDED` < DATE_SUB( NOW( ) , INTERVAL 2 MONTH )" ;
sqlExec($sql);