Из серии «никогда такого не было, и вот опять». Данная ошибка по сути является багом и её не должно быть. Первые упоминания о исправлении данной ошибки датируются версией 7.3.3(да, да, очень старая) и заканчиваются на отметке версии 10.1.0.2. Но как бы не так, данная ошибка воспроизводится(не всегда, но достаточно часто) в 19.3 и 19.19. Стоит отметить, что ошибка нашлась при синтетических тестах.
Для воспроизведения ошибки, нужно:
create table t1(
id varchar2(4000));
alter table t1 add constraint idpk primary key(id);
create sequence t1seq cache 5000;
Сам тест:
Запустить 5-10 конкурентных сессий, без использования PL/SQL, используя только sql:
После установки DBRU19.19 на 19.9, одна таблица стала линейно подрастать. Таблица буферная, в неё идёт вставка и практически стразу идёт удаление, в таблице постоянно находится порядка 1000 строк, но каждый день таблица прибавляет в объёме. При поиске на oracle support был найдет Bug 30265523 — blocks are not marked as free in assm after delete — 12.2 and later (Doc ID 30265523.8) .
Выполнив дамп блока первого уровня битовой карты свободного места в экстете(first level bitmap block) вижу вот такую картину:
Наблюдаем rejectioncode 3, ну и все блоки FULL. Что полностью совпадает с описанием бага, который как бы исправлен. Если сделать дамп блока с данными, то в нём будет всего одна строка, которая имеет пометку, что она удалена(—HDFL—). Стоит отметить, что проблемная таблица имеет несколько полей varchar2(4000), из которых под завязку заполняется всегда 2 поля, а иногда 3 поля, остальные поля всегда null, связанных и смигированных(chained and migrated rows) строк таблица не имеет.
Дальнейшие эксперименты показали, что:
Не помогает или делает хуже _enable_rejection_cache = false
Не помогает _assm_segment_repair_bg=false
Комбинация _enable_rejection_cache = false и _fix_control=’32075777:ON’, не помогает.
Потенциальным решением(костылём) может является только установка одного параметра _fix_control=’32075777:ON’.
Выставив _fix_control=’32075777:ON’, можно удержать таблицу в нормальных рамках размера. При постоянной нагрузке, таблица остановила свой рост. При одинаковой нагрузке, в 19.9 таблица имелеа размер в пару сотен мегабайт, в 19.19 с _fix_control=’32075777:ON’, рост остановился на отметке в 1Гб. Также при установки _fix_control=’32075777:ON’, появилась не нулевая метрика ASSM_bg_slave_fix_state, которая по видимому увеличивается после того, как фиксится статус блоков в битовой карте, и стала заполнятся x$ktsp_repair_list(я так понимаю, здесь отображён список сегментов, по которым сработал механизм починки сегмента). SR я завёл.
Ну и в целом, как изменилась работа ASSM. До 06/21 бд работала на DBRU 19.9, после 6/20 на 19.19: