ORA-00018: превышено максимальное количество сеансов
Эта ошибка возникает, когда у нас недостаточно сессий для наших операций DDL/DML
.
Это потому, что оператор DDL/DML
требует использования рекурсивных DML
, а некоторые рекурсивные (словарь данных) операции в Oracle
выполняются с использованием рекурсивного контекста сеанса!
Oracle будет молчавыделить новый объект состояния сеанса из массива объектов состояния сеанса (V $ SESSION / X $ KSUSE), и все объекты состояния рекурсивных операций (блокировки, объекты состояния транзакции и т. д.) будут принадлежать этому рекурсивному сеансу. Также словарь данных QUERIES
(заполнение кеша словаря) выполняется с использованием отдельного рекурсивного сеанса.
Нет. session
доступно и sessions parameter
значение a можно проверить с помощью:
SQL> select value from v$parameter where name = 'sessions';
VALUE
--------------------------------------------------------------
170
SQL>
SQL> select count(*) from v$session;
COUNT(*)
----------
163
Теперь вы видите, что, хотя у нас есть 7
сеанс оставшихся за кадром, но все равно мы получаем ошибку ORA-00018
.
Итак, давайте дважды проверим из V$RESOURCE_LIMIT
, который показывает нам использование различных фиксированных и сегментированных массивов в экземпляре Oracle, включая массив объектов состояния сеанса, V$SESSION
:
SQL> select * from v$resource_limit where resource_name = 'sessions';
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_AL LIMIT_VALU
------------------------------ ------------------- --------------- ---------- ----------
sessions 170 170 170 170
Там выобнаружит, что CURRENT_UTILIZATION
будет таким же, как установлено значение параметра сеанса.
Также сеанс RECURSIVE
используется для рекурсивных вызовов словаря данных, а V$SESSION
не показывает их.
Вы можете увидеть такой сеанс, запросив таблицу "
SQL> select paddr from v$session where sid = userenv('sid');
PADDR
----------------
BF46591C
В другом сеансе я запустил этот запрос, чтобы увидеть, какие сеансы принадлежат этому объекту состояния процесса, указанному выше:
SQL> select
decode(bitand(ksuseflg,19),17,'BACKGROUND',1,'USER',2,'RECURSIVE','?'),ksuudsna
from x$ksuse s where ksusepro = 'BF46591C';
DECODE(BITAND(KSUSEFLG,19),17, KSUUDSNA
-------------------------------- ------------------------------
USER SYSTEM
RECURSIVE SYS
Эти две причины также могут быть причинами в вашем случае.
Так что, если вы нажмете ошибку ORA-00018
, увеличьте массив sessions parameter
или настройте приложение на использование меньшего количества соединений или сеансов. .
Примечание. Для запроса этих таблиц необходима привилегия DBA
.