Программа iNETsHOP - обработка, сравнение, анализ прайс листов поставщиков, создание каталога товаров интернет магазина Форум - SQL Server мелкософт копирайтед - Работа с базой данных - как безболезненно уменьшить размер базы с разросшимся dbo.TBL_LOG и правильно удалять старые бэкапы


http://inetshop.in.ua/index.php?p=showtopic&toid=351&area=1&high=&pp=15&page=1
28.09.2016 16:05

sonic1978


Пользователь iNETsHOP

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
как безболезненно уменьшить размер базы с разросшимся dbo.TBL_LOG и правильно удалять старые бэкапы?

после удаления бэкапов из папки для бэкапов c:\inetshop они продолжают отображаться в программе
- в администрирование/бэкап

28.09.2016 18:04

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
В настройках программы (в окне "Администрирование") вы можете убрать логирование справочник товаров поставщиков, что так же сократит нагрузку на диск при записи прайс-листа.

Удалить историю справочник товаров поставщиков можно следующим SQL-запросом:
Код

set nocount on;
DECLARE @iS_ID int, @iSG_ID int, @iLOG_ID int, @sLOG_FIELD_NAME varchar(150);
DECLARE cSuppliers CURSOR LOCAL FOR
select
S_ID
from TBL_SUPPLIERS s
-- where s.S_ID = 781
order by s.S_ID
;

OPEN cSuppliers;
FETCH NEXT FROM cSuppliers INTO @iS_ID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
DECLARE cSuppliersGoods CURSOR LOCAL READ_ONLY FOR
select
SG_ID
from TBL_SUPPLIERS_GOODS sg
where sg.SG_S_ID = @iS_ID;
PRINT @iS_ID;
OPEN cSuppliersGoods;
FETCH NEXT FROM cSuppliersGoods INTO @iSG_ID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN

DECLARE cLog CURSOR LOCAL READ_ONLY FOR
select LOG_FIELD_NAME
from TBL_LOG l
where l.LOG_TBL_NAME = 'TBL_SUPPLIERS_GOODS'
and l.LOG_PK = @iSG_ID
and l.LOG_TYPE = 2
group by LOG_FIELD_NAME
having count(*) > 1;

OPEN cLog;
FETCH NEXT FROM cLog INTO @sLOG_FIELD_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
DECLARE cLogValues CURSOR LOCAL READ_ONLY FOR
select l.LOG_ID
from TBL_LOG l
where l.LOG_TBL_NAME = 'TBL_SUPPLIERS_GOODS'
and l.LOG_PK = @iSG_ID
and l.LOG_TYPE = 2
and l.LOG_FIELD_NAME = @sLOG_FIELD_NAME
and not l.LOG_ID in (
select TOP 1 l.LOG_ID
from TBL_LOG l
where l.LOG_TBL_NAME = 'TBL_SUPPLIERS_GOODS'
and l.LOG_PK = @iSG_ID
and l.LOG_TYPE = 2
and l.LOG_FIELD_NAME = @sLOG_FIELD_NAME
order by LOG_DATE DESC
)/* FOR UPDATE*/;

OPEN cLogValues;
FETCH NEXT FROM cLogValues INTO @iLOG_ID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
/*
INSERT INTO TBL_LOG_ARCHIVE ([LOG_ID], [LOG_TBL_NAME], [LOG_PK], [LOG_FIELD_NAME], [LOG_OLD_VALUE], [LOG_TBL_CHILD_NAME], [LOG_NEW_VALUE], [LOG_TYPE], [LOG_DATE], [LOG_USER], [LOG_PK_REF_OLD], [LOG_PK_REF_NEW], [LOG_CHILD_PK])
SELECT [LOG_ID], [LOG_TBL_NAME], [LOG_PK], [LOG_FIELD_NAME], [LOG_OLD_VALUE], [LOG_TBL_CHILD_NAME], [LOG_NEW_VALUE], [LOG_TYPE], [LOG_DATE], [LOG_USER], [LOG_PK_REF_OLD], [LOG_PK_REF_NEW], [LOG_CHILD_PK]
FROM TBL_LOG
WHERE LOG_ID = @iLOG_ID;
*/
DELETE FROM TBL_LOG
WHERE LOG_ID = @iLOG_ID;

COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
END CATCH;

