400-090-9964


博客 | 论坛

教学文章

Oracle 12c新特性系列专题讲座—多线程数据库

时间:2019-07-04 来源:

    在12c以前的数据库版本中,在Unix/Linux等环境下。数据库一直是以多进程的方式运行。而从12c版本开始,Oracle在Unix/Linux平台上引入了多线程的概念。该特性是通过参数threaded_execution来控制的,我们可以控制数据库是以多进程模式运行还是以多线程模式运行,该参数默认值是false,代表数据库以传统的多进程模式运行。

    注意在Windows上数据库一直是以多线程的模式来运行的。
    下面,我们将通过实际的案例来了解多线程数据库的运行特点。


数据库以传统的多进程模式运行




1、查看参数的值:
SQL> show parameters threaded_execution

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
threaded_execution                   boolean     FALSE

2、查看后台进程信息,可以看出有很多进程:
[oracle@oracle122 ~]$ ps -ef|grep ora_
oracle    2597     1  0 22:06 ?        00:00:00 ora_pmon_PROD1
oracle    2599     1  0 22:06 ?        00:00:00 ora_clmn_PROD1
oracle    2601     1  0 22:06 ?        00:00:00 ora_psp0_PROD1
oracle    2603     1  0 22:06 ?        00:00:00 ora_vktm_PROD1
oracle    2609     1  0 22:06 ?        00:00:00 ora_gen0_PROD1
oracle    2611     1  0 22:06 ?        00:00:00 ora_mman_PROD1
oracle    2615     1  0 22:06 ?        00:00:00 ora_gen1_PROD1
oracle    2619     1  0 22:06 ?        00:00:00 ora_diag_PROD1
oracle    2621     1  0 22:06 ?        00:00:00 ora_ofsd_PROD1
oracle    2625     1  0 22:06 ?        00:00:00 ora_dbrm_PROD1
oracle    2627     1  0 22:06 ?        00:00:00 ora_vkrm_PROD1
oracle    2629     1  0 22:06 ?        00:00:00 ora_svcb_PROD1
oracle    2631     1  0 22:06 ?        00:00:00 ora_pman_PROD1
oracle    2633     1  0 22:06 ?        00:00:00 ora_dia0_PROD1
oracle    2635     1  0 22:06 ?        00:00:00 ora_dbw0_PROD1
oracle    2637     1  0 22:06 ?        00:00:00 ora_lgwr_PROD1
oracle    2639     1  0 22:06 ?        00:00:00 ora_ckpt_PROD1
oracle    2641     1  0 22:06 ?        00:00:00 ora_smon_PROD1
oracle    2643     1  0 22:06 ?        00:00:00 ora_smco_PROD1
oracle    2645     1  0 22:06 ?        00:00:00 ora_reco_PROD1
oracle    2647     1  0 22:06 ?        00:00:00 ora_w000_PROD1
oracle    2649     1  0 22:06 ?        00:00:00 ora_lreg_PROD1
oracle    2651     1  0 22:06 ?        00:00:00 ora_w001_PROD1
oracle    2653     1  0 22:06 ?        00:00:00 ora_pxmn_PROD1
oracle    2657     1  0 22:06 ?        00:00:01 ora_mmon_PROD1
oracle    2659     1  0 22:06 ?        00:00:00 ora_mmnl_PROD1
oracle    2661     1  0 22:06 ?        00:00:00 ora_d000_PROD1

数据库以多线程模式运行




1、修改参数初始化参数的值,同时重启数据库:
[oracle@oracle122 ~]$ sqlplus '/as  sysdba'
SQL> ALTER SYSTEM SET threaded_execution = true SCOPE = SPFILE;

SQL> startup force
ERROR:
ORA-01017: invalid username/password; logon denied
    当重启数据库的时候系统报错,提示无效的用户名和密码。这是因为我们把数据库修改成以线程模式运行导致的,解决办法就是需要以明确的用户名和密码登录才能够启动数据库:
[oracle@oracle122 ~]$ sqlplus 'sys/oracle as sysdba'
SQL*Plus: Release 12.2.0.1.0 Production on Sat Jan 5 22:12:45 2019
Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup

2、查看后台进程状态:
 [oracle@oracle122 ~]$ ps -ef|grep ora_
