oracle大型数据库第九章.ppt

上传人:xin****828 文档编号:15474457 上传时间:2020-08-12 格式:PPT 页数:28 大小:110KB
收藏 版权申诉 举报 下载
oracle大型数据库第九章.ppt_第1页
第1页 / 共28页
oracle大型数据库第九章.ppt_第2页
第2页 / 共28页
oracle大型数据库第九章.ppt_第3页
第3页 / 共28页
资源描述:

《oracle大型数据库第九章.ppt》由会员分享,可在线阅读,更多相关《oracle大型数据库第九章.ppt(28页珍藏版)》请在装配图网上搜索。

1、第9章 redo与undo,9.1 什么redo日志,Redo日志是Oracle最重要的重做日志文件。它分为:在线重做日志和归档重做日志文件。它们都是用来在Oracle崩溃时恢复Oracle。比如:在删除Oracle中的一个用户表,并提交,这时可以用redo日志进行恢复。 每一个Oracle数据库至少有两个在线重做日志组,每个组至少有一个成员(重做日志文件),在线重做日志以循环方式使用。Oracle 会写组1 中的日志文件,等写到组1 中文件的最后时,将切换到日志文件组2,开始写这个组中的文件。等到把日志文件组2 写满时,会再次切换回日志文件组1(假设只有两个重做日志文件组;如果有3 个重做日

2、志文件组,Oracle 当然会继续写第3 个组)。,9.2 什么时undo,undo 正好与redo 相对,在对数据执行修改时,数据库会生成undo 信息。执行的事务或语句由于某种原因失败了,或者如果你用一条ROLLBACK 语句请求回滚,就可以利用这些undo信息将数据放回到修改前的样子。 redo 用于在失败时重放事务(即恢复事务),undo 则用于取消一条语句或一组语句的作用。 undo 在数据库内部存储在一组特殊的段中,这称为undo 段,而redo是指一组磁盘上的文件。,9.2 什么时undo,undo只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消。数据块本身在回滚后可能大不相同

3、。因为在多用户系统中,在一个数据块上可以有多个并发事务,所以回滚这个块上的某个事务,将这个数据块也撤销,这样势必影响其它事务。,9.2 什么时undo,查看具体undo的生成过程: (1)创建一个空表。 (2)对它做一个全部扫描,观察读表所执行的I/O 数量。 (3)在表中填入许多行(但没有提交)。 (4)回滚这个工作,并撤销。 (5)再次进行全表扫描,观察所执行的I/O 数量。,9.3 redo与undo是如何协调工作,需要注意:undo信息是存在undo表空间或undo段中,但在生成undo信息时,也会生成redo信息,undo也会受redo保护。 分析下面场景: Insert into

4、t (x,y) values(1,1) Update t set x=x+1 where x=1 Delete from t where x=2,9.3 redo与undo是如何协调工作,针对第一条语句insert :redo和undo都会生成,undo信息足以使insert “消失”,redo足以让这次insert再次发生。这是插入后内存的缓冲的分布状态。,9.3 redo与undo是如何协调工作,假想场景:系统现在崩溃 SGA会被清空,重启oracle后就好像这个事务没有发生一样,因为没有任何信息被写入磁盘。 假想场景:缓冲区存在已满(不一定修改的数据完全提交) 缓存中的数据块写入磁盘之前

5、,一定要保证缓存中的redo信息完全地被写到磁盘上。如果先写数据块到磁盘,有什么问题?考虑下列情况: (1)如果所写的数据是没有提交的,此时oracle崩溃,redo日志没有写回磁盘,在下次启动时,这些数据该如何处理呢?Oracle没有办法来判断这些数据的正确性,从而造成数据的不一致(其实很有可能是错误数据)。 (2)其实没有redo,就没有办法来说清楚这些数据的前世今生。例如:这些数据是否为已提交的数据;这些数据没有修改之前是怎么样。,9.3 redo与undo是如何协调工作,针对update语句。下面假定有一些insert的redo日志已经输出到磁盘上,有些还在缓存中。 假设场景:系统崩溃

