zoukankan      html  css  js  c++  java
  • Oracle数据库体系结构(3)数据库进程

    一、Oracle进程概述

    在oracle中进程分为用户进程(User Process)、服务器进程(server process)和后天进程3种。

    1.用户进程:当用户连接到数据库执行一个应用程序是,会创建一个用户进程来完成用户所指定的任务。

                      与用户进程相关的概念有:连接:是指用户进程与数据库实例之间的一条通信路径。

                                                          会话:是指用户到数据库的指定连接。

    2.服务器进程:是有oracle自身创建,用于处理连接到数据库实例的用户进程所提出的请求。用户进程只有通过服务器进程才能实现对数据库的访问和操作。

                         服务器进程的主要任务有  解析并执行用户提交的SQL语句和PL/SQL程序。

                                                            对数据的操作

                                                           将用户改变数据库的信息写入日志缓冲区

                                                           将查询或执行后的结果数据返回给用户进程

    3.后台进程:为了保证oracle数据库在任意一个时刻都可以处理多用户的并发请求,oracle启动了一些相互独立的附加进程。

                       后台进程的主要作用:在内存与磁盘之间进行I/O操作

                                                     监视各个服务器的进程状态

                                                     协调各个服务器进程的任务

                                                     维护系统性能和可靠性

    二、oracle服务器进程

    oracle数据库服务器进程分为专用服务器进程(Dedicated server Processes)和共享服务器进程(Shared Server Process)两种。

    专用服务器进程专门为一个用户进程提供服务,而共享服务器进程为多个用户进程提供服务。另外在oracle11G中又增加了一个新服务器结构叫数据库驻留连接池。

    1.专用服务器结构:各个专用服务器之间是相互独立的,它们之间没有数据共享。

    有些情况下需要指明使用专用服务器进程:

       在进行批处理和大任务操作时。

       使用RMAN进行数据库备份、恢复及执行数据库启动和停止时

    专用服务器进程的工作过程:

       用户进程向数据库实例发出连接请求-——>位于服务器中的Oracle监听程序探测到用户进程请求后,验证用户名和口令,通过后设立一个专用服务器进程-——>用户提交一个SQL语句

       专用服务器进行首先判断去SQL工作区(共享池中)是否存在类似的SQL语句。如果不存在就分配新空间,然后进行解析,包括验证语法等。同时将语句的私有数据和信息保存到PGA中的私有SQL工作区——>

       解析完成后,服务器开始在高速缓冲区中寻找SQL语句中请求的数据,如果没有存在高速缓冲区中,还需要从数据文件中读取到高速缓冲区中——>如果SQL语句对数据进行更改,尽在高速缓冲区中对数据进行更改,并且将生成的重做记录保存在重做日志缓冲区中

      将来有LGWR写入到重做日志中,由DBWR将脏缓存块的数据写入到数据文件中——>专业服务器进程返回结果给用户进程。

    2.共享服务器进程:即一个服务能为多个用户进程共享。

      共享服务器进程的工作原理是:监听程序监听到一个用户进城后,首先检查该请求是否可以使用共享服务器进程,如果可以监听程序将符合条件的负载最小的调度进程,然后用户进程直接与该调度进程通信。当用户请求被

      调度进程放入SGA中的一个先进先出的请求队列中。当有空闲的服务器进程时,该服务器进行从请求队列中取出一个“请求”进行处理,将处理的结果放到一个响应队列中,这其中一个调度进程对应一个响应队列。

      最后调度进程从自己的队列中取出结果返回给用户进程。

    工作流程:

       用户进程连接数据库——>oracle监听程序对验证用户名和口令,验证通过后分配一个调度进程,用户进程与调度进程直接进行通信。——>用户提交一条SQL语句,调度进程将SQL语句放入请求队列当中,同时也将调度进程ID也存入到请求队列——>

       当某个服务器进程空闲的时候,从请求队列中取出一个处理后的SQL语句,并对语句进行解析和处理,得到它锁请求的数据。——>共享服务器进行将请求结果放入到响应队列中。——>调度进程定期检查自己的响应队列,如果有发现自己处理啊的结果,

       它通过放入到队列中的调度进程ID来判断是否是自己处理的结果——>如果是,就将结果返回给用户进程。

    3.共享服务器进程设置于管理

    (1)

    可以用过设计数据初始化参数文件中的下列参数或在数据运行时动态设置下列参数,是数据库工作在共享服务器模式下:

    SHARED_SERVERS:启动共享服务器进程的最小数量

    MAX_SHARED_SERVERS:能够同时运行的共享服务器进行的最大数量

    SHARED_SERVER_SESSIONS:共享服务器模式下能够同时运行的用户会话数

    DISPATCHERS:配置共享服务器模式下的调度进程

    MAX_DISPATCHERS:共享服务器模式下调度进程最大数量

    CIRCUITS:所有网络会话使用的虚拟线路数量

    首先SHARED_SERVERS参数,如果初始化文件中没有SHARED_SERVERS参数或者SHARED_SERVERS=0则数据库启动后运行的是专用服务器进程模式,如果需要运行共享服务器进程模式则需要设置SHARED_SERVERs大于0的值。

    可以使用alter system set SHARED_SERVERS=3;alter system set SHARED_SERVERS=0;在这里如果将SHARED_SERVERS设置为0的话,数据库服务器并不能马上进入专用服务器进程模式,需要等待当前的共享服务器进程全部连接结束

    后才启用。如果将MAX_SHARED_SERVERS也设置0,那么将马上进入专用模式。

    如果SHARED_SERVERS大于0,而且没有配置DISPATCHERS时数据库将自动创建一个基于TCP协议的调度进程。

    (2)确定数据库服务器的运行模式

    只要查询相关设置参数就可以确定。

    例如

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    max_shared_servers integer
    shared_servers integer 3
    

      

    SQL> show parameter dispatchers;
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    dispatchers                          string      (PROTOCOL=TCP) (SERVICE=orclXD
                                                     B)
    max_dispatchers                      integer
    

      (3)查询数据库中共享服务器的数量

    通过查询动态性能视图可以查看服务器进程的状态。例

    SQL> select * from V$SHARED_SERVER;
    
    NAME PADDR            STATUS             MESSAGES      BYTES     BREAKS
    ---- ---------------- ---------------- ---------- ---------- ----------
    CIRCUIT                IDLE       BUSY     IN_NET    OUT_NET   REQUESTS
    ---------------- ---------- ---------- ---------- ---------- ----------
    S000 000007FF944D7D00 WAIT(COMMON)              0          0          0
    00                   118258          0          0          0          0
    
    S001 000007FF944E0080 WAIT(COMMON)              0          0          0
    00                    59605          1          0          0          0
    
    S002 000007FF944E2160 WAIT(COMMON)              0          0          0
    00                    59603          0          0          0          0
    

      (4)查询数据库中调度进程

    SQL> select NAME,NETWORK from V$DISPATCHER;

    NAME
    ----
    NETWORK
    --------------------------------------------------------------------------------

    D000
    (ADDRESS=(PROTOCOL=tcp)(HOST=PC-20130419GRER)(PORT=57564))

      (5)改变共享服务器进程数量

    SQL> alter system set shared_servers=5;
    

      这个共享服务器的进程数量应该通过检查共享服务器的使用情况来决定

    SQL> select NAME,(BUSY/(BUSY+IDLE)) from V$SHARED_SERVER;
    
    NAME (BUSY/(BUSY+IDLE))
    ---- ------------------
    S000                  0
    S001         9.3207E-06
    S002                  0
    S003                  0
    S004                  0
    

      (6)增加调度进程数量

    SQL> alter system set dispatchers="(PROTOCOL=TCP)(DISP=4)(PROTOCOL=IPC)(DISP=2)";
    

      (7)关闭调度进程

    SQL> alter system shutdown immediate 'D002';
    
    系统已更改。
    

      查看用户进程请求道服务器的类型

    SQL> select  sid,username,server from v$session ;
    
           SID USERNAME                       SERVER
    ---------- ------------------------------ ---------
             1                                DEDICATED
             2                                DEDICATED
             3                                DEDICATED
             4                                DEDICATED
             8                                DEDICATED
            10 SYS                            DEDICATED
            63 SYSTEM                         DEDICATED
            64                                DEDICATED
            65                                DEDICATED
            66                                DEDICATED
            70                                DEDICATED
    

     (9)修改用户的连接类型

    tnsnames.ora文件
    ORCL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl)
        )
      )
    

      

    4.数据库驻留连接池

    (1)基本概念:数据库驻留连接池(DRCP)是为典型的web应用提供到数据库服务器的连接,这些连接的时间通常比较短。数据库驻留连接池等价于数据库服务器进程与数据库会话的结合。

    (2)合适使用数据库驻留连接池

            数据服务器内存小,而客户端连接数巨大

           客户端应用比较类似,能够共享或者重用会话。

           客户端的连接时间很短

          会话不需要跨客户端进行

          

    5.数据库驻留连接池的管理

    (1)启动数据库驻留连接池

    Oracle包含一个默认的驻留连接池SYS_DEFAULT_CONNECTION_POOL,该连接池初始状态下并没有启动的,需要显示的启用。

    可以查询数据字典DBA_CPOOL_INFO查看连接池的状态。

    SQL> select connection_pool,status from dba_cpool_info;
    
    CONNECTION_POOL
    --------------------------------------------------------------------------------
    
    STATUS
    ----------------
    SYS_DEFAULT_CONNECTION_POOL
    INACTIVE
    

      启用第一步  

     execute dbms_connection_pool.start_pool;

    如果是专用服务器连接,则SERVER=DEDICATED,如果是DRCP连接,则SEVER=POOLED。如果在tnsnames.ora中指定了SERVER=POOLED,但并没有在实例中启动DRCP,则当客户请求连接时,DB会报ORA-12520错误。如果要指定客户端请求到DRCP,则客户端的tnsnames.ora中的连接字符串必须指定连接类型是POOLED,配置方式如下所示:
    dhcp11g =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.5.26)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = POOLED)
    (SERVICE_NAME = dbtest)
    )
    )

    停用DRCP

    执行exec dbms_connection_pool.stop_pool();

    6.使用DBCA配置数据服务器工作模式

    使用datebase configuration assistant

    点击 下一步选择配置数据库选件,下一步

    选择专业服务器进程

    三、oracle后台进程

    oracle实例的后台进程包括写入进程(DBWR)日志写入进程(LGWR)检查点进程(CKPT)系统监控进程(SMON)进程监控进程(PMON)归档进程(ARCH)恢复进程(RECO)所进程(LCKn)调度进程(Dnnn)

    其中写入进程(DBWR)日志写入进程(LGWR)检查点进程(CKPT)系统监控进程(SMON)进程监控进程(PMON)是必须的。

    1.DBWR:负责将更改的数据从数据库缓冲区高速缓存写入数据文件,保证了数据高速缓存区有更多的空闲缓存块,提高了缓存命中率。

     当满足一下条件的时候DBWR进程将启动,将高速缓冲区中的脏数据写入数据文件

           服务器搜索了一个数量的缓存块后还是没有搜索到可用的空闲缓存块,此时DBWR将会启动

          检查点发生时

          当数据高速缓存区中的LRU列表长度达到初始化参数DB_BLOCK_WRITE_BATCH指定值的一半

     2.LGWR:负责将日志缓冲区中的数据写入重做日志,由于COMMIT操作依赖于LGWR写回日志(commit操作触发LGWR将日志缓冲区数据写入重做日志),因此系统性能容易受到LGWR的影响。应该是DBWR通知LGWR先完成相关工作,然后DBWR才开始工作。

     当满足一下条件的时候LGWR进程将启动

          用户通过commit语句提交当前事务

          重做日志缓冲区写满1/3

          DBWR进程开始写脏缓存块写入数据文件

    oracle数据库对事务的提交采用快速提交和组提交两种机制

         快速提交:当用户发出commit语句的时候,LGWR进程会立即将一条提交记录写入重做日志文件中,然后开始写入与该事务相关的重做信息。此时的脏缓存块并不会立即写到数据文件。

        子提交:如果数据库中存储多个事务,则LGWR进程一次性奖重做日志缓存区的写入重做日志文件中,而不管事务是否已经提交

    3.CKPT 检查点进程:负责向DBWR进程发送信号,要求执行一次检查点,并更新数据库的所有数据和控制文件。CheckPoint(检查点),是指有DBWR进程将所有修改过的数据缓冲区写回数据文件。CKPT是可选的,如果没有CKPT进程,则有LGWR代行这些任务。 

    它的作用:更新控制文件与数据文件的头部,使其同步。 触发DBWR进程

    检查点的级别:数据库检查点

                         表空间检查点

                         时间检查点

    4.SMON:系统监控进程,负责在实例启动的时候恢复实例。如果由于某种原因数据库崩溃了,那么没有来得及将写入磁盘的数据都将丢失,这样的话会造成已经提交的数据没有真正写入数据文件而丢失。

                   SMON恢复实例的步骤:

                   (1)执行前滚,将重做日志里已经写入到重做日志文件但数据还没有写到数据文件的已经提交的数据写入数据文件。

                  (2)在前滚完成后,立即打开数据库

                  (3)回滚没有提交的事务。

    5.PMON:进程监控进程。主要工作负责清除死掉的进程。PMON还负责重启失败的调度程。释放资源。

    这些原理学习的时候很头疼,看了很多遍,希望自己也能好好的想想,理理通。慢慢消化



     

  • 相关阅读:
    利用国内的源安装 Python第三方库
    Python 算法(1) 快速排序
    Python 算法(2) 哈夫曼编码 Huffman Encoding
    Python sql注入 过滤字符串的非法字符
    tesseract中文语言文件包 下载
    python 多线程爬虫 实例
    Python 爬虫实例(5)—— 爬取爱奇艺视频电视剧的链接(2017-06-30 10:37)
    Django的ORM中如何判断查询结果是否为空,判断django中的orm为空
    Python 爬虫实例(4)—— 爬取网易新闻
    NLTK在自然语言处理
  • 原文地址:https://www.cnblogs.com/evencao/p/3159230.html
Copyright © 2011-2022 走看看