THREADED_EXECUTION в Oracle 12c: процессы и потоки

Андрей Васенин

Андрей Васенин

Автор статьи. Сфера интересов: ИТ-специалист (программирование, администрирование, DBA). Кандидат экономических наук. Подробнее .

THREADED_EXECUTION в Oracle 12cВ системах UNIX / Linux база данных Oracle использует мультипроцессную модель. Например, после обычнойустановки базы данных Оракл в системе Linux будет иметь вот такой список процессов:


Оглавление статьи[Показать]


$ ps -ef | grep [o]ra_
oracle   15356     1  0 10:53 ?        00:00:00 ora_pmon_db12c
oracle   15358     1  0 10:53 ?        00:00:00 ora_psp0_db12c
oracle   15360     1  8 10:53 ?        00:01:27 ora_vktm_db12c
oracle   15364     1  0 10:53 ?        00:00:00 ora_gen0_db12c
oracle   15366     1  0 10:53 ?        00:00:00 ora_mman_db12c
oracle   15370     1  0 10:53 ?        00:00:00 ora_diag_db12c
oracle   15372     1  0 10:53 ?        00:00:00 ora_dbrm_db12c
oracle   15374     1  0 10:53 ?        00:00:00 ora_dia0_db12c
oracle   15376     1  0 10:53 ?        00:00:00 ora_dbw0_db12c
oracle   15378     1  0 10:53 ?        00:00:00 ora_lgwr_db12c
oracle   15380     1  0 10:53 ?        00:00:00 ora_ckpt_db12c
oracle   15382     1  0 10:53 ?        00:00:00 ora_smon_db12c
oracle   15384     1  0 10:53 ?        00:00:00 ora_reco_db12c
oracle   15386     1  0 10:53 ?        00:00:00 ora_lreg_db12c
oracle   15388     1  0 10:53 ?        00:00:03 ora_mmon_db12c
oracle   15390     1  0 10:53 ?        00:00:00 ora_mmnl_db12c
oracle   15392     1  0 10:53 ?        00:00:00 ora_d000_db12c
oracle   15394     1  0 10:53 ?        00:00:00 ora_s000_db12c
oracle   15407     1  0 10:54 ?        00:00:00 ora_tmon_db12c
oracle   15409     1  0 10:54 ?        00:00:00 ora_tt00_db12c
oracle   15411     1  0 10:54 ?        00:00:00 ora_smco_db12c
oracle   15413     1  0 10:54 ?        00:00:00 ora_fbda_db12c
oracle   15415     1  0 10:54 ?        00:00:00 ora_aqpc_db12c
oracle   15419     1  0 10:54 ?        00:00:00 ora_p000_db12c
oracle   15421     1  0 10:54 ?        00:00:00 ora_p001_db12c
oracle   15423     1  0 10:54 ?        00:00:00 ora_p002_db12c
oracle   15425     1  0 10:54 ?        00:00:00 ora_p003_db12c
oracle   15435     1  0 10:54 ?        00:00:00 ora_cjq0_db12c
oracle   15459     1  0 10:54 ?        00:00:00 ora_qm02_db12c
oracle   15463     1  0 10:54 ?        00:00:00 ora_q002_db12c
oracle   15465     1  0 10:54 ?        00:00:00 ora_q003_db12c
oracle   15612     1  0 11:04 ?        00:00:00 ora_w000_db12c
oracle   15679     1  0 11:10 ?        00:00:00 ora_j000_db12c
oracle   15681     1  0 11:10 ?        00:00:00 ora_j001_db12c
oracle   15683     1  0 11:10 ?        00:00:00 ora_w001_db12c
$

Даже при использовании этой многопроцессной модели некоторые из отдельных процессов уже внутри себя также могут работать многопоточно.

Напротив в Windows база данных Oracle работает как один многопоточный процесс.  Каждый из процессов UNIX / Linux работает на одном или нескольких потоках. Oracle 12c (релиз 12.1) включает в себя возможность запуска базы данных в средах UNIX / Linux с помощью однопроцессной многопоточной модели, аналогичной тому, как она работает под Windows.

 

THREADED_EXECUTION

Выбор модели мультипроцессности / многопоточности задается параметром инициализации THREADED_EXECUTION.

  • THREADED_EXECUTION=FALSE : Значение по умолчанию, заставляет Oracle работать с использованием модели многопроцессности.
  • THREADED_EXECUTION=TRUE : Oracle работает с многопоточной моделью в рамках одгного монолитного процесса.

Чтобы переключиться на многопоточную модель, просто установите параметр THREADED_EXECUTION и перезапустите базу данных:

