欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle日志的性能介绍及原理剖析

程序员文章站 2022-12-10 17:30:04
Oracle日志的性能介绍及原理剖析 一)一致性和性能 日志是所有数据库的一个很核心的内容很重要 它关系到数据库的数据的一致性 目前大家在使用的我们可看到的有几个数据库...

Oracle日志的性能介绍及原理剖析

一)一致性和性能

日志是所有数据库的一个很核心的内容很重要

它关系到数据库的数据的一致性

目前大家在使用的我们可看到的有几个数据库

有oracle、sqlserver、mysql、db2还有以前的sybase

这所有的数据库它们的日志原理几乎都一样

综观现在在用的数据库基本内容上是基本一样的

都由最基本的关系数据表组成

都用sql基本语法进行各种库主体数据的操作

基本的不同产生于对这些基本功能的执行上

自己有自己的实现方法和代码

高级功能的不同主要产生在对一致性的保护和对性能的提升

对基本功能组合或添加一些额外功能也会产生其它一些属于自己的高级功能

其实这些各种功能它们的原理也是基本相同的

区别也只在实现方法和代码

在数据库体积来讲

小的数据库在高级功能方面会有所删减

大的数据库会有更多只属于自己的高级功能

另外一个比较明显的区别是应环境产生的

数据库可使用的操作系统类型越多其适应性越强

细看所有功能类似的软件

功能基本也是类似的

使用过并且熟悉了以后会发现最大的区别只是在外观

但它们在市场上处于竞争状态,竞争用户的使用和资金

日志和性能没有多大关系

但是日志和数据库的数据的一致性关系非常大

一个软件其它方面没有变动的情况下

在提高它的性能的时候

一定会损失掉一部分稳定性

软硬件都是如此

你盲目的给cpu超频,就很容易造成系统的崩溃

为了提高硬盘的写入速度,有人采取减少数据效验的办法

如有些格式的音频视频文件为了让它传输的更快而不进行数据效验

这些文件在进行了多次网络传输后多数都已经损坏了

在网络上为了让网络视频播放的更快

在不断的降低视频的分辨率而视频越来越模糊

想让数据库处理数据的速度更快,相同的环境下也只能降低对数据正确性的保护

但是oracle很少有人提起如何提高它的性能只是讲如何优化它

对本人来讲想了很长时间也没想到在它内部怎么直接提高它的性能

可能因为oralce是个成熟的软件

内部的各方面组合已经进行了最大的平衡

对一个方面提高性能往往会影响其它方面的性能

所以不能说要它提高性能

能做的只有统观全局进行相对当前软硬件配置的最平衡的优化

对oracle在网络上有一些提高性能的方法

如直接提高硬件的性能,相同硬件的性能肯定是以丧失稳定性为代价的

而且一般性能只能在一定范围内提升,想更多的提高反而适得其反

举一个明显的例子

你可以在分配内存的时候把内存都分配给oracle

但是这时操作系统就没有内存了,操作系统崩溃oralce也没法运行了

对oracle软件方面的性能提升,都集中在所执行的客户程序的编写上

主要让客户编写程序时更符合oracle软件环境

让客户程序执行的更快更安全

一个针对优化过的程序性能会远远高于不符合oracle运行环境的程序

这就要求程序员对oracle基本结构和功能非常的熟悉

以最佳的方式选择oracle组件及功能的使用

它没有改变数据库,只是让客户程序最优化的使用oracle数据库

再次提出直接对oracle提升性能是有风险的

一旦错误就会造成数据的丢失,

而且用这个软件的用户数据往往都是非常重要的

哪怕丢失一个字节都有可能造成巨大的损失

所以选择的时候,还是一致性重要

我们知道对oracle数据库或者说对任何数据库来讲

我们学习的重点无非就是两个

第一个就是数据库的数据的一致性

这个我们要保障特别是对dba

所以我们要研究它而且是我们深入研究的课题

大家听完老师整个体系的课以后

大家会对数据库的一致性应该说有非常深的了解

不会出现一些因为误操作而产生的数据的一致性的问题

这个老师相信肯定没有问题

另外就是我们让oracle运行的更快

这是我们学习的第二个目标

这两个目标如果都很熟的话

别人一提数据库的一致性的话你有一整套的理论体系来支撑你

优化的时候也有一整套的理论体系和相关的一些实践来支撑你

这说明你oralce学的不错了

所以说学oracle不要看我们学了这么多的内容

最终还是纠结到两大块

第一是一致性

第二就是数据库的性能

oracle日志只是和一致性有关系和性能没有什么关系

讲到这个地方给大家强调一下,接下来学日志的时候就有相关的侧重点了

oracle的数据库的一致性从某种意义来讲重要性要远远的高于oracle的性能

数据库可以慢一些,但是数据的一致性一定不能出问题

这是个原则性问题

我们从一开始讲到最后一节课的时候

中间都会穿插着一些关于数据库一致性问题

我们讲oracle任何一个知识环节的时候都会涉及到它

特别从日志开始讲了以后

以后数据库的一致性问题会持续的给大家灌输给大家去讲

二)oracle日志的原理

讲了日志的原理以后大家就知道oracle为什么需要日志了

oracle数据库启动后

有一堆dbf文件对应内存中的buffercache

内存中还有logbuffer对应磁盘中的redolog日志

客户的sql语句进入数据库以后要执行

而对oracle数据库来讲是有非常多的连接过来

每个连接会有大量的sql语句

就是数据库在同一时间点会有大量的sql语句在执行

sql语句有查询的有增加的有删除的有修改的

这就是我们常说的增删改查

我们先不关心这些

1)史记讲解法

buffercache里面有一堆的buffer

我们这么来理解oracle日志产生的过程

