[读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)

2023-09-04,

持续更新...)

第8章

1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257

(这种情况我觉得应该是在高并发的情况下才会产生)

假设的一个场景是系统一边读取表,一边在修改这个表,就会同时生成查询所需要的undo信息.update生成了undo信息,你的查询可能会利用这些undo信息来得到待更新数据的读一致视图.如果提交了所做的更新,就会允许系统重用刚刚填写的undo段空间.如果系统确实重用了undo段空间,擦除了旧的undo数据(查询随后会用到这些undo信息),你就有大麻烦了.select会失败,update也会中途停止。

反过来讲,在过程性循环中如果提交不那么频繁也可能会造成undo表空间被占满的情况,发生ora-30036错误,不能扩展undo表空间段。     v$undostat

2.在JDBC连接中关闭自动提交。P261

Connection con = DriverManager.getConnection("jdbc:oracle:oci:@database","scott","tiger");
conn.setAutoCommit(false);

3.分布式事务2PC协议。P262

oracle为实现分布式事务的提交,使用了一个2pc协议(two-phase commit protocol,二段提交协议)来做到这一点。2pc是一个分布式协议,如果一个修改影响到多个不同过的数据库,2pc允许原子性的提交这个修改。它会在提交之前尽可能的关闭分布式失败窗口。在多个数据库之间的一个2pc事务中,其中一个数据库(通常是客户最初登录的那个数据库)会成为分布式事务的协调器。这个站点会询问其他站点是否已经准备好提交。实际上,这个站点会转向其他站点,问他们是否准备就绪。其他的每个站点会报告它的“就续状态”(Yes或NO),如果只要有一个站点投票No,整个事务就会回滚。如果所有站点都投票Yes,站点协调器会广播一条消息,使每个站点上的提交成为永久性的。

在2Pc投票之前,任何分布式错误都会导致所有站点回滚。

第9章

1.撤销操作是逻辑恢复到原来的样子  P271

通常来说对undo有一个误解,认为undo用于将数据库物理地恢复到执行语句或事物之前的样子,但实际上并非如此.数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据库快本身在回滚后可能大不相同.原因在于:在所有多用户系统中,可能会有数十 数百甚至上千千个并发事务。数据库的主要功能之一就是协调对数据的并发访问。也许我们的事物在修改一些块,而一般来讲往往会有许多其他事务也在修改这些块。因此,不能简单地将一个块放回到事务开始前的样子,这样会撤销其他人(其他事务)的工作。

注意:直接路径操作会绕过表上的undo生成

2.11G新特性 延迟段创建   P272

11G下创建表,在没有插入数据之前表都是没有分配空间的。(deferred segment creating)

在执行create table 时不会分配任何存储空间,一个区段都不会分配。要延时到insert发生时才会真正创建段,回滚时,段将持久存储(段不会被删除)。

3.undo与redo 关系 P273

有意思的是,尽管undo信息存储在undo表空间或undo段中,但也会受到redo的保护。换句话来说,会把undo数据当成是表数据或索引数据一样,对undo的修改会生成一些redo,这些redo将记入日志。

4.回滚过程中从不涉及重做日志 P276

回滚过程中从不涉及重做日志。只有恢复和归档才会读取重做日志。这对于调优是一个很重要的概念:重做日志是用来写的(而不是用于读)。Oracle不会在正常的处理中读取重做日志。只要你有足够的设备,使得ARCH读取文件时,LGWR能够写到另一个不同的设备(也是redo文件放在不同位置盘),就不存在重做日志竞争。许多其他数据库(非Oracle)都把日志文件处理为“事务日志”,这些数据库没有把redo和undo分开,对于这些系统,回滚可能是灾难性的,回滚进程必须读取日志,而日志写入器正在试图写这个日志,这就像系统中最薄弱的环节引入了竞争。Oracle的目标是:可以顺序地写日志,而且在写日志时别人不会读日志。

5.必须非常谨慎地使用NOLOGGING模式 P287

必须非常谨慎地使用NOLOGGING模式,而且要与负责备份和恢复的人沟通之后才能使用。下面假设你创建了一个非日志模式的表,并作为应用的一部分(例如,升级脚本中使用了create table as select nologging)。用户白天修改了这个表。那天晚上,表所在的磁盘出了故障。"没关系,"DBA说,"数据库在用ARCHIVELOG模式运行,我们可以执行介质恢复。"不过问题是,现在无法从归档重做日志恢复最初的创建的表,因为根本没有生成日志。这个表将无法恢复。由此可以看出使用NOLOGGING操作最重要的一点是:必须与DBA和整个系统协调。如果你使用了NOLOGGING操作,而其他人不知道这一点,你可能就会拖DBA的后腿,使得出现介质失败后DBA无法全面恢复数据库。必须谨慎而且小心地使用这些NOLOGGING操作。

6.NOARCHIVELOG 模式下create index和rebuild index操作不会记录到操作日志中 P288

7.提交清除是怎么发生的 P291

在与我们的事务相关的提交列表中,Oracle会记录已修改的块列表。这些列表都有20个块,Oracle会根据需要分配多个这样的列表,直至达到某个临界点。如果我们修改iade块加起来超过了块缓冲区缓存大小的10%,Oracle会停止为我们分配新的列表。例如,如果缓冲区缓存设置为可以缓存3000个块,Oracle会为我们维护最多300个块(3000的10%).COMMIT作业时,Oracle会处理这些包含20个块指针的列表,如果块仍可用,它会执行一个很快的清理。所以,只要我们修改的块数没有超过缓存中总块数的10%,而且块仍在缓存中并且是可用的,Oracle就会在提交的时清理这些块。否则,它只会将其忽略(也就是说不清理)。

8.临时表也会生成redo P296    对于临时表只会为undo生成日志

第10章

1.表对应的段 P314

2.在手动段空间管理下freelists的设置  P319

3.pctfree/pctused

4.索引所占用的空间 P336

5.临时表的限制 P370

6.BTREE索引的扫描顺序

第11章  索引

1.索引的高度 P387

2.聚簇因子 P403

4.位图索引的一些缺点

[读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)的相关教程结束。

《[读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...).doc》

下载本文的Word格式文档,以方便收藏与打印。