oracle    3076     1  0 22:12 ?        00:00:00 ora_pmon_PROD1
oracle    3078     1  1 22:12 ?        00:00:00 ora_u002_PROD1
oracle    3082     1  0 22:12 ?        00:00:00 ora_psp0_PROD1
oracle    3084     1  0 22:12 ?        00:00:00 ora_vktm_PROD1
oracle    3093     1  0 22:12 ?        00:00:00 ora_gen1_PROD1
oracle    3097     1 13 22:12 ?        00:00:07 ora_u006_PROD1
oracle    3101     1  0 22:12 ?        00:00:00 ora_ofsd_PROD1
oracle    3110     1  0 22:12 ?        00:00:00 ora_dbw0_PROD1
oracle    3112     1  0 22:12 ?        00:00:00 ora_lgwr_PROD1
    我们发现后台进程的数量减少了很多。一些后台进程(pmon,dbw,lgwr,psp,vktm)的状态与以前保持一致。但是smon等进程没了。其他background进程归属于ora_uxxx_ 的多线程进程。
3、通过系统视图查看进程状态:
    这里我们可以发现execution_type大部分已经变成了THREAD,我们的比如SMON和CKPT等后台进程也变成了THREAD状态。

SQL>select spid, stid, pname, program, execution_type from v$process order by execution_type, spid, stid;
SPID       STID       PNAME      PROGRAM                        EXECUTION_
---------- ---------- ---------- ------------------------------ ----------
                                 PSEUDO                         NONE
3359       3359       PMON       oracle@oracle12c-1 (PMON)      PROCESS
3365       3365       PSP0       oracle@oracle12c-1 (PSP0)      PROCESS
3367       3367       VKTM       oracle@oracle12c-1 (VKTM)      PROCESS
3393       3393       DBW0       oracle@oracle12c-1 (DBW0)      PROCESS
3361       3361       SCMN       oracle@oracle12c-1 (SCMN)      THREAD
3361       3363       CLMN       oracle@oracle12c-1 (CLMN)      THREAD
3361       3370       GEN0       oracle@oracle12c-1 (GEN0)      THREAD
3361       3374       MMAN       oracle@oracle12c-1 (MMAN)      THREAD
3361       3398       CKPT       oracle@oracle12c-1 (CKPT)      THREAD
3361       3400       SMON       oracle@oracle12c-1 (SMON)      THREAD
……


数据库连接模式




1、通过本地连接,查看连接模式:
    $ sqlplus  SCOTT/TIGER
    查看连接模式:
SQL>  select p.pname, p.program, p.execution_type,s.username
  2  from v$process p,v$session s
  3  where p.ADDR=s.PADDR
  4* order by username;
PNAME      PROGRAM                        EXECUTION_ USERNAME
---------- ------------------------------ ---------- ----------
           oracle@oracle12c-1             THREAD     SCOTT
    可以看出默认以线程模式连接。
2、通过监听连接,查看连接模式:
    以scott用户登录:
    $ sqlplus SCOTT/TIGER@PROD1

    查看进程状态:
SQL>  select p.pname, p.program, p.execution_type,s.username
  2  from v$process p,v$session s
  3  where p.ADDR=s.PADDR
  4* order by username;

PNAME      PROGRAM                        EXECUTION_ USERNAME
---------- ------------------------------ ---------- ----------
           oracle@oracle12c-1             PROCESS    SCOTT
    我们发现竟然还是以进程模式连接。

3、如果以远程的方式连接到数据库想以线程模式连接,需要修改监听参数DEDICATED_THROUGH_BROKER_listener-name(注意该参数中listener-name就是监听的名字,很多人会理解错误,导致试验失败),并重启监听。




 

 

LISTENER =

     (DESCRIPTION_LIST =

       (DESCRIPTION =

         (ADDRESS = (PROTOCOL = TCP)(HOST = oracle12-1)(PORT = 1521))

         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

       )

     )

 

DEDICATED_THROUGH_BROKER_listener=ON      

 

 

 

 
4、再次通过监听连接到数据库,发现新连接上的会话已经变成了线程模式:
    再次以SCOTT用户连接:
    $ sqlplus SCOTT/TIGER@PROD1
    查看进程状态:
SQL>  select p.pname, p.program, p.execution_type,s.username
  2  from v$process p,v$session s
  3  where p.ADDR=s.PADDR
  4* order by username;

PNAME      PROGRAM                        EXECUTION_ USERNAME
---------- ------------------------------ ---------- ----------
           oracle@oracle12c-1             THREAD     SCOTT

    发现变成线程模式连接了。


