zoukankan      html  css  js  c++  java
  • Oracle12c(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_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  010: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  010: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下的进程作为一个或多个线程运行。Oracle12c可以在UNIX/Linux上运行在多线程模式下,就像运行在window上那样。

    2.   THREADED_EXECUTION参数

    线程模型通过初始化参数THREADED_EXECUTION指定。

    1)   THREADED_EXECUTION=FALSE:为默认值,oracle运行在多进程模式下。

    2)   THREADED_EXECUTION=TRUE: Oracle以多线程模式运行。

    如果想切换到多线程模式,只需设置THREADED_EXECUTION参数并重启数据库就可以。

    CONN sys AS SYSDBA

    ALTER 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_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=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 sysdba

    Enter password:

    Connected to:

    Oracle Database 12c Enterprise EditionRelease 12.1.0.1.0 - 64bit Production

    With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

    SQL>

    文档上说会报错ORA-01031 "insufficientprivileges" 。

    4.   杀会话

    视图V$PROCESS包括一个叫STID的新列,该列显示会话的线程ID。

    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)对应的OS进程,否则,我们会杀掉多个会话,而不是我们真正想杀的会话。

    $ ps -ef | grep 18844 | grep -v grep

    oracle  18844     1  1 16:27 ?        00:00:22 ora_u005_db12c

    $

    5.   总结

    1)   使用该特点的唯一可信理由是将多个实例集成到一个服务器上,同时,没用多宿主数据库选项。因为,如果不用多线程模型,OS进程数将会很高。

    2)   如果你的硬件架构相对进程而言,更适合处理线程,那么,该特点也许会带来一些好处。

    3)   RAC环境中,各节点必须都用同样的线程模型。

  • 相关阅读:
    springboot中如何向redis缓存中存入数据
    elasticSearch索引库查询的相关方法
    java客户端的elasticSearch索引库的相关操作
    lucene索引的增、删、改
    lucene的索引查询
    框架
    GG
    总结
    阿里的代码规范检查工具
    传统架构与SOA架构的区别和特点:
  • 原文地址:https://www.cnblogs.com/lhdz_bj/p/8979644.html
Copyright © 2011-2022 走看看