Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пухнет база от BLOB / 25 сообщений из 36, страница 1 из 2
22.09.2017, 10:59
    #39524699
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
вводная:

есть ABS (Automated Bank System), в которую кроме всего прочего складываются фотографии клиентов, а также скан-копии их паспортов.
дабы не засирать основную базу, содержащую Financial Data, создана отдельная база для BLOB. при этом, чтобы обмануть клиентское приложение, складирование в отдельную базу фоток происходит в триггерах через Cross-Database запросы.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
-- картинки храню так:
CREATE DOMAIN DOMN$BLOB_IMAGE AS BLOB SUB_TYPE 0 SEGMENT SIZE [PAGE_SIZE базы];


-- эта таблица фоток, есть в обеих базах
CREATE TABLE TABL$R_CS_PHOTO (
    CS_ID        DOMN$INTEGER_ID,  -- код клиента
    ID           DOMN$INTEGER_ID,  -- код фото, строго триггером через GEN_ID
    NAME         DOMN$PSTRING, -- примечание
    FLAG_DELETE  DOMN$BOOLEAN, -- пометка на удаление
    DATE_COMMIT  DOMN$DATETIME, -- дата/время = TIMESTAMP
    PHOTO        DOMN$BLOB_IMAGE  -- картинка
);


-- флаг в базе данных, что нужно складировать фото во внешнюю базу
CREATE GENERATOR GENR$R_CS_PHOTO_EXTERNAL;


-- далее в основной базе идёт cross-database запрос
CREATE OR ALTER TRIGGER TRIG$R_CS_PHOTO_BIU_240 FOR TABL$R_CS_PHOTO
ACTIVE BEFORE INSERT OR UPDATE POSITION 240
AS
  DECLARE VARIABLE P_DB_BLOB  TYPE OF COLUMN TABL$R_FILIALS.DATABASE_NAME_REMOTE;
  DECLARE VARIABLE P_SQL_STMT TYPE OF COLUMN TABL$J_4.DOCSTR;
BEGIN
  IF(GEN_ID(GENR$R_CS_PHOTO_EXTERNAL, 0) <> 1)THEN EXIT;

  SELECT FIRST 1 P.DATABASE_PATH FROM PROC$_DB_PATH_BLOB P INTO :P_DB_BLOB;
  IF(TRIM(:P_DB_BLOB) = '')THEN EXIT;

  IF(NEW.PHOTO IS NULL)THEN
    BEGIN
    P_SQL_STMT =
      'UPDATE OR INSERT INTO TABL$R_CS_PHOTO (CS_ID, ID, NAME, FLAG_DELETE, DATE_COMMIT) '||
      '  VALUES (?Q_CS_ID, ?Q_ID, ?Q_NAME, ?Q_FLAG_DELETE, ?Q_DATE_COMMIT) '||
      '  MATCHING(ID) ';
    EXECUTE STATEMENT (:P_SQL_STMT)(
       Q_CS_ID       := NEW.CS_ID
      ,Q_ID          := NEW.ID
      ,Q_NAME        := NEW.NAME
      ,Q_FLAG_DELETE := NEW.FLAG_DELETE
      ,Q_DATE_COMMIT := NEW.DATE_COMMIT
    )ON EXTERNAL DATA SOURCE :P_DB_BLOB AS USER 'SYSDBA' PASSWORD 'masterkey';
    END
   ELSE
    BEGIN
    P_SQL_STMT =
      'UPDATE OR INSERT INTO TABL$R_CS_PHOTO (CS_ID, ID, NAME, FLAG_DELETE, DATE_COMMIT, PHOTO) '||
      '  VALUES (?Q_CS_ID, ?Q_ID, ?Q_NAME, ?Q_FLAG_DELETE, ?Q_DATE_COMMIT, ?Q_PHOTO) '||
      '  MATCHING(ID) ';
    EXECUTE STATEMENT (:P_SQL_STMT)(
       Q_CS_ID       := NEW.CS_ID
      ,Q_ID          := NEW.ID
      ,Q_NAME        := NEW.NAME
      ,Q_FLAG_DELETE := NEW.FLAG_DELETE
      ,Q_DATE_COMMIT := NEW.DATE_COMMIT
      ,Q_PHOTO       := NEW.PHOTO
    )ON EXTERNAL DATA SOURCE :P_DB_BLOB AS USER 'SYSDBA' PASSWORD 'masterkey';
    NEW.PHOTO = NULL;
    END