总结



    

    使用线程模式给数据库系统带来的好处是系统少了很多进程,从而减少了对内存和CPU的使用,节省了系统资源。其工作原理是Oracle会在相同的进程体系架构下派生出若干个线程来响应请求,在线程中可以共享相关的资源,而且各个线程也能够更好的协同工作,提高工作效率。
    多线程模式是Oracle对底层的运行结构做了比较大的改动,具体使用哪种模式我们要根据实际的应用环境来选择,如果多线程模式在实际的应用中表现出色,那么以后Oracle默认的会选择该模式运行。


思考题:
1、An administrator account is granted the CREATE SESSION and SET CONTAINER system privileges.
A multitenant container database (CDB) instant has the following parameter set:
THREADED_EXECUTION = FALSE
Which four statements are true about this administrator establishing connections to root in a CDB that has been opened in read only mode?
A. You can conned as a common user by using the connect statement.
B. You can connect as a local user by using the connect statement.
C. You can connect by using easy connect.
D. You can connect by using OS authentication.
E. You can connect by using a Net Service name.
F. You can connect as a local user by using the SET CONTAINER statement.
Correct Answer:

2、Which three statements are true when t he listener handles connection requests to an Oracle 12c database instance with multithreaded architecture enabled In UNIX?
A. Thread creation must be routed through a dispatcher process
B. The local listener may spawn a now process and have that new process create a thread
C. Each Oracle process runs an SCMN thread.
D. Each multithreaded Oracle process has an SCMN thread.
E. The local listener may pass the request to an existing process which in turn will create a thread.
Correct Answer:
3、Which two are direct benefits of the multiprocess, multithreaded architecture of Oracle Database 12c,when it is enabled?

A. Reduced logical I/O
B. Reduced virtual memory utilization
C. Improved Serial Execution performance
D. Reduced physical I/O
E. Reduced CPU utilization
Answer:

上一期思考题答案:
1、Which two statements are true when row archival management is enabled?
A. The ORA_ARCHIVE_STATE column visibility is controlled by the ROW ARCHIVAL VISIBILITY session parameter.
B. The ORA_ARCHIVE_STATE column is updated manually or by a program that could reference activity tracking columns, to indicate that a row is no longer considered active.
C. The ROW ARCHIVAL VISIBILITY session parameter defaults to active rows only.
D. The ORA_ARCHIVE_STATE column is visible if referenced in t he select list of a query.
E. The ORA_ARCHIVE_STATE column is updated automatically by the Oracle Server based on activity tracking columns, to Indicate that a row is no longer considered active.
Correct Answer: BD
(解析:Oracle仍然是使用隐藏列来实现这个功能的,在启用该特性以后,会自动在表上增加ORA_ARCHIVE_STATE字段,这是一个VARCHAR2(4000)的字段。alter session set ROW ARCHIVAL VISIBILITY = all不是设置这个列的可见性,是列出所有归档的数据。


本篇文章作者介绍:Oracle金牌讲师

北京优技教育科技有限公司
培训机构创始人、Oracle技术首席讲师

自2000年就职于CUUG从事于Oracle的授课和维护工作,经过多年辗转于2006年再度回到CUUG担任Oracle技术讲师,多年的Oracle工作经验,坚持不懈的学习Oracle新的技术,通过举办Oracle技术沙龙(总共累积50多场),向广大Oracle爱好者传播最新、主流的Oracle技术,为推广Oracle认证做了很多工作,每年培训出众多的Oracle技术人才,为Oracle技术推广和Oracle认证普有着杰出的贡献和突出影响力。

“Oracle WDP项目为个人学习Oracle技术提供了良好的学习途径,对Oracle的普及起到了巨大的作用,很多人通过这个途径学到了Oracle的技术,找到了满意的工作,实现了人生的价值。”

版权所有@北京神脑资讯技术有限公司(CUUG,中国UNIX用户协会) Copyright 2017 ALL Rights Reserved 京ICP备11008061号 京公网110108006275号

CUUG旗下网站:www.cuug.com.cn www.cuug.com oracle.cuug.com bbs.cuug.com bd.cuug.com

电话:010-59426307 010-59426319 邮政编码:100089

海淀校区:北京市海淀区紫竹院路88号紫竹花园4号楼D座703(CUUG)

如果您有什么问题,请点击此处进行即时沟通;