ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:152.92KB ,
资源ID:18410218      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18410218.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Oracle事务的完整流程的分析精Word文档格式.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Oracle事务的完整流程的分析精Word文档格式.docx

1、什么是共享服务器?Oracle 还可以接受另一种方式的连接,这称为共享服务器(shared server ,正式的说 法是 多线程服务器(Multi-ThreadedServer 或 MTS 。如果采用这种方式,就不会对每条用户 连接创建另外的线程或新的 UNIX 进程。在共享服务器中, Oracle 使用一个“共享进程”池为 大量用户提供服务。 共享服务器实际上就是一种连接池机制 (例如程序的连接池 。 利用共享 服务器,我们不必为 10000个数据库会话创建 10000个专用服务器(这样进程或线程就太多 了,难于管理 ,而只需建立很少的一部分进程 /线程,顾名思义,这些进程 /线程将由所有

2、会 话共享。这样 Oracle 就能让更多的用户与数据库建立连接,否则很难连接更多用户。如果让 我的机器管理 10000个进程,这个负载肯定会把它压垮,但是管理 100个或者 1 000个进程 还是可以的。 采用共享服务器模式, 共享进程通常与数据库一同启动, 使用 ps 命令可以看到 这个进程。共享服务器连接和专用服务器连接之间有一个重大区别, 与数据库连接的客户进程不会 与共享服务器直接通信,但专用服务器则不然,客户进程会与专用服务器直接通信。之所以 不能与共享服务器直接对话,原因就在于这个服务器进程是共享的。为了共享这些进程,还 需要另外一种机制,通过这种机制才能与共享服务器进程“对话”

3、 。为此, Oracle 使用了一个 或一组称为 调度器(dispatcher ,也称分派器 的进程。客户进程通过网络与一个调度器进程 通信。这个调度器进程将客户的请求放入 SGA 中 UGA 中的请求队列(这也是 SGA 的用途之 一 。 第一个空闲的共享服务器会得到这个请求, 并进行处理 (例如, 请求可能是 UPDATE T SET X =X+5 WHERE Y = 2 。完成这个命令后,共享服务器会把响应放在原调度器(即接收请求的 调度器的响应队列中。调度器进程一直在监听这个队列,发现有结果后,就会把结果传给 客户。一 . oracle客户端与服务端的连接首先一个用户进程发出一个连接请

4、求 , 如果使用的是主机命名或者是本地服务命中的主 机名使用的是机器名 (非 IP 地址 ,那么这个请求都会通过 DNS 服务器或 HOST 文件的服务名 解析然后传送到 ORACLE 监听进程 , 监听进程接收到用户请求后会采取两种方式来处理这个用 户请求。C:/Documents and Settings/Administratorsqlplus sys/aibotest as sysdbaSQL*Plus: Release 10.2.0.4.0 - Production on 星期一 8月 16 10:51:15 2010Copyright (c 1982, 2007, Oracle.

5、All Rights Reserved.连接到 :Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQLsys/aibo是用户名密码, test 是 TNS 服务名, TNS 代表透明网络底层 (Transparent Network Substrate , 这是 Oracle 客户端处理远程连接的 “基础” 软件, 有了它才有可能建立对等通信。 TN

6、S 连接串告诉 Oracle 软件如何与远程数据库连接。一般地,你的机器上运行的客户软件会 读取一个 tnsnames.ora 文件。这是一个纯文本的配置文件,内容例如:TEST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP(HOST = 192.168.2.10(PORT = 1521(CONNECT_DATA =(SERVER = DEDICATED(SERVICE_NAME = testOracle 客户端软件可以从 tns 连接串 TEST 得到有用的信息,也就是主机名,主机监听 的端口号,主机所连接的数据库服务名,服务名表示具有公共属性、服务级阈

7、值和优先级的 应用组。提供服务的实例数量对应用是透明的,每个数据库实例可以向监听器注册,表示要 提供多个服务。 所以, 服务就映射到物理的数据库实例, 并允许 DBA 为之关联阈值和优先级。 现在 oracle 客户端通过 tns 连接串可以知道要连接到哪里,他会与主机 (HOST = 192.168.2.10 在端口,打开一条 tcp/ip socket 连接;如果服务端恰好配置了 oracle net ,并且 有一个监听进程在 1521端口监听连接请求,就会受到这个连接请求。在网络环境中,我们 会一个 tns 监听进程,就是这个监听进程可以让我们客户端与服务器物理连接。当他接受到 这个请求

8、后,会根据自己的配置文件处理这个请求连接,可能会拒绝请求(例如,因为没有 这样的数据库,或者可能我们的 IP 地址受到限制,不允许连接这个主机 ,也可能会接受请 求,并真正建立连接。专用服务器模式下 :监听进程接收到用户进程请求后,产生一个新的专用服务器进程, (在 UNIX 上,这是通过 fork(和 exec(系统调用做到的 (在 UNIX 中,要在初始化之后创建新 进程,惟一的办法就是通过 fork( ; 在 Windows 上,监听器进程请求数据库进程为连接创 建一个新线程。一旦创建了这个线程,客户就会“重定向”到该线程,相应地就能建立物理 连接 。 并且将对用户进程的所有控制信息传给

9、此服务器进程, 也就是说新建的服务器进程继 承了监听进程的信息,然后服务器进程给用户进程发一个 RESEND 包,通知用户进程可以开 始给它发信息了,用户进程给这个新建的服务器进程发一个 CONNECT 包,服务器进程再以ACCEPT 包回应用户进程,致此, 用户进程正式与服务器进程确定连接 , 我们把这种连接叫做 HAND-OFF 连接,也叫转换连接 .另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程, 这个服 务器进程选用一个 TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监 听进程再将此信息传给用户进程,用户进程使用这个端口给服务器进程发送一个

10、CONNECT 包,服务器进程再给用户进程发送一个 ACCEPT 包,致此,用户进程可以正式向服务器进程 发送信息了。这种方式我们叫做重定向连接。 HAND-OFF 连接需要系统平台具有进程继承的 能力,为了使 WINDOWS NT/2000支持 HAND-OFF 必须在HKEY_LOCAL_MACHINESOFTWAREORACLEHOMEX中设置 USE_SHARED_SOCKET。共享服务器模式下 :只有重定向连接的方式, 工作方式是监听进程接收到用户进程的请 求后产生一个新的调度进程,这个调度进程选用一个 TCP/IP端口来控制与用户进程的交互, 然后将此信息回传给监听进程,监听进程再

11、将此信息传给用户进程,用户进程使用这个端口 给调度进程发送一个 CONNECT 包,调度进程再给用户进程发送一个 ACCEPT 包,致此,用户 进程可以正式向调度进程发送信息了。可以通过设置 MAX_DISPIATCHERS这个参数来确定调度进程的最大数目, 如果调度进程 的个数已经达到了最大,或者已有的调度进程不是满负荷,监听进程将不再创建新的调度进 程, 而是让其中一个调度进程选用一个 TCP/IP端口来与此用户进程交互。 调度进程每接收一 个用户进程请求都会在监听进程处作一个登记, 以便监听进程能够均衡每个调度进程的负荷, 所有的用户进程请求将分别在有限的调度进程中排队,所有调度进程再顺

12、序的把各自队列中 的部分用户进程请求放入同一个请求队列, 等候多个 ORACLE 的共享服务器进程进行处理 (可 以通过 SHARED_SERVERS参数设置共享服务器进程的个数 , 也就是说所有的调度进程共享同 一个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列,也 就是说有多少调度进程就有多少响应队列,然后各个调度进程从各自的响应队列中将结果取 出再返回给用户进程。到目前为止,用户进程已经把需要执行的 sql 提交到 oracle 的服务进程,那 oracle 是如 何处理这个进程的呢

13、?oracle 服务进程如何处理用户进程的请求服务器进程在完成用户进程的请求过程中,主要完成如下 7个任务:0.sql 语句的解析1. 数据块的读入 db buffer2. 记日志3. 为事务建立回滚段4. 本事务修改数据块5. 放入 dirty list6. 用户 commit 或 rollback下面要讲 oracle 服务器进程如可处理用户进程的请求,当一用户进程提交一个 sql 时: update temp set a=a*2;首先 oracle 服务器进程从用户进程把信息接收到后,在 PGA 中就 要此进程分配所需内存,存储相关的信息,如在会话内存存储相关的登录信息等;服务器进 程把

14、这个 sql 语句的字符转化为 ASCII 等效数字码,接着这个 ASCII 码被传递给一个 HASH 函数,并返回一个 hash 值,然后服务器进程将到 shared pool 中的 library cache 中去查找 是否存在相同的 hash 值,如果存在,服务器进程将使用这条语句已高速缓存在 SHARED POOL 的 library cache中的已分析过的版本来执行,如果不存在,服务器进程将在 CGA 中,配合UGA 内容对 sql ,进行语法分析,首先检查语法的正确性,接着对语句中涉及的表,索引,视 图等对象进行解析, 并对照数据字典检查这些对象的名称以及相关结构, 并根据 OR

15、ACLE 选用 的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个 执行计划或从存储大纲中选用一个执行计划,然后再用数据字典核对此用户对相应对象的执 行权限, 最后生成一个编译代码。 ORACLE 将这条 sql 语句的本身实际文本、 HASH 值、 编译代 码、与此语名相关联的任何统计数据和该语句的执行计划缓存在 SHARED POOL的 library cache 中。服务器进程通过 SHARED POOL 锁存器(shared pool latch 来申请可以向哪些共 享 PL/SQL区中缓存这此内容,也就是说被 SHARED POOL锁存器锁定的 PL/S

16、QL区中的块不可 被覆盖,因为这些块可能被其它进程所使用。在 SQL 分析阶段将用到 LIBRARY CACHE,从数 据字典中核对表、视图等结构的时候,需要将数据字典从磁盘读入 LIBRARY CACHE,因此, 在读入之前也要使用 LIBRARY CACHE锁存器(library cache pin, library cache lock来 申请用于缓存数据字典。到现在为止, 这个 sql 语句已经被编译成可执行的代码了, 但还不知道要操作哪些数据, 所以服务器进程还要为这个 sql 准备预处理数据。Oracle 处理数据,都需要把数据读取到内存中(即 db buffer中 ,首先服务器进

17、程要 判断所需数据是否在 db buffer存在,如果存在且可用,则直接获取该数据,同时根据 LRU 算法增加其访问计数; 如果 buffer 不存在所需数据, 则要从数据文件上读取。 首先服务器进 程将在表头部请求 TM 锁 (保证此事务执行过程其他用户不能修改表的结构 , 如果成功加 TM 锁, 再请求一些行级锁 (TX 锁 , 如果 TM 、 TX 锁都成功加锁, 那么才开始从数据文件读数据, 在读数据之前,要先为读取的文件准备好 buffer 空间。服务器进程需要扫面 LRU list寻找free db buffer,扫描的过程中,服务器进程会把发现的所有已经被修改过的 db buff

18、er注 册到 dirty list中,这些 dirty buffer会通过 dbwr 的触发条件,随后会被写出到数据文件,找到了足够的空闲 buffer ,就可以把请求的数据行所在的数据块放入到 db buffer的空闲区域或者覆盖已经被 挤出 LRU list的非脏数据块缓冲区,并排列在 LRU list的头部,也就是在数据块放入 DB BUFFER 之前也是要先申请 db buffer中的锁存器,成功加锁后,才能读数据到 db buffer。 2. 记日志现在数据已经被读入到 db buffer了,现在服务器进程将该语句所影响的并被读入 db buffer 中的这些行数据的 rowid 及

19、要更新的原值和新值及 scn 等信息从 PGA 逐条的写入 redo log buffer中。在写入 redo log buffer之前也要事先请求 redo log buffer的锁存器,成 功加锁后才开始写入,当写入达到 redo log buffer 大小的三分之一或写入量达到 1M 或超过 三秒后或发生检查点时或者 dbwr 之前发生,都会触发 lgwr 进程把 redo log buffer的数据 写入磁盘上的 redo file文件中(这个时候会产生 log file sync等待事件 ,已经被写入 redo file 的 redo log buffer 所持有的锁存器会被释放,并

20、可被后来的写入信息覆盖, redo log buffer是循环使用的。 Redo file也是循环使用的,当一个 redo file 写满后, lgwr 进程会自动切换到下一 redo file(这个时候可能出现 log file switch(checkpoint complete 等待事件 。如果是归档模式,归档进程还要将前一个写满的 redo file 文件的内 容写到归档日志文件中(这个时候可能出现 log file switch(archiving needed 。 3. 为事务建立回滚段在完成本事务所有相关的 redo log buffer之后,服务器进程开始改写这个 db buf

21、fer的块头部事务列表并写入 scn , 然后 copy 包含这个块的头部事务列表及 scn 信息的数据副本 放入回滚段中,将这时回滚段中的信息称为数据块的“前映像“,这个”前映像“用于以后 的回滚、 恢复和一致性读。 (回滚段可以存储在专门的回滚表空间中, 这个表空间由一个或多 个物理文件组成,并专用于回滚表空间,回滚段也可在其它表空间中的数据文件中开辟。 4. 本事务修改数据块准备工作都已经做好了,现在可以改写 db buffer块的数据内容了,并在块的头部写入回滚 段的地址。如果一个行数据多次 update 而未 commit ,则在回滚段中将会有多个“前映像“,除了 第一个”前映像“含

22、有 scn 信息外,其他每个“前映像“的头部都有 scn 信息和“前前映像” 回滚段地址。一个 update 只对应一个 scn ,然后服务器进程将在 dirty list中建立一条指 向此 db buffer块的指针(方便 dbwr 进程可以找到 dirty list的 db buffer数据块并写入 数据文件中 。接着服务器进程会从数据文件中继续读入第二个数据块, 重复前一数据块的动作, 数据 块的读入、记日志、建立回滚段、修改数据块、放入 dirty list 。当 dirty queue 的长度达 到阀值(一般是 25% ,服务器进程将通知 dbwr 把脏数据写出,就是释放 db bu

23、ffer上的锁 存器,腾出更多的 free db buffer。前面一直都是在说明 oracle 一次读一个数据块,其实 oracle 可以一次读入多个数据块(db_file_multiblock_read_count来设置一次读入块的个 数说明:在预处理的数据已经缓存在 db buffer 或刚刚被从数据文件读入到 db buffer 中,就要 根据 sql 语句的类型来决定接下来如何操作。1. 如果是 select 语句,则要查看 db buffer块的头部是否有事务,如果有事务,则从回 滚段中读取数据;如果没有事务,则比较 select 的 scn 和 db buffer 块头部的 sc

24、n ,如果前 者小于后者,仍然要从回滚段中读取数据;如果前者大于后者,说明这是一非脏缓存,可以 直接读取这个 db buffer块的中内容。2. 如果是 DML 操作, 则即使在 db buffer 中找到一个没有事务, 而且 SCN 比自己小的非脏 缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功才能进行后续动 作,如果不成功,则要等待前面的进程解锁后才能进行动作(这个时候阻塞是 tx 锁阻塞 。 6. 用户 commit 或 rollback到现在为止,数据已经在 db buffer或数据文件中修改完成,但是否要永久写到数文件 中,要由用户来决定 commit (保存更改

25、到数据文件和 rollback (撤销数据的更改 ,下面 来看看在 commit 和 rollback 时, oracle 都在做什么。用户执行 commit 命令只有当 sql 语句所影响的所有行所在的最后一个块被读入 db buffer 并且重做信息被写 入 redo log buffer(仅指日志缓冲区,而不包括日志文件之后,用户才可以发去 commit 命令, commit 触发 lgwr 进程,但不强制立即 dbwr 来释放所有相应 db buffer 块的锁(也就 是 no-force-at-commit, 即提交不强制写 ,也就是说有可能虽然已经 commit 了,但在随后 的一

26、段时间内 dbwr 还在写这条 sql 语句所涉及的数据块。表头部的行锁并不在 commit 之后 立即释放, 而是要等 dbwr 进程完成之后才释放, 这就可能会出现一个用户请求另一用户已经 commit 的资源不成功的现象。A . 从 Commit 和 dbwr 进程结束之间的时间很短,如果恰巧在 commit 之后,dbwr 未结束之 前断电,因为 commit 之后的数据已经属于 数据文件的内容,但这部分文件没有完全写入到数据文件中。所以需要前滚。由于 commit 已经触发 lgwr,这些所有未来得及写入数据文件的更改会在实例重启后,由 smon 进程根据 重做日志文件来前滚,完成之

27、前 commit 未完成的工作(即把更改写入数据文件) 。 B. 如果未 commit 就断电了,因为数据已经在 db buffer 更改了,没有 commit,说明这部 分数据不属于数据文件,由于 dbwr 之前触发 lgwr(也就是只要数据更改,肯定要先有 log) , 所有 DBWR 在数据文件上的修改都会被先一步记入重做日志文件,实例重启后,SMON 进程再 根据重做日志文件来回滚。 其实 smon 的前滚回滚是根据检查点来完成的,当一个全部检查点发生的时候,首先让 LGWR 进程将 redo log buffer 中的所有缓冲(包含未提交的重做信息)写入重做日志文件, 然后让 dbw

28、r 进程将 db buffer 已提交的缓冲写入数据文件(不强制写未提交的) 。然后更新 控制文件和数据文件头部的 SCN,表明当前数据库是一致的,在相邻的两个检查点之间有很 多事务,有提交和未提交的。像前面的前滚回滚比较完整的说法是如下的说明: A. 发生检查点之前断电,并且当时有一个未提交的改变正在进行,实例重启之后,SMON 进程将从上一个检查点开始核对这个检查点之后记录在重做日志文件中已提交的和未提交改 变,因为 dbwr 之前会触发 lgwr,所以 dbwr 对数据文件的修改一定会被先记录在重做日志文 件中。因此,断电前被 DBWN 写进数据文件的改变将通过重做日志文件中的记录进行还

29、原,叫 做回滚, B. 如果断电时有一个已提交,但 dbwr 动作还没有完全完成的改变存在,因为已经提交, 提交会触发 lgwr 进程,所以不管 dbwr 动作是否已完成,该语句将要影响的行及其产生的结 果一定已经记录在重做日志文件中了,则实例重启后,SMON 进程根据重做日志文件进行前滚 实例失败后用于恢复的时间由两个检查点之间的间隔大小来决定,可以通个四个参数设置检 查点执行的频率: Log_checkpoint_interval: 决 定 两个 检 查点 之间 写入 重 做日 志 文件 的 系统物 理 块 (redo blocks的大小,默认值是 0,无限制 log_checkpoint

30、_timeout: 决定了两个检查点之间的时间长度(秒) ,默认值是 1800s fast_start_io_target:决定了用于恢复时需要处理的块的多少,默认值是 0,无限制 fast_start_mttr_target:直接决定了用于恢复的时间的长短,默认值是 0,无限制 (SMON 进程执行的前滚和回滚与用户的回滚是不同的, SMON 是根据重做日志文件进行前滚或 回滚,而用户的回滚一定是根据回滚段的内容进行回滚的。在这里要说一下回滚段存储的数 据,假如是 delete 操作,则回滚段将会记录整个行的数据,假如是 update,则回滚段只记录 被修改了的字段的变化前的数据(前映像) ,也就是没有被修改的字段是不会被记录的,假如 是 insert,则回滚段只记录插入记录的 rowid。这样假如事务提交,那回滚段中简单标记该 事务已经提交;假如是回退,则如果操作是 delete,回退的时候把回滚段中数据重新写回数 据块,操作如果是 update,则把变化前数据修改回去,操作如果是 insert,则根据记录的 rowid 把该记录删除。 ) 用户执行 rollback 如果用户 rollback,则服务器进程会根据数据文件块和 DB BUFFER 中块的头部的事务 列表和 SCN 以及回滚段地址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前 数据文件中已修改

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1