Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
вводная:

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

-- картинки храню так:
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 Мб.

вопрос:
я так понял, что моё решение складывать фотки в отдельную базу для данного вопроса (роста файла БД) - не поможет?
22 сен 17, 10:59    [20814884]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
уточню вопрос:
получается, что удалённые страницы Firebird повторно не использует, если позволяет место вместить данные?
он всё равно захватывает новые?
22 сен 17, 11:02    [20814904]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
hvlad
Member

Откуда:
Сообщений: 9237
Не проверял, но такое впечатление, что присваивание NULL в блоб-поле в триггере не приводит к физ. удалению блоба.
22 сен 17, 11:06    [20814935]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
hvlad
Member

Откуда:
Сообщений: 9237
Можешь сделать валидацию такой распухшей БД ?
22 сен 17, 11:07    [20814942]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
hvlad
Можешь сделать валидацию такой распухшей БД ?


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

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

версия 2.5.7.27050, собирал сам стандартным BAT "искаропки" при помощи M$ Visual Studio 2010
22 сен 17, 12:13    [20815297]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43664

PEAKTOP
выдают пустые файлы.

firebird.log читай.

Posted via ActualForum NNTP Server 1.5

22 сен 17, 12:38    [20815424]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
Dimitry Sibiryakov,

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


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

---------
а грузят фото в базу постоянно с 07:00 до 19:00.
22 сен 17, 13:15    [20815623]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
hvlad
Member

Откуда:
Сообщений: 9237
PEAKTOP
больше - ничего.
Странно.
Я чуть позже попробую воспризвести.
22 сен 17, 14:39    [20816056]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
ещё один пример в студию.

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

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

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

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

---
т.е. по ходу получается, что страницы за-NULL-енного БЛОБа ядром не помечаются, как удалённые.
или ядро не хочет почему-то их потом повторно использовать.
25 сен 17, 13:04    [20820414]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
Arioch
Member

Откуда:
Сообщений: 9088
а утечки хэндлов на второй БД не может быть ?
есть какие-нибудь утилиты, чтобы посмотреть сколько активных BLOB HANDLE выделено сервером ?
может быть там клиент не закрывает транзакции или делает update or insert .... RETURNING BLOB_COLUMN ?

ну и, соотв, если ПЕРЕЗАПУСТИТЬ службу Firebird, отвечающую за БД, и натравить на эту БД / эти таблицы свиртуальными БЛОБами sweep?
25 сен 17, 13:19    [20820495]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
Arioch
Member

Откуда:
Сообщений: 9088
Arioch
а утечки хэндлов на второй БД не может быть ?


на первой, конечно
25 сен 17, 13:20    [20820496]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
hvlad
Member

Откуда:
Сообщений: 9237
PEAKTOP,

пиши, наверное, в трекер. С простым примером - было бы идеально.
25 сен 17, 13:32    [20820547]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
hvlad
Member

Откуда:
Сообщений: 9237
Пока что могу только посоветовать, как это обойти.
Или и сам знаешь ? :)
25 сен 17, 13:41    [20820580]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
hvlad
Пока что могу только посоветовать, как это обойти.
Или и сам знаешь ? :)


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

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

а там, дальше - "или ишак помрёт, или падишах". =)
27 сен 17, 10:20    [20825893]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
hvlad
пиши, наверное, в трекер. С простым примером - было бы идеально.


хорошо, пошёл в трекер.
простой пример, наверное, не получиться, придётся привести полный DDL-SQL, как было написано выше.
27 сен 17, 10:22    [20825907]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
kdv
Member

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

я бы советовал перечитать
http://www.ibase.ru/dbgrowth/
27 сен 17, 11:22    [20826177]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
PEAKTOP
Member

Откуда: агломерация Славянск-Краматорск-Дружковка
Сообщений: 1790
читал когда-то.

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

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

т.е. если в базе ручками, скриптом или тулзой наколотили триггеров вроде
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% случаев была какая-то реструктуризация БД (добавили поле и решили инициализировать), а логгирование отключить забыли.
27 сен 17, 12:23    [20826402]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 26564
PEAKTOP,

в статье речь не про разовые случаи, на которые можно наплевать. А про постоянный рост БД из-за временных блобов.
27 сен 17, 13:14    [20826525]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
Arioch
Member

Откуда:
Сообщений: 9088
kdv
А про постоянный рост БД из-за временных блобов.


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

А реально - похоже, что в FB где-то пропустили работу со счетчиками ссылок в BLOB handle.
Как хорошо в Delphi, где это работой компилятор занимается
27 сен 17, 15:03    [20826898]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43664

Arioch
А реально - похоже, что в FB где-то пропустили работу со счетчиками ссылок в BLOB handle.

Нет никакого счётчика ссылок.

Posted via ActualForum NNTP Server 1.5

27 сен 17, 15:07    [20826911]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 26564
Arioch
Формально, они у него не должны плодиться, потому что наружу из триггера они не уходят

что значит "формально"? У него в триггер приезжает содержимое записи, с блобом. Блоб не в воздухе же существует, он уже записан как временный. Ну присвоили ему null в триггере, и что? Если блоб временный, так он удаляется или при закрытии транзакции, или при закрытии коннекта.

Кстати, воспроизводимый пример можно было бы легко сделать. В смысле, сделать зануление блоба в триггере, а update-ом пихать туда постоянно килобайт по 10-20. Ну и посмотреть, когда пухнет, и когда освобождается.
27 сен 17, 15:14    [20826941]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
Сисдба Мастеркеевич
Member

Откуда:
Сообщений: 327
12623305
28 сен 17, 17:20    [20829763]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
hvlad
Member

Откуда:
Сообщений: 9237
Сисдба Мастеркеевич
12623305
О как бывает !
28 сен 17, 18:26    [20829953]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
Guest7777
Guest
hvlad
Сисдба Мастеркеевич
12623305
О как бывает !

Вторая пятилетка ("работе в эту сторону") т.е. уже пошла. :D
28 сен 17, 20:09    [20830115]     Ответить | Цитировать Сообщить модератору
 Re: Пухнет база от BLOB  [new]
hvlad
Member

Откуда:
Сообщений: 9237
Guest7777,

не вижу этого в трекере
28 сен 17, 20:48    [20830167]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить