В системах 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 все узлы должны использовать одну и ту же модель потоков.