Ошибка ORA-01654: unable to extend index — диагностика и устранение
- Операции модификации данных (
INSERT,UPDATE) падают с ошибкойORA-01654: unable to extend index OWNER.INDEX_NAME by ... in tablespace .... - Индексное табличное пространство (обычно INDX или USERS) полностью заполнено.
- B-Tree индексы сильно фрагментированы после частых обновлений и удалений записей.
1. Проверка доступного пространства в табличном пространстве индекса
SELECT df.tablespace_name,
SUM(df.bytes)/1024/1024 AS total_mb,
NVL(SUM(fs.bytes),0)/1024/1024 AS free_mb
FROM dba_data_files df
LEFT JOIN dba_free_space fs ON df.file_id = fs.file_id
GROUP BY df.tablespace_name;2. Добавление или расширение файлов данных
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/DB1/indx01.dbf'
AUTOEXTEND ON NEXT 512M MAXSIZE 32G;
-- Либо добавление нового файла
ALTER TABLESPACE indx ADD DATAFILE '/u01/app/oracle/oradata/DB1/indx02.dbf'
SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 32G;3. Онлайн-перестроение индекса для дефрагментации (Rebuild Online)
ALTER INDEX schema_name.index_name REBUILD ONLINE;4. Компактизация индексов (Coalesce)
Для быстрого освобождения смежных листовых блоков без создания копии индекса:
ALTER INDEX schema_name.index_name COALESCE; Частые вопросы (FAQ)
Почему перестроение индекса (REBUILD) может временно потребовать в 2 раза больше места?
При операции REBUILD ONLINE создается новая копия сегмента индекса, а старая удаляется только после завершения и фиксации процесса перестроения.
Как перенести индекс в отдельное табличное пространство?
Используйте команду: ALTER INDEX schema_name.index_name REBUILD TABLESPACE new_indx_ts ONLINE;
Почему ORA-01654 падает при вставке в таблицу, а не при работе с индексом?
При любой вставке строки в таблицу СУБД обязана обновить все связанные индексы. Если индекс не может выделить экстент под новый ключ, вся транзакция откатывается.
Как автоматизировать мониторинг разрастания индексов в 1С?
Регулярно запускайте регламентное обслуживание индексов (дефрагментация / реиндексация) в ночное технологическое окно через DBMS_STATS и REBUILD.