END



описание:
я на уровне триггеров перехватываю BLOB, скирдую его в отдельную базу, а в основной за-NULL-яю.

ожидаемое поведение:
т.к. фото сперва попадает в основную базу, то припухнет база на DatabaseGrowIncrement из конфига чтобы вместить фото, ну и чёрт с ней.
потом же она всё-равно складирует во внешнюю.

фактическое поведение:
база всё равно пухнет с очень большой скоростью.
вот, за неделю на отделении оно распухло до 2,5Гб файл базы.
обыкновенный backup-restore привёл базу в нормальное состояние 403 Мб.

вопрос:
я так понял, что моё решение складывать фотки в отдельную базу для данного вопроса (роста файла БД) - не поможет?
...
Рейтинг: 0 / 0
22.09.2017, 11:02
    #39524703
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
уточню вопрос:
получается, что удалённые страницы Firebird повторно не использует, если позволяет место вместить данные?
он всё равно захватывает новые?
...
Рейтинг: 0 / 0
22.09.2017, 11:06
    #39524710
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
Не проверял, но такое впечатление, что присваивание NULL в блоб-поле в триггере не приводит к физ. удалению блоба.
...
Рейтинг: 0 / 0
22.09.2017, 11:07
    #39524713
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
Можешь сделать валидацию такой распухшей БД ?
...
Рейтинг: 0 / 0
22.09.2017, 12:13
    #39524766
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
hvladМожешь сделать валидацию такой распухшей БД ?

gfix.exe -validate ...... >1.log
gfix.exe -validate -full .....>full.log

выдают пустые файлы. в консоль тоже ничего не пишут.

версия 2.5.7.27050, собирал сам стандартным BAT "искаропки" при помощи M$ Visual Studio 2010
...
Рейтинг: 0 / 0
22.09.2017, 12:38
    #39524799
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
PEAKTOPвыдают пустые файлы.

firebird.log читай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.09.2017, 13:15
    #39524836
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
Dimitry Sibiryakov,

а там вообще ничего нет, кроме стандартной socket-ошибки
Код: plaintext
1.
2.
  
  10054 unable to complete network request to <имя локальной машины>
чего-то стабильно возникающей раз в сутки где-то в 18:00..18:30.
я на неё забил.


больше - ничего.

---------
а грузят фото в базу постоянно с 07:00 до 19:00.
...
Рейтинг: 0 / 0
22.09.2017, 14:39
    #39524910
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
PEAKTOPбольше - ничего.Странно.
Я чуть позже попробую воспризвести.
...
Рейтинг: 0 / 0
25.09.2017, 13:04
    #39525747
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
ещё один пример в студию.

итак, раньше мы анализировали базу данных удалённого "Отделения".
кроме всего прочего, есть ещё и "ГлавнаяБаза", являющаяся алгебраической суммой баз "Отделений".

через Cross-Database запросы в "ГлавнуюБазу" планировщик заданий через BAT+isql по таймеру затягивает данные со всех удалённых "Отделений", в том числе, и фотографии клиентов.

аналогично реализован механизм хранения фотографий в отдельной базе данных, т.е. рядом с файлом "ГлавнаяБаза.FDB" лежит монстр "ГлавнаяБаза_BLOB.FDB" гигов на 100.

штатный размер файла "ГлавнаяБаза.FDB" порядка 4 ГБ.
после недели работы файл распух до 8ГБ.
обыкновенный backup-restore возвращает всё на место, размер снова порядка 4 ГБ.

---
т.е. по ходу получается, что страницы за-NULL-енного БЛОБа ядром не помечаются, как удалённые.
или ядро не хочет почему-то их потом повторно использовать.
...
Рейтинг: 0 / 0
25.09.2017, 13:19
    #39525763
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
а утечки хэндлов на второй БД не может быть ?
есть какие-нибудь утилиты, чтобы посмотреть сколько активных BLOB HANDLE выделено сервером ?
может быть там клиент не закрывает транзакции или делает update or insert .... RETURNING BLOB_COLUMN ?

ну и, соотв, если ПЕРЕЗАПУСТИТЬ службу Firebird, отвечающую за БД, и натравить на эту БД / эти таблицы свиртуальными БЛОБами sweep?
...
Рейтинг: 0 / 0
25.09.2017, 13:20
    #39525764
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
Ariochа утечки хэндлов на второй БД не может быть ?

на первой, конечно
...
Рейтинг: 0 / 0
25.09.2017, 13:32
    #39525772
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
PEAKTOP,

пиши, наверное, в трекер. С простым примером - было бы идеально.
...
Рейтинг: 0 / 0
25.09.2017, 13:41
    #39525781
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
Пока что могу только посоветовать, как это обойти.
Или и сам знаешь ? :)
...
Рейтинг: 0 / 0
27.09.2017, 10:20
    #39526920
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
hvladПока что могу только посоветовать, как это обойти.
Или и сам знаешь ? :)

да на фиг оно надо ещё этой фигнёй заморачиваться.

в 02:00 робот теперь делает не только backup, но и restore.
пока так.

а там, дальше - "или ишак помрёт, или падишах". =)
...
Рейтинг: 0 / 0
27.09.2017, 10:22
    #39526923
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
hvladпиши, наверное, в трекер. С простым примером - было бы идеально.

хорошо, пошёл в трекер.
простой пример, наверное, не получиться, придётся привести полный DDL-SQL, как было написано выше.
...
Рейтинг: 0 / 0
27.09.2017, 11:22
    #39526998
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
PEAKTOPя на уровне триггеров перехватываю BLOB, скирдую его в отдельную базу, а в основной за-NULL-яю.
я бы советовал перечитать
http://www.ibase.ru/dbgrowth/
...
Рейтинг: 0 / 0
27.09.2017, 12:23
    #39527045
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
читал когда-то.

ИМХО, статья актуальная, но несколько неполная.
я бы добавил (чисто из практики) туда нулевой пункт:

0.Смотреть механизм логгирования!!!адынадын

т.е. если в базе ручками, скриптом или тулзой наколотили триггеров вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR ALTER TRIGGER TRG$MY_TABLE_ADIU_255 FOR MY_TABLE
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 255
AS
BEGIN
  INSERT INTO MY_LOG_TABLE( <FIELDS> )
    VALUES( <VALUES> );
END


нужно задаться вопросом: а не было ли массового UPDATE какой-нибудь мега-таблицы?

практически в 99% случаев была какая-то реструктуризация БД (добавили поле и решили инициализировать), а логгирование отключить забыли.
...
Рейтинг: 0 / 0
27.09.2017, 13:14
    #39527077
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
PEAKTOP,

в статье речь не про разовые случаи, на которые можно наплевать. А про постоянный рост БД из-за временных блобов.
...
Рейтинг: 0 / 0
27.09.2017, 15:03
    #39527158
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
kdvА про постоянный рост БД из-за временных блобов.

Формально, они у него не должны плодиться, потому что наружу из триггера они не уходят (внешнее подключение живёт "внутри" триггера, и потому тоже не в счёт).

А реально - похоже, что в FB где-то пропустили работу со счетчиками ссылок в BLOB handle.
Как хорошо в Delphi, где это работой компилятор занимается
...
Рейтинг: 0 / 0
27.09.2017, 15:07
    #39527162
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
AriochА реально - похоже, что в FB где-то пропустили работу со счетчиками ссылок в BLOB handle.

Нет никакого счётчика ссылок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.09.2017, 15:14
    #39527169
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
AriochФормально, они у него не должны плодиться, потому что наружу из триггера они не уходят
что значит "формально"? У него в триггер приезжает содержимое записи, с блобом. Блоб не в воздухе же существует, он уже записан как временный. Ну присвоили ему null в триггере, и что? Если блоб временный, так он удаляется или при закрытии транзакции, или при закрытии коннекта.

Кстати, воспроизводимый пример можно было бы легко сделать. В смысле, сделать зануление блоба в триггере, а update-ом пихать туда постоянно килобайт по 10-20. Ну и посмотреть, когда пухнет, и когда освобождается.
...
Рейтинг: 0 / 0
28.09.2017, 17:20
    #39527847
Сисдба Мастеркеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
...
Рейтинг: 0 / 0
28.09.2017, 18:26
    #39527898
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
Сисдба Мастеркеевич 12623305 О как бывает !
...
Рейтинг: 0 / 0
28.09.2017, 20:09
    #39527928
Guest7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
hvladСисдба Мастеркеевич 12623305 О как бывает !
Вторая пятилетка ("работе в эту сторону") т.е. уже пошла. :D
...
Рейтинг: 0 / 0
28.09.2017, 20:48
    #39527939
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пухнет база от BLOB
Guest7777,

не вижу этого в трекере
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пухнет база от BLOB / 25 сообщений из 36, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]