6、 在重启时,Oracle会读取重做日志,Oracle会发现有个事务没有提交,同时也发现这个事务的一些重做日志内容。 假设场景:应用回滚事务,9.3 redo与undo是如何协调工作,假想场景:应用回滚事务 Undo事务的信息有可能已经被刷到磁盘上,也有可能在缓冲中。Oracle会将undo信息应用到数据和索引所在的块。如果数据和索引的块在缓冲中,则直接应用undo信息进行撤消,如果数据和索引的块已经被刷到磁盘上,则从磁盘上读到缓冲中,然后再用undo信息进行撤销。,9.3 redo与undo是如何协调工作,删除语句delete:它的情况同update差不多,不再讨论。 讨论Commit的情况:

7、 (1)在做commit后,Oracle会将所有的redo日志先写入到磁盘上。 (2)数据块不一定写回到磁盘,也就是说有人直接从磁盘上读数据,读到的是这个事务发生前的值。那是不是有用户查询这些数据时,会得到老的值呢?不是的。其它用户来查询这个数据块的值,如果这个数据块的值在缓存中,而且要查询的数据所在行上没有锁,则Oracle会直接将缓存中的数据返回给用户,而不从磁盘上读取。 (3)undo段中的信息会一直存在,直到被重新利用。,9.4 提交与回滚,日志文件对开发人员有很大的影响。 软件开发人员必须要明白commit期间发生了什么,才有可能写出高效的应用程序。 Commit的效率问题: (1)

8、commit通常是一个非常快的操作,它与事务大小没有关系。其实,在oracle中,如果commit一行需要的时间为t,提交(commit)1000行的时间也只需要t,但如果你进行1000次commit,则需要的时间为:1000*t (2)如果在必要时才提交(真正的一个逻辑单元完成之后),不仅能提高性能,还能减少对共享资源的竞争(例如:日志文件,各种内部闩等)。,9.4.1 commit做了些什么,Commit之前所完成的工作。 (1)已经在SGA 中生成了undo 块。 (2)已经在SGA 中生成了已修改数据块。 (3)已经在SGA 中生成了对于前两项的缓存redo。 (4)取决于前三项的大小

9、,以及这些工作花费的时间,前面的每个数据(或某些数据)可能已经刷新输出到磁盘。 (5)已经得到了本事务的全部锁(ORACLE在提交后将释放该事务所拥有的全部锁)。,9.4.1 commit做了些什么,执行提交要完成的工作: (1)为事务生成一个SCN。SCN 是Oracle 使用的一种简单的计时机制,用于保证事务的顺序,并支持失败恢复。SCN 还用于保证数据库中的读一致性和检查点。每次有人COMMIT 时,SCN 都会增1。 (2) LGWR 将所有余下的缓存重做日志条目写到磁盘,并把SCN 记录到在线重做日志文件中。 (3) V$LOCK 中记录这我们的会话持有的锁,这些所都将被释放,而排队

10、等待这些锁的每一个人都会被唤醒,可以继续完成他们的工作。 (4)如果事务修改的某些块还在缓冲区缓存中,则会以一种快速的模式访问并“清理”。(但要注意:若数据块已经写回磁盘或缓存中的数据块数量很大,commit时不会清除这些块上的锁)。 在提交的过程中,所花费时间最多的是LGWR进程将redo日志写回磁盘,它是一个串行写,但由于LGWR每隔3秒会写一次数据,这样避免commit时将所有redo刷到磁盘上,所以最后commit时,LGWR所写的内容很少。 但必须注意:commit必须要等LGWR进程将缓存中的redo日志完全写入磁盘后才会返回。对LGWR的调用是一个异步操作。但是PL/SQL这门语

11、言通过commit对LGWR调用是异步的。,9.4.1 commit做了些什么,验证commit的响应时间。 (1)首先,创建一个大表(表名叫:big_table),里面有100000行记录。 (2)再创建一个表t,然后将大表big_table的数据分10行,100行,1000行,10000行,100000行插入到表t。这个过程需要用set timing on来计时,用autotrace来跟踪redo日志的大小。具体实现留着实验。,9.4.2 rollback做了些什么,Rollback所做的操作为: (1)撤销所有的修改,其过程为:从undo段读回数据,然后根据这些数据做逆向操作,比如:如果

12、插入一行,逆向操作为删除一行;如果删除一行,逆向操作为用undo数据插入一行。做完逆向操作之后将undo条目标为已用。 (2)会话持有的所有锁将会被释放,如果有事务在排队等待当前事务持有的锁,则这些事务会被唤醒。 注意:回滚操作的开销相当大。一般情况最好是不要用回滚操作。,9.5 分析redo,如开发人员,了解你对数据库的操作所生成的redo日志的多少是一件重要的事情。redo管理是Oracle数据库需要串行的地方。生成redo日志越多,整个系统就越慢。,9.5.1 测量redo,除了用autotrace来跟踪单条的sql语句所生成的redo数量以外,还可以通过查询v$mystat和v$sta

13、tname这两个虚拟视图来得到多个sql语句所生成的redo数量。 v$mystat表存储了自当前会话开始以来的多项统计信息。可以用下面的sql语句来查看与redo相关的统计量: select name from v$statname where name like redo%,9.5.1 测量redo,在ORACLE中,可以将某一列的值放入一个变量。 你可以这样定义:column column_name new_value var_name 例如: column value new_value V select empno as value from emp; select -替换变量V中保

14、存了empno的最后一行的值。 有了上面的这种SQL*PLUS变量,就可以将先执行的SQL所产生的redo 数目放到这个变量中,然后再执行一些SQL,又会得到一定数量的redo项,然后将这两个数量相减,就可以得到第二次SQL所产生的redo数量。,9.5.2 解发器生成的redo测试,这一节在实验课上讲。,9.5.3 redo日志生成,Redo日志非常重要,如果没有redo日志,不可能在系统失败时进行恢复。可以减少Oracle的更新、插入、删除操作所产生的redo日志,但不能让这些操作完全不产生redo日志。,9.5.3 redo日志生成,1、在sql中设置NOLOGGING。这个选项并不是说

15、操作语句(insert ,delete ,update等)不会生成redo日志,而是加了该选项,这些操作会减少redo日志的生成。 Oracle有两种日志模式,即:归档日志模式和非归档日志模式(可以通过:select log_mode from v$database来查看当前数据库属于什么归档模式)。无论在哪种日志模式下,对数据库的系统表(如:在创建一个用户表时,会将用户表的一些基本信息插入到sys.tab$表中)的操作,都会产生redo日志。,9.5.3 redo日志生成,验证NOLOGGING选项所产生的redo日志数量: (1)在oracle启动到mount阶段,然后用alter dat

16、abase archivelog ,可以改变数据库模式为归档模式archivelog 。 (2)先执行:mystat “redo size” (3)执行create table t as select * from all_objects (4)mystat2 (5)drop table t (6)create table t nologging as select * from all_objects (7)mystat2 注意:如果在nonarchivelog(非归当)模式下,用nologging和不用该选项,所生成的redo数量没有差别。因为在非归当模式下,创建表除了对数据字典的修改要生

17、成redo日志外,就不会再生成其它的redo日志了。,9.5.3 redo日志生成,关于nologging操作的注意事项: (1)设置nologging后,仍会生成redo日志,只是数量要比不设置该选项要少得多。 (2)nologging对后继操作没有影响。在对某个操作设置了nologging,其后的update,delete,insert等操作不会受其影响,这些操作仍会生成redo日志。应用对这个表的操作也会生成日志。 (3)在archivelog模式下执行nologging之后,要尽快备份数据库文件,避免系统失败对后续数据对象修改的影响,因为后续修改不能用redo日志文件恢复。,9.5.3

18、 redo日志生成,2、将nologging应用到段(表或索引中) 可以把握一个索引或表修改为默认采用NOLOGGING模式。这样对表中的数据修改或重建索引时,不会生成redo日志。,9.5.4 数据块清除,数据块上的锁标志,在commit之后并没有清除,在下次执行含有select操作的SQL语句(如:update)时,会将这些锁标志清除。在进行dbms_stats操作时,也会清除这些锁标志。,9.5.4 数据块清除,实验验证块清除。 (1)将DB_CACHE_SIZE的最低值为4M,这可以放下512个8k的数据块。 (2)创建一个表,该表的一行要占一个数据块。 (3)set autotrace traceonly statistics。 (4)向表中插入500行数据。 (5)然后提交。 (6)做查询,观察是否有redo日志条目的大小。,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!