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中对应的脏数据块写入磁盘。