首页 / 数据库 / MySQL / Oracle 12c(12.1)中性能优化&功能增强之通过参数THREADED_EXECTION使用多线程模型
1. 后台UNIX/Linux系统上,Oracle用多进程模型。例如:linux上一个常规安装的数据库会有如下进程列:$ ps -ef | grep [o]ra_oracle 15356 1 0 10:53 ? 00:00:00 ora_pmon_db12coracle 15358 1 0 10:53 ? 00:00:00 ora_psp0_db12coracle 15360 1 8 10:53 ? 00:01:27 ora_vktm_db12coracle 15364 1 0 10:53 ? 00:00:00 ora_gen0_db12coracle 15366 1 0 10:53 ? 00:00:00 ora_mman_db12coracle 15370 1 0 10:53 ? 00:00:00 ora_diag_db12coracle 15372 1 0 10:53 ? 00:00:00 ora_dbrm_db12coracle 15374 1 0 10:53 ? 00:00:00 ora_dia0_db12coracle 15376 1 0 10:53 ? 00:00:00 ora_dbw0_db12coracle 15378 1 010:53 ? 00:00:00 ora_lgwr_db12coracle 15380 1 0 10:53 ? 00:00:00 ora_ckpt_db12coracle 15382 1 0 10:53 ? 00:00:00 ora_smon_db12coracle 15384 1 0 10:53 ? 00:00:00 ora_reco_db12coracle 15386 1 0 10:53 ? 00:00:00 ora_lreg_db12coracle 15388 1 0 10:53 ? 00:00:03 ora_mmon_db12coracle 15390 1 0 10:53 ? 00:00:00 ora_mmnl_db12coracle 15392 1 0 10:53 ? 00:00:00 ora_d000_db12coracle 15394 1 010:53 ? 00:00:00 ora_s000_db12coracle 15407 1 0 10:54 ? 00:00:00 ora_tmon_db12coracle 15409 1 0 10:54 ? 00:00:00 ora_tt00_db12coracle 15411 1 0 10:54 ? 00:00:00 ora_smco_db12coracle 15413 1 0 10:54 ? 00:00:00 ora_fbda_db12coracle 15415 1 0 10:54 ? 00:00:00 ora_aqpc_db12coracle 15419 1 0 10:54 ? 00:00:00 ora_p000_db12coracle 15421 1 0 10:54 ? 00:00:00 ora_p001_db12coracle 15423 1 0 10:54 ? 00:00:00 ora_p002_db12coracle 15425 1 0 10:54 ? 00:00:00 ora_p003_db12coracle 15435 1 0 10:54 ? 00:00:00 ora_cjq0_db12coracle 15459 1 0 10:54 ? 00:00:00 ora_qm02_db12coracle 15463 1 0 10:54 ? 00:00:00 ora_q002_db12coracle 15465 1 0 10:54 ? 00:00:00 ora_q003_db12coracle 15612 1 0 11:04 ? 00:00:00 ora_w000_db12coracle 15679 1 0 11:10 ? 00:00:00 ora_j000_db12coracle 15681 1 0 11:10 ? 00:00:00 ora_j001_db12coracle 15683 1 0 11:10 ? 00:00:00 ora_w001_db12c$即使在多进程模型中,某些个别进程内部运行在多线程模式。相反,在windows系统上,Oracle数据库作为一个多线程进程运行,而每个UNIX/Linux下的进程作为一个或多个线程运行。Oracle12c可以在UNIX/Linux上运行在多线程模式下,就像运行在window上那样。2. THREADED_EXECUTION参数线程模型通过初始化参数THREADED_EXECUTION指定。1) THREADED_EXECUTION=FALSE:为默认值,oracle运行在多进程模式下。2) THREADED_EXECUTION=TRUE: Oracle以多线程模式运行。如果想切换到多线程模式,只需设置THREADED_EXECUTION参数并重启数据库就可以。CONN sys AS SYSDBAALTER SYSTEM SET threaded_execution=TRUESCOPE=SPFILE;SHUTDOWN IMMEDIATE;STARTUP;一旦数据库被重启,我们会发现操作系统进程数减少了很多。$ ps -ef | grep [o]ra_oracle 15839 1 0 11:26 ? 00:00:00 ora_pmon_db12coracle 15841 1 0 11:26 ? 00:00:00 ora_psp0_db12coracle 15843 1 8 11:26 ? 00:00:03 ora_vktm_db12coracle 15847 1 0 11:26 ? 00:00:00 ora_u004_db12coracle 15853 1 34 11:26 ? 00:00:13 ora_u005_db12coracle 15859 1 0 11:26 ? 00:00:00 ora_dbw0_db12c$另外,需将如下参数添加至"$ORACLE_HOME/network/admin/listener.ora"文件中,以允许产生新线程来支持监听产生的连接,记得要用正确监听名替换DEDICATED_THROUGH_BROKER_=ON当需要切换回多进程模型时,只需切换该初始化参数值并重启数据库。CONN sys AS SYSDBAALTER SYSTEM SET threaded_execution=FALSESCOPE=SPFILE;SHUTDOWN IMMEDIATE;STARTUP;记得清楚"listener.ora"文件中的参数。3. OS认证多线程模型不支持OS认证,这是一个特点而不是bug。看前面的例子,使用线程模型时,通过"SYS ASSYSDBA"而不是 "/ AS SYSDBA"连接数据库。试着以OS认证连接库会报错。$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.1.0 Production onThu 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 sysdbaEnter password: Connected to:Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options SQL>文档上说会报错ORA-01031 "insufficientprivileges" 。4. 杀会话视图V$PROCESS包括一个叫STID的新列,该列显示会话的线程ID。SET LINESIZE 140COLUMN username FORMAT A15COLUMN oSUSEr FORMAT A15COLUMN spid FORMAT A10COLUMN stid FORMAT A10 SELECT s.username, s.osuser, s.sid, s.serial#, p.spid, p.stid, s.statusFROM v$session s, v$process pWHERE s.paddr = p.addrAND s.username IS NOT NULLORDER BY s.username, s.osuser; USERNAME OSUSER SID SERIAL# SPID STID STATUS--------------- --------------- -------------------- ---------- ---------- --------SYS oracle 35 3 18844 18901 ACTIVETEST oracle 40 37 18844 19020 INACTIVE SQL>在Oracle内杀会话的方法没变,因为你还是可以找到SID和SERIAL#。SQL> ALTER SYSTEM KILL SESSION "40,37"; System altered. SQL>但一定不要用UNIX/Linux命令杀掉会话进程(SPID)对应的OS进程,否则,我们会杀掉多个会话,而不是我们真正想杀的会话。$ ps -ef | grep 18844 | grep -v greporacle 18844 1 1 16:27 ? 00:00:22 ora_u005_db12c$5. 总结1) 使用该特点的唯一可信理由是将多个实例集成到一个服务器上,同时,没用多宿主数据库选项。因为,如果不用多线程模型,OS进程数将会很高。2) 如果你的硬件架构相对进程而言,更适合处理线程,那么,该特点也许会带来一些好处。3) RAC环境中,各节点必须都用同样的线程模型。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址