Oracle DB: Библиотечный кэш
Ссылки по теме
- V$LIBRARYCACHE
- Практическое администрирование Oracle - Ожидание Library cache pin. Часть 1.
- Практическое администрирование Oracle - Ожидание Library cache pin. Часть 2.
Проблемы
В высоконагруженных базах данных могут возникать ситуации длительного ожидания Library cache pin. Лечится снятием сессии, первоначально захватившей ресурс. Если наступил коллапс и количество ожиданий слишком велико, то придется снимать все сессии. Если ситуации ожидания возникают часто, то это плохой признак и нужно разбираться в причинах.
Термины
- Shared Pool (разделяемый пул) - область в SGA
- Library cache (библиотечный кэш) - область в shared pool
- Library cache pin - это событие ожидания одноимённой защёлки. Оно возникает при первоначальной загрузке объекта в библиотечный кэш, а также тогда, когда сеанс хочет изменить или проверить объект в памяти библиотечного кэша. Обычно это происходит в случаях выполнения, разбора объекта, его переопределения или изменения привилегий доступа к нему.
Структура библиотечного кэша
Библиотечный кэш состоит из связанного набора структур. В основе находится хеш-таблица, которая представляет собой набор бакетов (ячеек таблицы). Каждый бакет имеет свой индекс и содержит адрес начала двунаправленного списка дескрипторов объектов библиотечного кэша (Library Cache Object Handle). Дескрипторы в свою очередь указывают на структуры самих объектов библиотечного кэша (Library Cache Object или LCO). Обычно в бакете расположен список с всего одним дескриптором LCO, но бывает и так, что в результате так называемой хэш-коллизии в список указателей может попадать и несколько объектов.
LCO может содержать до 8 блоков данных, на которые он ссылается с помощью дескрипторов. Каждый блок имеет заголовок содержащий флаг статуса и счетчик PIN, указывающий на количество закреплений данного блока
Назначение блоков
- Блок 0 – Object, информация о самом объекте
- Блок 1 – Source, исходный код объекта
- Блок 2 – DIANA, это промежуточный код PL/SQL объекта
- Блок 3 - PCODE
- Блок 4 – MCODE, здесь расположен машинно-зависимый код PL/SQL объекта;
- Блок 5 - Errors
- Блок 6 – SQL Context, здесь обычно храниться план выполнения
- Блок 7 - Free
Важные динамические таблицы и их поля
- x$kgllk - блокировки библиотечного кэша
- kgllkuse – адрес сеанса;
- kgllkhdl – дескриптор KGL объекта (объекта в Kernel Generic Library cache);
- kgllkcnt – количество блокировок объекта;
- kgllkmod – режим захвата блокировки;
- kgllkreq – режим запроса блокировки;
- x$kglpn – закрепления в библиотечном кэше
- kglpnhdl – дескриптор KGL объекта;
- kglpnuse – адрес сеанса;
- kglpncnt – количество закреплений объекта в сеансе (включая зависимые объекты);
- kglpnmod – режим захвата закрепления объекта;
- kglpnreq – режим запроса закрепления объекта;
- x$kglob –ресурсы библиотечного кэша
- kglhdadr – дескриптор KGL объекта;
- kglnaown – владелец ресурса;
- kglnaobj – имя ресурса;
- x$ksuse – текущие сеансы
- addr – адрес сеанса;
- ksusenum – идентификатор сеанса (SID);
- ksuudlna – имя пользователя;
- ksuseopc – номер события;
- x$ksled – наименования событий
- indx – индекс события;
- kslednam – наименование события;
-- статистика библиотечного кэша SELECT * FROM V$LIBRARYCACHE; SELECT pinhitratio FROM V$LIBRARYCACHE WHERE namespace='SUMMARY'; -- список закреплений -- если pin_req = 0, то закрепление произошло и ожидания нет SELECT c.ksusenum sid, c.ksuudlna username, a.kglpncnt pin_cnt, a.kglpnmod pin_mode, a.kglpnreq pin_req, d.kslednam event, b.kglnaown, b.kglnaobj FROM x$kglpn a, x$kglob b, x$ksuse c, x$ksled d WHERE b.kglhdadr = a.kglpnhdl AND a.kglpnuse = c.addr AND c.ksuseopc = d.indx; -- список блокировок -- если lck_req = 0, то блокировка произошла и ожидания нет SELECT c.ksusenum sid, c.ksuudlna username, a.kgllkcnt lck_cnt, a.kgllkmod lck_mode, a.kgllkreq lck_req, d.kslednam event, b.kglnaown, b.kglnaobj FROM x$kgllk a, x$kglob b, x$ksuse c, x$ksled d WHERE b.kglhdadr = a.kgllkhdl AND a.kgllkuse = c.addr AND c.ksuseopc = d.indx; -- снятие дампа библиотечного кэша для последующего анализа ALTER SESSION SET EVENTS 'immediate trace name library_cache level 32';
Режимы защелки
- 0 - нет
- 1 - null
- 2 - shared
- 3 - монопольный
Перед защелкой Library cache pin всегда идет защелка Lock. Если объект закрепляется в монопольном режиме (защелка pin), то последующая попытка закрепления в монопольном режиме приведет к блокировке (защелка Lock) в монопольном режиме. Т.к. защелка Lock всегда предшествует защелке PIN, то это полностью заблокирует любое использование объекта.