假设在buffercache上站着一个人

它能够看到buffercache里面所有的buffer

而且这个人眼睛非常的快

我们来看buffercache的状态

对buffercache来讲大量的sql语句执行

在一个时间点其中的一个buffercache中的buffer块给改了

在下个时间点另一个buffercache块给改了

这两个时间点差了几毫秒或几微秒

在另外时间点其它的buffer块给改了

就是说在一个时间段内buffercache里面有大量的buffer被修改

然后这个人就拿着一个本在记录

严格的按照时间来记录buffer的一个改变过程

比如在一个时间段

一个buffer给改了,它马上看到了,看到以后,马上在日记本里面记下来

记下来这个buffer在那个时间点发生了什么改变

刚记完以后又一个buffer给改了

马上在日志里面在本里面记上在这个时间点那个buffer发生什么样的改变

也就是这个人

以极快的速度严格的按照时间顺序来记录buffer的一个改变历程

这些日志会记录到logbuffer里面去

最后logbuffer会通过LGWR这个进程写到磁盘上的redolog里面去

先写第一个redolog

第一个redolog写满以后再写第二个然后再写第三个

好我们再来回顾一下

日志的记录过程,日志的产生的过程就这么认为

在buffercache上面有一个人

拿着一个小本

这个人眼睛非常快,记录的非常快

它能够看到buffercache里面所有的buffer

这个人就严格的按照时间顺序来记录buffercache里面的所有的buffer的一个改变过程

也就是说

我们的日志记录的是buffer的改变,并且按照时间顺序记录的

这个人就干这么一件事情

在记录buffer改变的时候

它不关心是哪个会话上来哪个sql语句修改的谁

它只关心哪个buffer改变了

所以说日志里面记录的就是buffer里严格的按照时间顺序记录的buffer的整个改变过程

这个人我们可以叫史学家

我们知道历史上有叫史学家的角色

它天天跟在皇上的身边

皇上的一言一行、一举一动每一个决策他都会记录下来

这个史学家是用来约束皇上的

他严格的、实事求是的去记

它并不去带着任何个人感情色彩

皇上做着的任何一件事情记录下来

皇上的整个的一个人生按照时间的轨迹去记录

这是我们讲通过史学家的一个例子

来讲日志的产生过程

讲完以后就是用一句话来概括

oracle的日志是严格的按照buffercache里面的buffer的改变的时间去记录的

首先日志记录的是buffer的改变,第二它严格的按照时间去记录的

我们用两句话可能更好一些

第一日志记录的是buffer,日志是以buffer为单位来记录的

第二是按照buffer它改变的时间顺序来记录的

也就是这个史学家在上面不停的看哪个buffer改了马上记

先这么认为就可以了

这就是日志

我们后面讲的时候慢慢就理解一些oracle记录日志的一些记录方式

这对以后学习非常的有帮助

这是我们通过 史记讲解法 来讲解

2)日志记录方式

我们知道日志记录方式是以buffer来记录的

它到底怎么记录的呢

比如buffercache里面的一个buffer改变了

记录buffer的改变有很多种方式

oralce要记录这个buffer的改变

第一、记录buffer的地址也就是磁盘中数据块的地址

第二、时间点,哪个时间改变的

第三、对这个数据块做了什么改变

如数据块改变是做了insert改变还是做了delete改变

还有insert插入的数据是什么

做了delete删除的数据是什么

对数据块的改变无非就是增加数据和删除数据

另外修改数据对buffer来讲就是删除一行数据然后再插入一行数据

是把这一行先delete然后再insert然后组成一个update

比如我们执行了一个delete的sql语句

它删除了一万行

这一万行在一千个块里面

这时我们就可以大体粗略的认为oracle产生了一千条日志

因为针对每一块都产生一条日志

这就是日志产生的方式

日志里面有数据块的地址、改变的时间、还有是怎么改变的

怎么改变就是增删

还有只改了一行数据但是产生了几十k的日志

这很有可能

所以oracle的日志的产生的量还是很大的

以后我们还会去研究:

oracle的日志到底产生的量是多大

oracle日志的产生会不会产生性能问题

日志对性能的影响

在oracle的等待事件wait events会有涉及

日志对性能一般没有影响

对oracle数据库的修改会产生大量的日志

这个日志需要从logbuffer到redolog

到redolog就涉及到IO

有IO就可能有性能问题

这是日志记录方式

也讲了oracle日志工作会产生大量的日志

三)实际日志产生过程

实际的日志产生的过程里面会有一些性能的问题

老师在课程中画了不少图

他的图很随意但是应该说是有含义比较有意义

学生本人没有把他的图也画下来是因为只想用文字来记述课程

内存有sharedpool,

buffercache、logbuffer对应磁盘上的dbf和redolog

oracle实例连接很多客户会话

每一个会话都分到一个一小块内存,这块内存叫PGA

客户会话oracle用server process处理,每个serverprocess都会产生一个PGA

都有可能修改buffercache中的一个buffer

server process会将磁盘block块读到buffer里面去

会从内存buffer里面读数据到cpu里面去

也会修改buffer的数据

所有的这些访问都是serverprocess来做的

当然脏数据块写回的时候是使用的DBWR进程

serverprocess每修改一次buffer的时候它会自己产生日志

先写到自己的PGA里面去

当写到一定的程度的时候,它再从PGA写到logbuffer里面去

第二个serverprocess也一样

当它修改某个buffer的时候它也会产生日志

也会从PGA写到logbuffer里面去

实际的日志产生的过程

是serverprocess修改buffer产生日志写到自己的PGA里面去

在某些触发的条件下

会把日志写到logbuffer里面去

logbuffer最终又通过进程LGWR写到磁盘的redolog里面去

这就是实际的日志产生的过程