CONN sys AS SYSDBA
ALTER SYSTEM SET threaded_execution=TRUE SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

Как только база данных будет запущена, мы увидим, что число процессов операционной системы резко сократилось:

$ ps -ef | grep [o]ra_
oracle   15839     1  0 11:26 ?        00:00:00 ora_pmon_db12c
oracle   15841     1  0 11:26 ?        00:00:00 ora_psp0_db12c
oracle   15843     1  8 11:26 ?        00:00:03 ora_vktm_db12c
oracle   15847     1  0 11:26 ?        00:00:00 ora_u004_db12c
oracle   15853     1 34 11:26 ?        00:00:13 ora_u005_db12c
oracle   15859     1  0 11:26 ?        00:00:00 ora_dbw0_db12c
$

Кроме того, в файл $ORACLE_HOME/network/admin/listener.ora должен быть добавлен следующий параметр, который позволяет создавать новые потоки для поддержки соединений, выполняемых через прослушиватель. Замените <listener-name> на правильное имя слушателя.

DEDICATED_THROUGH_BROKER_<listener-name>=ON

Чтобы вернуться к модели мультипроцесса, просто переключите параметр инициализации и перезапустите базу данных.

CONN sys AS SYSDBA
ALTER SYSTEM SET threaded_execution=FALSE SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

Не забудьте удалить параметр «listener.ora».

 

OS Authentication

Аутентификация ОС не поддерживается многопоточной моделью. Это особенность, а не ошибка. Оглядываясь на предыдущие примеры, соединения выполняются с использованием «SYS AS SYSDBA», а не «/ AS SYSDBA» при использовании многопоточной модели. Попытка использования аутентификации ОС приводит к ошибкам.

$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Thu Jul 4 11:28:16 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


Enter user-name: sys as sysdba
Enter password:

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL>

В документации предполагается, что вы получите ошибку «недостаточные привилегии» ORA-01031.

 

Killing Sessions

Представление V$PROCESS включает в себя новый столбец под названием STID, который отображает идентификатор потока сеанса:

SET LINESIZE 140
COLUMN username FORMAT A15
COLUMN osuser FORMAT A15
COLUMN spid FORMAT A10
COLUMN stid FORMAT A10

SELECT s.username,
       s.osuser,
       s.sid,
       s.serial#,
       p.spid,
       p.stid,
       s.status
FROM   v$session s,
       v$process p
WHERE  s.paddr = p.addr
AND    s.username IS NOT NULL
ORDER BY s.username, s.osuser;

USERNAME        OSUSER                 SID    SERIAL# SPID       STID       STATUS
--------------- --------------- ---------- ---------- ---------- ---------- --------
SYS             oracle                  35          3 18844      18901      ACTIVE
TEST            oracle                  40         37 18844      19020      INACTIVE

SQL>

Отмена сеансов из Oracle не изменилось, поскольку вы все еще можете определить SID и SERIAL# нужного процесса.

SQL> ALTER SYSTEM KILL SESSION '40, 37';

System altered.

SQL>

То, что мы не должны делать, это использовать команду уничтожения UNIX / Linux, чтобы убить процесс ОС с помощью идентификатора процесса сеанса (SPID), или мы убьем несколько сеансов, а не только тот, который нас интересует.

$ ps -ef | grep 18844 | grep -v grep
oracle   18844     1  1 16:27 ?        00:00:22 ora_u005_db12c
$

 

Рекомендации

Единственная убедительная причина, по которой я слышал об использовании этой функции (многопоточности вместо многопроцессности) в Unix / Linux, - это когда вы объединяете множество экземпляров на один сервер, не используя при этом опцию multitennant. Без многопоточной модели число ОС-процессов может стать очень высоким.

Если бы у вас была некая аппаратная архитектура, которая лучше справлялась с потоками, чем процессы, тогда может быть и некоторая польза. Но это нужно проверять на практике для конкретного случая. 

В среде RAC все узлы должны использовать одну и ту же модель потоков.

Вас заинтересует / Intresting for you:

Хронология активных сеансов в ...
Хронология активных сеансов в ... 2767 просмотров Antoniy Tue, 21 Nov 2017, 13:18:46
Версии лицензий в линейке прод...
Версии лицензий в линейке прод... 6854 просмотров Stas Belkov Tue, 21 Nov 2017, 13:19:55
Как установить Oracle Database...
Как установить Oracle Database... 4058 просмотров Doctor Thu, 03 Feb 2022, 13:48:46
Сравнение баз данных Oracle Da...
Сравнение баз данных Oracle Da... 7992 просмотров sepia Sun, 07 Oct 2018, 06:04:37
Войдите чтобы комментировать