FETCH NEXT FROM cLogValues INTO @iLOG_ID;
END;
CLOSE cLogValues;
DEALLOCATE cLogValues;

FETCH NEXT FROM cLog INTO @sLOG_FIELD_NAME;
END;
CLOSE cLog;
DEALLOCATE cLog;

FETCH NEXT FROM cSuppliersGoods INTO @iSG_ID;
END;
CLOSE cSuppliersGoods;
DEALLOCATE cSuppliersGoods;

FETCH NEXT FROM cSuppliers INTO @iS_ID;
END;
CLOSE cSuppliers;
DEALLOCATE cSuppliers;


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


29.09.2016 08:09

sonic1978


Пользователь iNETsHOP

Тема начата

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
да, логирование уже догадался отключить, но озадачился этой проблемой только после того как база успела раздуться до 5GB

скрипт запустил, прошло 12 часов, еще не отработал

буду ждать..

спасибо!

29.09.2016 12:07

sonic1978


Пользователь iNETsHOP

Тема начата

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
странно, но похоже история всетаки не удалилась после отработки скрипта


Прикрепленные файлы
screen5.png   ( 9 Просмотров | 107.9 KB )

29.09.2016 13:08

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Откройте в программе справочник товаров поставщиков и посмотрите на историю изменений какого-либо товара прайс-листов, там должны остаться только первые и последние записи, а все промежуточные - удалены.

29.09.2016 16:45

sonic1978


Пользователь iNETsHOP

Тема начата

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
открыл, посмотрел, не скажу что полностью все промежуточные удалены, но бОльшая часть похоже удалилась.

но проблема с 5ГБ-ными бэкапами то у меня осталась. как были они 5 ГБ так и остались





Прикрепленные файлы
111.png   ( 5 Просмотров | 15 KB )

29.09.2016 17:12

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
На скриншоте изменения товаров в справочнике товаров (каталоге товаров), а не в справочнике товаров поставщиков (товаров прайс-листов).

29.09.2016 18:16

sonic1978


Пользователь iNETsHOP

Тема начата

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
в товарах поставщиков не нашел где историю смотреть (( вижу только даты - создан редактирован импортирован

30.09.2016 01:50

Admin


Администратор


Количество сообщений   135
Зарегистрирован:   23-08-2007, 09:03:21
Так же как и в справочнике товаров - внизу окна.

30.09.2016 11:31

sonic1978


Пользователь iNETsHOP

Тема начата

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
да, нашел. свернута была нижняя часть. не заметил.

история по товарам поставщиков пуста. но можно ли всетаки уменьшить размер базы?

судя по скрину размер лога стал 1,2 ГБ а зарезервировано таблицами логов 4,8 ГБ.

удаление на размер бэкапа не повлияло

12.10.2016 09:59

sonic1978


Пользователь iNETsHOP

Тема начата

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
есть ли вариант уменьшить всетаки уменьшить размер базы данных? удаление логов на размер бэкапов БД не повлияло

13.10.2016 09:38

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Размер базы данных зависит не только от размера самих данных, но и от служебной информации, в частности индексов которые используются для осуществления быстрой выборки данных и могут занимать больше места чем сами данные. Вы можете удалить индексы в таблице логов (TBL_LOG) на свой страх и риск, но тогда мы не сможем принять во внимание какие-либо жалобы о проблемах со скоростью работы программы, записи данных (прайсов, товаров и т.п.).

13.10.2016 11:01

xMaximusx


Посетитель

Количество сообщений   16
Зарегистрирован:   22-04-2016, 18:45:22
Можно отключить логированние товаров в каталоге так же как логирование товаров из прайсов?

13.10.2016 18:31

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Управление логированием в справочнике товаров пока не предусмотрено и не планируется в ближайшем будущем, потому изменения товаров - записываются в базу данных.

06.11.2016 20:44

sonic1978


Пользователь iNETsHOP

Тема начата

Количество сообщений   107
Зарегистрирован:   27-02-2016, 15:29:39
в итоге перенес все в новую пустую базу.

2ALL - мораль всем - если проект предполагается большой - сразу отключать логирование товаров поставщиков. с ежедневным обновлением по 40 поставщикам база как на дрожжах растет

и не заливать каких попало поставщиков ради экспериментов - если уж захотелось - делать это в отдельной базе