Oracle Update 数据

Client login

1.SQL Plus请求使用TCP/IP 连接 指定TNS服务名 如 ubuntu 。Client process读取tnsnames.ora file 向指定的主机发送数据包

2. Server 端接受请求 监听器进程获取客户端发过来的TNS数据包。检查配置文件,符合配置则调用fork() 生成子进程

3. 子进程收集本进程所在的主机名、IP地址及进程号等信息,按照参数文件申请用一小块PGA内存。

4. 这时子进程在这里华丽的变身为Server process 。 此时与监视器进程通讯告诉已经做好提供服务的准备。

5. 监听进程收到Server process的信息后。将Client 安全审核信息发给Server process

6. 假如以 as sysdba 登录。检查用户是否在口令文件中存在。否则进行下一部审核。

7. 前台进程查询SGA中share pool 中缓存的USER$、PROFILE$等数据字典,校验用户名密码是否合法,如果用户密码错误 传播异常退出,正确则登录检测是否有schema 级别trigger 如不符合trigger则传播异常退出。

8. 成功建立Session,Client直接与Server通信。Server申请UGA 到PGA中。Client可以与Oracle对话

==================================================================================================

Client UPDATE

Server 收到update ttt set salary=100 where name=‘iubuntu‘;

1. SQL 语句解析 找到效率最高的计划
   1.Oracle将SQL语句转成SCII码(包括空格。大小写同样敏感),再使用ASCII码通过HASH函数生成一个sql_hash值,尝试去解析这个HASH值
   2.首先到PGA中去匹配[这里存储了最近50条SQL语句的]如果找到则直接生成计划效率最高的‘软软解析‘。没匹配继续想下
   3.到SGA的Share Pool中匹配。这里存储了大量SQL语句。生产库是以G为单位.匹配父游标的话发现子游标同样匹配。解析成功‘软解析‘。如果没有匹配到就玩大了。开始遍历磁盘
   4.硬解析 效率最慢再强的小型机也扛不住。如果总是硬解析的话可以考虑将 开发人员 干掉。
       0.由查询字典产生的递归调用:首先到Share Pool的data dictionary cache中找到寻找。不存在否则开始进行磁盘I/O找到字典对应的数据块调入SGA 找到对应的条目
       1.语法判断。到数据字典中寻找规则。发现不符合Oracle规则。抛出异常不带你玩了,这都写不对还玩什么
       2.语义解析。判断 用户对象‘ttt‘ 表 列。是否存在,属性的有效性。同样的要到缓存数据字典中寻找。对象不存在传播异常
       3.安全审查。当前Session的用户 ubuntu 是否对所作用的对象有权限。有时到数据字典狂找。没权限传播异常
       4.优化[后台引擎] 制作计划并筛选 制作不同的路径 比如:是走index 还是 全表 。选出一个成本低的计划调入内存
2.执行阶段
   1.根据计划找到对应的数据块在SGA中?No 那就磁盘遍历。将对应的8K块调入Buffer Cache
   3.修改数据产生事务
       a.检查对应的行是否有各种锁保护,如果不存在进行加写锁。开始改数据。为了保证Oracle多版本特性。改数据之前现将原数据保存。产生undo 块。寻找空闲块保存salary=100
       b.将空闲块调入Buffer Cache == 块要变化了先给我写日志 记录redo 条目。在Log Buffer中记录当前SCN号 什么表什么块什么行什么列salary=?.[管他原先数据是多少]好了还可以改数据块
       c.将块中记录salary=? 可以改原块
       d.块又要变化了是吧先给我写redo条目,在Log Buffer中记录与刚才同样的SCN号 什么表什么块什么行什么列salary=100.好了数据更新成功。
       e.将块中记录salary=100.好像数据是改了。
       d.等等加入salary列有约束键,或者是索引还需要 与约束键 的内容匹配。索引需要将原先的值更新:这又时一次块更新,又要将块调入内存。。。。所以有索引插入数据会比没有慢一点。

3.Client 获取
   1.将 1/0 row updated 消息通过Server process发送给Client.在sqlplus上显示信息。

Client 提交事务
   直接跳到执行阶段分析
   1.lgwr进程工作将Log Buffer中的redo条目写入磁盘log file。数据被真正的修改了,即使异常断电数据也将被保护
   2.释放写锁。其他session看到salary=100

   3.向Client返回Commit complete.

但这时对应的脏数据还没有同步到磁盘 只是日志文件过来
   说一下数据块是怎样同步的
   1.假如产生检查点dbwn进程将log buffer中对应的脏数据块写入磁盘。

Oracle Update 数据,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。