oracle数据库应用性能优化经验(培训讲义)

这是我给公司同事做的内部培训ppt的讲义,给大家分享一下。这是培训大纲,ppt在找地方上传,等找到了会把链接发在这里 。

 

暂时放在csdn上,赚点下载积分:https://download.csdn.net/download/kingstarer/10655069

截几个ppt页面大家可以先预览一下

 

大家好,欢迎大家来参加今天的技术交流,而今天打算跟大家分享的是oracle数据库应用优化相关的一些经验。这是大纲。

 

我们今天要讲的内容分五部分。其中1到3是我们今天重点交流的内容,然后四和五的话就可能,稍微快一点就带过。

 

我先给大家简单介绍一下每个部分的内容。

 

首先第一部分会给大家介绍一下oracle数据库的架构及一些内部实现细节。这是为了给后面介绍数据库优化知识做一些铺垫。

 

接着,我想给大家介绍一些编写高性能sql的经验。

 

然后在第三部分,我们会分享一下数据库的执行计划相关知识。我们平时发现sql跑得比较慢时,就可以查看执行计划,找出里面不合理的环节进行优化。

 

第四部分内容是关于数据库等待事件及awr报告的一些优化的内介绍。awr报告相当于数据库的体检报告,等待事件就是一些体检指标。我们做整个数据库应用优化经常用到它。

 

第五部分的话是一些学习资料推荐。

 

下面我们开始进入第一部分内容的介绍。这是,一个oracle数据库的架构图。

 

这里user process是客户端进程的意思,也就是我们平时自己写的程序,或者sqlplus sqldevelor这些工具。

 

我们平时说的数据库是一个比较模糊的概念,其实它是包含两部分组成。一部分是数据库文件,包括数据文件,日志文件等。也就是这一部分,这个才是专业术语的数据库database。 另一部分是数据库实例,一套围绕真数据库运行的进程集合。

 

这里要说明一下的是,不是比较旧的,我从网上抄下来的11g架构图。现在数据库都已经出到18c了,可能会有一些变化。另外,这图里面有一些不是太重要的数据库进程,这里是没有发出来的。嗯,我们还是看这张图吧,这图估计是oracle8i时出的图,虽然比刚才的图缺少了一些内容,但我觉得画的更好一些,所以后面会围绕这张图来介绍。

从这图可以看出来,oracle数据库主要分两部分,一部分是数据库实例,由数据库后台进程和相关的共享内存组成。另一部分,就是DataBase这一块,主要是数据库文件。我们常说的数据库是对这两块内容的统称。

这图还是挺重要的,大家多看几眼。接下来我们会对这图里面出现的名词做一些详细介绍。

接下来,我们对数据库的一些重要组件,逐个介绍吧。

‍‍

首先要介绍的是‍‍数据库实例这块。这一块由两大部分组成,一个是这个,巨大的共享内存块,我们称之为SGA。另一块是oracle后台进程。

SGA是非常重要的概念。它主要是做为oracle库表数据和重做日志的缓存和缓冲。下一页我们会详细讲里面具体细节。

这一页我们重点要介绍的是oracle数据库后台进程。这些后台进程主要负责数据库监控,数据与日志读写,故障恢复等功能。

这里我们列出几个比较常见的进程介绍。 Pmon和smon,这两个进程分别用与用户进程故障和系统故障恢复的。我们开发一般不需要关心它的工作原理,dba才需要关注。

DBWN这个进程负责把SGA里面的数据写回磁盘。我们刚才说过SGA缓存了oracle数据库表数据。里面有部分数据是用户用sql修改过的,需要写回磁盘。因为数据库写磁盘比较耗时,所以数据修改总是先在SGA中修改,达到一定量或者数据库空闲时才由DBWN统一写回磁盘。

LGWR也是一个比较重要的进程。它负责把Redo日志从内存中写到磁盘,用于数据库恢复。一个事务只有将Redo日志写到磁盘才能算完成。LGWR主要工作时间点是用户发起commit命令时,或者日志缓冲区超过1M时工作。

Redo日志大小有限制,写满后会通过归档日志进程转移到归档日志里面。

CHKP是协调LGWR和DBWN的进程。详细协调原理大家有兴趣可以上网找找,我这里主要想介绍它们之间协调需要用到的一个概念,叫系统变更号,也就是这个SCN。这个系统变更号我们可以简单理解为是oracle事务的编号,它是随着事务提交与时间变化而增长的。Oracle每个数据块都会记录修改该数据块的系统变更号。数据库做查询时,可以根据这个系统变更号判断记录是否已经最近被修改过。

下面详细介绍一下SGA的组成。

数据库块缓冲缓存区,这个主要是缓存数据库的数据的。包括读写数据,都会先放到这个缓冲区,有空再写回磁盘。一般交易系统这个缓冲区的命中率是很高的,超过90%。

Library Cache是一个缓存,但它缓存的不是数据,而是sql以及执行计划。Oracle数据库在执行sql前,先要生成sql的执行计划,也就是sql的详细执行步骤。这个步骤生成是相对比较消耗数据库资源的。所以oracle会把生成的执行计划暂存起来,后面如果碰上一模一样的sql,就直接用现成的执行计划,不用再重新生成。所以我们平时写sql经常说要用绑定变量,一个主要原因就是减少数据库执行计划生成的时间。

重做日志刚才有稍微提到,它是数据库变更的记录。例如我们发出一个update语句,把一个字段从0变成1,redo日志就会记录这个字段变成1之后的数据。数据库修改一条记录后不会立即写回磁盘的,而是先写到缓存同时登记重做日志。在事务提交时,只要把重做日志输出到磁盘,这条记录就不会因为断电丢失。因为一般来说,写数据时随机IO,写日志是顺序IO,顺序IO速度比随机IO快很多。

与Redo日志对应的是Undo数据。它是存放个Undo表空间。Undo就是撤销,与重做是相反的过程。所以我们把字段从0变成1时,这里会记录的是字段在改变前,仍然是0的数据。

注意Undo表空间的数据是存放在数据库文件的,所以数据库在操作回滚段时也会在Database Buffer Cache进行缓存。

Undo数据有一个非常有用的作用,就是一致性读。Oracle执行select语句时一般是不锁表的,但是它还是会保证返回的数据肯定是查询开始时间点的数据,即使查询过程中,数据被修改过。这功能实现就是需要通过查询回滚数据,获得数据在修改前的状态。

这是检查点的原理,检查点是用于数据库断电恢复的。大家有兴趣自己细看。

数据库实例介绍完,下面我们开始介绍Database这块。Database是数据库文件集合的统称,一个Database可以对应多个数据库实例。我们常说的rac就是这样,多个数据库服务器,操作同一个数据库文件。

数据库里面最重要的文件就是数据文件和联机日志文件。刚才我们有介绍过Redo日志缓存,它在用户提交事务时就会写到磁盘,就是这个联机日志。

这一页介绍的是oracle数据库服务进程的知识。也就是处理我们平时写的客户端程发出的sql请求的进程。

一个数据库会有很多个服务进程,这些进程共同享一个SGA。但每个进程都有自己的一块私有内存空间,我们称之为PGA。PGA默认是比较小的,如果我们需要进行大表连接,可能会嫌内存不够用,这时我们可以申请把PGA加大。做批量任务的同学可以注意一下。

 

‍‍但是有两部分‍‍SB哎,‍‍就是这一块的内存,‍‍然后呢?他还有另外一部分就是这个‍‍这些相关的一些后台进程‍‍是比较重要的,‍‍这是一块巨大的共享内存,‍‍然后呢?它主要的功能的话就是‍‍做一个化充实‍‍这样‍‍这些数据‍‍快‍‍让我们愉快‍‍这些‍‍都会在里面存,‍‍然后‍‍这个数据是这些后台进程,‍‍后来进程,包括上面这几个,‍‍这个是每一个进程具体布置的东西‍‍监控的‍‍这个不是太重要,‍‍然后这个‍‍这个屁吗?‍‍这个是用户进程‍‍监控‍‍这个主要用于‍‍挂了的话‍‍就没有正常断开的情况下,‍‍他会帮你‍‍把这些‍‍原来‍‍重要,‍‍然后这个这个事,‍‍let‍‍这个这个这个作用的话是吧,‍‍就我们曾说过,‍‍里面有‍‍几块‍‍就是把‍‍数据库缓存的一些‍‍数据写回,‍‍然后呢。‍‍这个‍‍night。‍‍我只要。‍‍驶入池塘。‍‍日志写入进程就是‍‍跟我们数据库在‍‍定期。‍‍写到日志文件。‍‍这个是匡威。‍‍归档归档进程,‍‍这个呢是‍‍这个适用于‍‍这里面其实‍‍比较重要的话,就是需要关心的是这两个进程,‍‍不要进程的‍‍相关知识。‍‍这里。‍‍这里是oracle数据库的一些原理。‍‍这是系统改编号,‍‍就这个事,日志进程他。‍‍他有时候。‍‍接下来我们介绍这一块‍‍数据库相关的知识。‍

下面让我们通过一个update语句的执行过程介绍来串讲刚才介绍过的知识吧。首先,客户端会发起sql执行请求,数据库会到缓冲池里面查找该sql执行计划是否存在。如果存在则使用现成的执行计划,这个过程称为软解析。如果执行计划不存在则需要重新生成,这个过程叫硬解析。接着数据库会分析sql需要访问的数据,看是否在数据块缓存里面。如果是则直接使用缓存数据,如果不是则需要从数据库文件读出来放到内存。

接着数据库会在内存中修改数据块,并且同时登记redo日志到日志缓冲区。

等到数据库提交时,redo日志的内容就会被刷进磁盘。数据缓冲区的内容则过一段时间由dbwn写进磁盘。

关于数据库的主要架构介绍到这里。 这几页是数据库块的细节知识介绍,由于时间关系就不讲了。大家主要需要知道,oracle一次硬盘操作都是以数据库块为单位的,而不是以一行记录或者一个字段为单位的。一个数据库块会有n行记录。

下面进入重点交流的内容,关于数据库应用优化的知识。

首先,我们在数据库优化时要注意系统的类型,不同系统的优化目标是不一样的。一般来说,我们把系统分为两大类:OLTP和OLAP,也称DSS。

OLTP全称是在线交易系统,像我们的收单联机系统就属这类。这类系统的特点是:交易非常频繁,但每次交易涉及的数据量很少。对数据库响应时间要求比较高,一般要求几秒甚至几毫秒内返回。

OLAP全称是联机分析系统,我们平时做的批量系统就属这类。这类系统特点时:交易比较少,但每次交易涉及数据量比较多。数据库访问时间要求相对宽松点。

Oltp系统常见资源瓶颈是在cpu和内存上,而oltp系统常见问题是出在io上面。

这个表格介绍了两类系统开发的一些经验。

OLTP由于sql运行频次较高,一般要求使用绑定变量,减少数据库生成执行计划的消耗。另外,OLTP一般要尽量减少访问数据库磁盘的次数,尽量提高内存命中率。

 

 

在线分析系统一般是读写比比较大的系统,为了数据访问方便会做很多冗余。并且,为了数据库能得出最优的执行计划,使用绑定变量会少一些。

这是一般两类系统在装数据库时的参数配置差异,也是遵循系统业务特点而配置的。

前面一节介绍了系统优化的总体原则,这里会介绍一些优化细则。

首先是关于索引的。

索引告诉数据库有什么,而不是没有什么。所以我们平时用的不等于查询条件是用不上索引的。

另外,索引列的数据类型我们也要注意。像这种情况tel电话号码列用的是字符串类型,但查询时却是用tel=数字这样的。会导致数据库索引无效。还有,像这种,我们看起来是数学等价的操作,但却会因为索引的问题导致效率相差很多。

还有这个也是常见误区。不是使用索引不一定比不使用索引快。按我们平时经验,数据库里面少于100条记录,或者索引列选择比不高,例如性别字段只有男或者女,使用索引反而慢一些。因为数据库使用索引查询时需要先在索引里面做几次磁盘操作,然后找到记录位置后还要再回表数据访问记录内容。

这条经验也比较重要,如果我们数据库里面有使用外键保证数据一致性,那要注意在建了外键的列上建索引。因为oracle修改父表记录时需要到子表检查修改后记录是否会违反外键约束,不建索引会很耗时。

这一页想介绍的是oracle一些特性,这是oracle独有功能。用好这些特性可以在某些特定场景大大优化我们程序。

这一条,讲的是oracle的rownum和rowid用法。我们平时写脚本经常会出现这样的场景:如果库表有记录,则执行a操作,否则执行b操作。有些同学会很自然地用select count(*)来判断库表是否有记录。其实我们可以在后面加上where rownum < 2这样的限制,这样做是告诉数据库只要找到符合条件的记录就可以结束查询,不需要统计完所有数据。

Rowid概念前面的ppt页有,使用rowid访问记录是oracle访问数据最快的方法,因为rowid明确表达了数据在磁盘哪个文件,哪个数据块,哪行记录。比索引访问要快,用索引访问时需要先查出rowid再根据rowid查对应的数据。

还有这个技巧,相信做批量的同学也经常用到。就是使用一些特殊方法让数据库不要记录redo日志。前面我们介绍过,对数据库操作都需要记录redo日志用于数据库出现异常时恢复数据,但如果我们确定数据不是太重要,数据库异常挂掉后不需要恢复,则可以使用这些小技巧减少redo日志以加快速度。

还有一些其它不成体系的技巧,这里也介绍一下。

这个是大家比较熟知的,使用绑定变量,可以复用sql执行计划,减少数据库cpu消耗。

这个技巧大家应该也知道,就是删除整个表数据时,尽量考虑使用truncate。因为truncate是直接修改数据库字典,把库表占用数据空间状态改为未使用。这样操作是很快的。不过要注意的是truncate不像delete,误删后可以回滚。Truncate一执行后就会自动提交事务,并且无法闪回查询。

接下来这一大章想要给大家交流的是关于数据库执行计划的一些知识。前面一章介绍的一些优化经验,这一章说的是一个优化的通用方法:通过调整执行计划改善sql运行效率。

首先介绍一下执行计划的定义。执行计划就是数据库执行sql语句的步骤计划,oracle在执行sql之前会先将复杂sql拆解成一些简单步骤并依次执行。

同一个sql可以有很多个不同的执行计划,这些执行计划效率差别可能很大。

我们怎么看sql的执行计划呢,这里介绍几个方法:

一个方法是在sqlplus里面执行set autotrace on,然后再执行sql,执行完毕后sqlplus就会打印sql执行计划及一些统计信息。

还有一种,不需要执行sql,只需要执行explain命令,接着就能用sql语句查出它的执行计划。

还有一种,我比较常用的方法。在plsql develor的执行计划窗口中运行sql,也可以显示执行计划。就像这边这个图片一样。

知道怎么看执行计划后,我们还要懂得怎么分析。

我们看这个简单的sql的执行计划,可以看出来,执行计划是树型结构,有很多个步骤组成,每个步骤都可能有子结点或者兄弟结点。

我们看执行计划时需要从上往下看,碰到有子结点先后子结点,如果没有子结点,则同一层级的兄弟结点中比较靠上的一个,看完再看另一个。

或者我们可以借助工具来帮我们确定执行计划执行顺序。这个就是plsql里面看执行计划的窗口,这里有一组箭头,点击它会依照执行顺序选中执行步骤。

我们拿一个具体案例做一下讲解:

这个sql作用是从雇员表里面找出工号小于103的数据,关联职位表取出职位信息,关联部门表取出部门信息。

它对应的执行计划是这样的

我们从上往下看,0 1 2都有子结点,所以先看它们的子结点。一直看到3,3没有子结点,所以先执行3。从雇员表里面取出数据。

3执行完后需要执行它的兄弟结点4,4有子结点,所以先执行它的子结点5,用job_id到索引job_id_pk里面找数据的rowid。5执行完后会根据找到的数据rowid回到职位表里面找出职位信息,也就是4这个子节点的操作。

3和4执行完后就要回到2,把数据连接到一起。然后再执行6和7,从部门表里面取出数据,接着执行1再把部门数据跟前面的雇员与职位表连接结果再合并,最后回到0,返回客户端。

所以这个执行计划的执行顺序就是3 5 4 2 7 6 1 0

像这个是比较复杂一点的执行计划,大家有兴趣可以自己回去看它的执行顺序。答案在这一列。

前面我们说过,同一个sql会有很多不同执行计划。那数据库怎么确定使用哪个执行计划呢。这就涉及这章要介绍的,优化器的概念。

优化器是数据库的一个核心组件,负责将sql根据各种判断标准转换成最优的执行计划。

现在我们用的优化器都是cbo,基于成本计算的优化器。它会计算每个sql执行步骤的成本,挑选总成本最低的执行计划。

前面我们说过,oltp和olap系统优化目标是不同的,一个是注重响应速度,一个是注重资源消耗。所以oracle也为cbo提供了两种工作选项,一种是first_rows,适用于oltp系统,另一种是all_rows,适用于olap系统。

两种模式下,同一个sql选择的执行计划可能相差很大,导致运行消耗的时间资源也大不相同。

为什么不同执行计划会导致差异这么大呢,主要是由于数据库表连接方式不同造成的。

这是oracle常见的四种数据库表关联方式。

我们看刚才的sql执行计划,这里的1和2都是将两个数据源进行关联。

这里关联方式都是使用嵌套关连。嵌套关联的原理是依次取出驱动表的记录到内层表寻找符合条件的连接数据。显然,这种情况下要内层表查找起来比较快,有索引或者记录数比较少。而且外层表数量越少越好,这样可以减少到内层表查数据的次数。

嵌套关联有一个好处,可以很快的返回符合条件的前几条记录。所以一般oltp系统使用嵌套关联比较多。

Oracle还有一个比较常用的连接方式,就是这个哈希连接。哈希连接原理是先将一个表在内存中做成哈希表,接着访问内层表的数据,逐个到哈希表里面查看是否有对应。

哈希连接适用于内层表没有索引,或者连接两个表记录都相对比较多的情况。Oltp系统用这种连接方式比较多。

由于连接算法不同,对系统资源消耗和响应时间也会有很大差异。

Oracle还有其它两种连接方式,但平时用得不多,这里不说了。

除了连接方式外,数据访问方式也是执行计划效率差异的主要原因。

还是举刚才的例子,这里面有好几种数据访问方式,对不同表采用了不同的方式。

有全表扫描,也有索引扫描。

全表扫描,顾名思义,就是对整个表的数据依次扫描。一般要求表的数据量比较少,或者符合查询条件的数据占全表数据比例较大的情况。

索引访问,跟全表扫描就相反了,适用于表数据量比较大,而符合条件的数据比较少的情况。

索引访问的方式有这五种,从上到下消耗的资源依次增大。

索引唯一扫描 适用于where条件直接指定主键的情况

索引范围扫描 适用于大于,小于这种where条件

索引全扫描 与全表扫描类似,它是扫描整个索引的数据。应用场景是索引字段能包含select返回字段的情况

索引快速全扫描 就是快速的索引全扫描,因为快,所以可能返回的是无序的记录。索引默认是有序的

索引跳跃扫描 适用于where条件没有指定索引前导列的情况,并且前导列选择性比较低的情况。例如建了性别和姓名的联合索引,但查询时只限制了姓名为黄词辉,没限制性别。Oracle会分别查询女性的黄词辉和男性的黄词辉,把结果合并起来

我们平时看的执行计划主要就是查数据并连接,掌握了它们的原理,我们就可以靠自己的开发经验来判断这个执行计划是否足够优化。

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

如果觉得这篇文章对你有用,扫个支付宝红包或者打赏几毛钱吧^_^,写这文章也费也不少力气。您的支持是我最大鼓励。

 

 

 

转载于:https://www.cnblogs.com/kingstarer/p/9613626.html

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 扫一扫,分享海报

CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 大话Oracle RAC:集群、高可用性、备份与恢复 基本信息 作者: 张晓明 丛书名: IT名人堂 出版社:人民邮电出版社 ISBN:9787115204158 上架时间:2009-3-26 出版日期:2009 年4月 开本:16开 页码:473 版次:1-1 编辑推荐    以Oracle 10g为基础,对Oracle RAC进行了全面的介绍和分析。    按照“发现问题&rarr;解决问题&rarr;实践与理论相结合”的方式进行介绍    首先对现实问题进行分析,然后提供合适的解决方案,最后自然地引出Oracle中的理论知识点. 内容简介    本书以oracle 10g为基础,对oracle rac进行了全面的介绍和分析。全书分为两个部分,共14章,第一部分是集群理论篇,这部分从集群基础知识入手,通过分析集群环境和单机环境的不同,介绍了集群环境的各个组件及其作用,以及集群环境的一些专有技术,包括oracle clusterware、oracle database、asm、cache fusion等。第二部分是实践篇,每一章都针对rac的一个知识点展开讲解,包括oracle clusterware的维护、ha与lb、备份、恢复、flashback家族、rac和data guard的结合使用、rac和stream的结合使用,最后对asm进行深入介绍,并给出性能调整的指导思想。.    本书按照“发现问题&rarr;解决问题&rarr;实践与理论相结合”的方式进行介绍,首先对现实问题进行分析,然后提供合适的解决方案,最后自然地引出oracle中的理论知识点,这种讲解方法能够有效地降低阅读难度,帮助读者更好地掌握相关技能。..    本书可以作为数据库开发人员、数据库管理员、数据库初学者及其他数据库从业人员的工作参考手册,也可以作为大中专院校相关专业师生的参考用书和相关培训机构的培训教材。 作译者   张晓明,Oracle OCP,现用网名“石头狗”,名称来自于《和佛陀赏花去》中的故事;狗会因为人随手丢出的一个东西而追逐,可能是一个骨头、一块肉、一个眼神,甚至是一个石头,警示一定要看清自己在追逐的东西。 目录 封面 -14 封底 474 扉页 -13 版权 -12 序 -11 前言 -9 目录 -4 第1部分 集群理论篇 1 第1章 RAC初体验 2 1.1 本书使用环境 3 1.1.1 硬件环境 3 1.1.2 软件环境 4 1.1.3 本书使用的环境 6 1.2 如何在PC机上搭建RAC环境 8 1.2.1 需要下载的软件 8 1.2.2 安装过程 9 1.3 任务列表 28 1.4 规划阶段 28 1.4.1 确认主机名和3个IP地址 29 1.4.2 存储方案选型 29 1.5 实施阶段 30 1.5.1 主机配置 31 1.5.2 安装Oracle Clusterware 40 1.5.3 安装Oracle Database 51 1.5.4 配置Listener 55 1.5.5 创建ASM 59 1.5.6 创建数据库 63 1.6 客户端测试 71 1.6.1 客户端配置 71 1.6.2 体验Failover 72 1.6.3 体验LoadBalance 73 1.6.4 修改归档模式 74 第2章 什么是RAC集群 76 2.1 集群分类 76 2.2 集群环境的特殊问题 76 2.2.1 并发控制 77 2.2.2 健忘症(Amnesia) 77 2.2.3 脑裂(Split Brain) 77 2.2.4 IO隔离(IO Fencing) 78 2.3 RAC集群 78 2.3.1 存储层 79 2.3.2 网络层 79 2.3.3 集群件层 80 2.3.4 应用层 81 2.4 小结 81 第3章 Oracle Clusterware 82 3.1 Clusterware和RAC的关系 82 3.2 Oracle Clusterware组成 83 3.2.1 磁盘文件 83 3.2.2 Clusterware后台进程 89 3.2.3 网络组件 91 3.3 Clusterware的日志体系 95 3.4 小结 95 第4章 RAC原理 96 4.1 数据库基本原理 96 4.1.1 并发访问和数据一致性 97 4.1.2 事务和隔离级别 98 4.1.3 Oracle支持的隔离级别 99 4.2 Oracle单实例的并发控制机制 100 4.2.1 Lock 100 4.2.2 数据记录的行级锁 101 4.2.3 Latch 105 4.2.4 Latch和Lock对比 106 4.2.5 进一步理解 106 4.3 RAC下的并发控制 109 4.3.1 DLM中资源和锁 110 4.3.2 Non-Cache Fusion资源 111 4.3.3 Cache Fusion资源 112 4.3.4 GRD(Global Resource Directory) 114 4.3.5 PCM Lock 114 4.3.6 Cache Fusion 116 4.3.7 RAC并发控制总结 121 4.4 RAC架构 121 4.4.1 SGA的变化 122 4.4.2 后台进程的变化 122 4.4.3 文件 124 4.4.4 SCN 126 4.4.5 Cache Fusion、GCS、GES 127 4.5 RAC和Clusterware的交互 127 4.5.1 Clusterware层 128 4.5.2 RAC层 129 4.6 小结 132 第5章 存储方案——ASM初步 133 5.1 Shared-Disk和Shared-Nothing架构 133 5.2 Oracle 10g RAC的存储方案介绍 134 5.3 ASM架构 134 5.3.1 ASM实例 135 5.3.2 文件 136 5.4 配置ASM 136 5.4.1 安装位置 136 5.4.2 创建ASM磁盘 136 5.4.3 配置ASM实例 144 5.4.4 创建磁盘组 146 5.4.5 在数据库中使用ASM的磁盘组 147 5.5 ASM实例:将数据库迁移到ASM 147 5.5.1 试验说明 147 5.5.2 操作步骤 148 5.5.3 最后验证 155 5.6 小结 156 第2部分 实战篇 157 第6章 RAC维护工具集 158 6.1 Oracle Clusterware工具集 158 6.2 节点层 158 6.3 网络层 159 6.4 集群层 161 6.4.1 crsctl 162 6.4.2 OCR命令系列 167 6.5 应用层 176 6.5.1 crs_stat 176 6.5.2 onsctl 180 6.5.3 srvctl 186 6.5.4 恢复 192 6.6 小结 196 第7章 HA和LB 197 7.1 什么是高可用性 197 7.2 Failover 198 7.2.1 Client-Side Connect Time Failover 198 7.2.2 TAF(Transparent Application Failover) 198 7.2.3 Client-Side Failover和TAF的对照试验 199 7.2.4 Server-Side TAF 202 7.3 Oracle Clusterware HA框架 210 7.3.1 术语介绍 210 7.3.2 配置命令 213 7.3.3 完整实例 219 7.4 LoadBalance 223 7.4.1 Connection Balancing 223 7.4.2 利用Service分散负载 227 7.5 测试LoadBalance 228 7.5.1 通过Listener日志区分路由来源 228 7.5.2 测试方法 229 7.5.3 测试过程 230 7.6 小结 234 第8章 备份 235 8.1 概述 235 8.1.1 备份 235 8.1.2 恢复 236 8.1.3 RMAN工具 238 8.2 使用Flash Recovery Area 238 8.2.1 配置Flash Recovery Area 239 8.2.2 Flash Recovery Area的空间监控 239 8.3 使用RMAN 240 8.3.1 RMAN工具的使用方法 240 8.3.2 RMAN配置 242 8.4 完全备份和增量备份 248 8.4.1 完全备份 249 8.4.2 增量备份 251 8.4.3 其他RMAN命令 254 8.5 RAC的备份实例 261 8.6 小结 264 第9章 恢复 265 9.1 为什么Oracle数据库能够恢复 265 9.2 日志 267 9.2.1 日志线程(Redo Thread) 268 9.2.2 RAC的联机日志 268 9.3 恢复种类 269 9.3.1 Instance Recovery 269 9.3.2 Media Recovery 269 9.3.3 Crash Recovery 269 9.3.4 Online Block Recovery 274 9.4 介质恢复 274 9.4.1 完全恢复 275 9.4.2 不完全恢复 280 9.4.3 恢复到单实例 294 9.5 小结 302 第10章 其他恢复技术 303 10.1 数据块恢复 303 10.2 如何检查数据块一致性 304 10.2.1 使用初始化参数 304 10.2.2 DBV工具 305 10.2.3 Analyze命令 307 10.2.4 RMAN工具 307 10.2.5 dbms_repair包 308 10.3 模拟数据块不一致 309 10.4 数据块不一致处理办法 313 10.4.1 收集信息 313 10.4.2 设计恢复方法 314 10.4.3 恢复操作 316 10.5 数据块恢复实例 317 10.6 Flashback家族介绍 326 10.7 Flashback Database 326 10.7.1 Flashback Database架构 326 10.7.2 启用Flashback Database 327 10.7.3 Flashback Database 329 10.7.4 命令和视图 332 10.8 Flashback Drop 333 10.8.1 Tablespace Recycle Bin 333 10.8.2 Flashback Drop操作 335 10.8.3 Recycly Bin的维护 336 10.9 Flashback Query 和Flashback Table 337 10.9.1 Oracle 9i的Flashback Query 337 10.9.2 Flashback Version Query 339 10.9.3 Flashback Transaction Query 354 10.9.4 Flashback Table 356 10.9.5 UNDO Retntion 359 10.10 小结 360 第11章 RAC和Data Guard 361 11.1 Data Guard介绍 361 11.1.1 Data Guard架构 362 11.1.2 日志发送(Redo Send) 362 11.1.3 日志接收(Redo Receive) 365 11.1.4 日志应用(Redo Apply) 367 11.1.5 数据保护模式 367 11.1.6 自动裂隙检测和解决 368 11.2 RAC和Standby配置实例 369 11.2.1 RAC Primary和Single Standby 370 11.2.2 RAC Primary和RAC Standby 381 11.3 小结 394 第12章 RAC和Stream Replication 395 12.1 Stream的工作原理 395 12.2 Data Guard和Stream对比 396 12.3 RAC Stream配置实例 397 12.3.1 Single(Source)和RAC(Target) 398 12.3.2 RACRAC的复制 404 12.3.3 STRMMON工具 425 12.4 小结 427 第13章 深入ASM 428 13.1 非ASM的存储结构 428 13.2 ASM存储结构 429 13.3 ASM文件系统 430 13.3.1 ASM Metadata 431 13.3.2 Physical Metadata 431 13.3.3 Virtual Metadata 433 13.3.4 Disk Recovery 434 13.4 条带化(ASM Striping) 435 13.4.1 ASM文件模板(ASM File Template) 435 13.4.2 ASM别名(ASM File Alias) 436 13.5 RDBMS和ASM之间的交互 445 13.6 ASM的实例恢复 446 13.7 ASM和OS Filesystem之间交互 447 13.7.1 dbms_file_transfer包 447 13.7.2 RMAN的CONVERT方法 453 13.7.3 ASM和TTS 453 13.8 ASM的限制 456 13.9 小结 457 第14章 性能RAC 458 14.1 RAC的若干特点 459 14.2 AWR 461 14.2.1 启用AWR 462 14.2.2 修改AWR配置 462 14.2.3 产生AWR报告 462 14.3 ASH 464 14.4 SQL调整策略 466 14.4.1 SQL语句的执行过程 466 14.4.2 SQL性能调整的基本方法 467 14.4.3 PL/SQL和SQL 471 14.5 小结 473 前言   从2008年2月开始动笔到定稿出版,这本书的编写几乎花费了我10个月的时间,大大超出了最初3个月的计划。这个过程虽然不能说寝食难安,但其中的酸甜苦辣也是如人饮水,冷暖自知,如果一开始就知道要投入这么大精力,我真怀疑自己是否有勇气开始动笔。.   回顾自己学习RAC的经历,我对它又爱又恨。因为对技术本身的痴迷加上高“薪”技术的诱惑,所以爱;因为没有能力掌控,所以恨。时至今日,我仍然不敢说自己已完全掌握了RACRAC的学习过程是对我所有学习过的IT技术的大复习,包括OS、Network、Storage、Database等,甚至可能还有很多领域我从未涉足。   相信很多对Oracle有一定经验的DBA和我有同样的感觉,RAC比普通的Oracle更难入门。不仅因为比比皆是的晦涩艰深的术语,也不仅因为它覆盖的技术领域太广,更主要的是可用的参考资料太少。我翻遍了所有能够获得的书籍资料,但是这些资料都是从很基本、很琐碎的细节开始,从下到上(Bottom-Up)的学习方式是虽然看到了“树”,但是看不到“林”。虽然无树不成林,技术细节总是必要的,但过于琐碎的分解给我造成更大的迷惑,到底RAC的总线是什么?GCS、GES、GRD、PCM这些东西是如何堆砌在一起的?   这段痛苦经历促使我决定以自己的方式讲述RAC的故事,如果大家能在这个旅程中豁然开朗,对我而言将是一件很有趣又备感欣慰的事。   本书特点   本书最大的特点是侧重于理论讲述和实战演练,尤其是对理论的剖析有一定的深度,并通过大量完整的案例来论证这些理论。DBA和开发人员特点不同,对于开发人员来说,从某种角度上,强调创造力决定高度。但是DBA要求的是稳定压倒一切,DBA必须去适应自己所使用的产品,而不能期待产品去适应自己,更没有机会去改变产品,因此了解这个产品的工作原理是非常必要的。   现在网络发达,遇到问题时,有论坛、BBS各种渠道可以利用。相信大家都有类似这样的体会:“哇,这家伙怎么能想到这样做?怎么敢这样做?”。其实这些高手的所谓“特技”都不是偶然,也不是贸然下手,只是他对产品有比你更深刻的认识,知道问题的前因,知道行动的后果,所以看起来他可以“天马行空、为所欲为”,而你只能“亦步亦趋、如履薄冰”。因此,我个人更强调对基础的掌握,而不要迷信有什么技巧或捷径。请相信只要能在一个领域持续上数年,你就在这个领域里能成为专家。   采用这种方式还有一个原因,RAC覆盖知识面广、资料难觅也是众所周知的。时至今日,我不敢妄谈精通,只是尽可能地把所知中规中矩地记录下来,不敢随意发挥,希望能够抛砖引玉,并对大家有所启发和帮助。   本书适用读者   大话Oracle RAC,书如其名,本书不是一本Oracle数据库的基础入门书籍,而是关于Orace RAC的入门指导。   这本书适合于初、中级数据库管理员和数据库开发人员,但是本书不会特别讲述什么是SGA,什么是数据文件,什么是字典视图,什么是日志,也不会专门介绍如何创建表空间、用户等。如果你对上面这些名词、操作都非常陌生,那么这本书不适合你,请先夯实单实例的基础(可以参考下面的“学习资源推荐”)再来看这本书。   本书假定读者已经脱离了入门阶段。如果你对Oracle单实例数据库有一定基础,并做过类似DBA工作,但是由于条件所限,一直对RAC敬仰如滔滔江水,渴望拥有却不知如何下手,那么这本书就非常适合你。如果你需要在最短时间内充电RAC相关知识,并且敢在简历上写下“有一定RAC经验”,那么这本书就是为你而准备的。   可能你已经有了一定的Oracle使用经验,比如做过些安装、管理、备份操作,对Oracle数据库有了一定感性认识,但是并没有完整的理论框架,那是最好的,你可以通过这本书学习到Oracle最核心的理论基础,并看到这些理论在单实例和RAC环境下的各种应用,不过还是建议你找一本基础入门的书籍放在手边,方便速查。   学习资源推荐   http://www.oracle.com/pls/db102/portal.all books,Orace 10.2官方文档,最权威的文档,适合系统学习。   http://www.oracle.com/technology/index.html,OTN,资料新、覆盖面广,尤其适合快速入门、图文并茂;缺点是分类方式不太适合中国用户的习惯。   https://metalink.oracle.com,Metalink,各种深度的文档一应俱全,也是所有补丁的发源地,不过用户需要申请账号。   http://www.itpub.net,这是很多Oracle DBA开始成长的地方。   http://www.eygle.com,这是Eygle的个人网站,Eygle(Oracle ACE Director)是国内Oracle数据库领域中的知名资深人士。   http://asktom.oracle.com,大名鼎鼎的AskTom。 .  http://www.databasejournal.com和http://www.oracle-base.com这两个站点程度类似,经常会有针对某专题的系列文章,适合初学者。   本书结构与内容   本书共14章,分为集群理论篇、实战篇两大部分。   工欲善其事,必先利其器,学习RAC,环境是最重要的。所以第1章“RAC初体验”将引导读者在一台PC机上搭建出一个2节点的RAC环境,并在建好之后快速感受RAC两大亮点——负载均衡、高可用性。这一章内容虽然是介绍安装,但并不是简单的单击“上一步”、“下一步”按钮,其间渗透了许多作者的体会和心得,所以即使有安装经验的读者,也无妨做一次快速翻阅,相信也会有所收获。   从第2章至第5章主要是基础理论介绍,第2章首先概述了集群的概念、分类,并在其基础上对RAC架构做一个快速浏览。接下来的3章,每一章都讨论了RAC的一个组件。   如果对RAC环境做一个解剖,可以发现集群软件架构可以分为3个组件:Clusterware Manager(集群件)、Distribute Lock Management(DLM,分布式锁管理器)、Oracle实例。这3个组件在Oracle的发展历史各不相同。Oracle在版本9之前一直是依赖厂商的集群件产品,比如Sun的Clusterware。直到Oracle 9才开始提供自己的集群件产品Cluster Manager,但是只支持部分平台。到了版本10,这个产品已经演变成一个功能完整、支持所有平台的独立产品Oracle Clusterware,这个产品不仅支持RAC,而且还能为其他非Oracle软件提供高可用支持。第3章专门介绍Oracle Clusterware。而第7章会演示如何利用这个产品搭建一个Web集群。   无论Oracle还是IBM、微软的数据库产品,无论单实例数据库还是集群数据库,它们核心功能都是一样的——事务处理,并在保证数据完整的前提下提供最大的并发支持。大家都知道,数据库系统是通过“锁机制”来实现的,而在集群环境下,使用的是“分布式锁机制”。其实不仅仅是数据库,所有支持多用户并发的系统都需要某种“锁机制”,因此无论“锁”还是“分布式锁”都不是Oracle所特有的,它是所有这些系统的共性。..   Oracle单实例的锁机制包括两种:Lock和Latch,Oracle RAC同样也离不开这两种锁机制,但是Oracle RAC又多了一种新的锁——分布式锁,这种锁的管理机制叫作分布式锁管理器(DistributedLockManager,DLM)。Oracle集群最初使用的是操作系统的DLM,但是操作系统的DLM仅适用于数量很少的资源的分布式管理,比如对文件,对于Oracle数据库动辄G级的数据量,这种DLM就非常不适合。所以Oracle开发了自己的DLM机制,在RAC之前的OPS中,这种技术叫作PCM(Parellel Cache Management),到了RAC,这个技术改名为Cache Fusion。可以说,RAC的学习、管理、优化都是围绕着Cache Fusion进行的。不过与Clusterware不同,Oracle并没有把DLM独立为一个产品,而是把DLM功能集成到数据库内核中,如果安装过程中检测到Clusterware的存在,就会激活内核的DLM功能。   第4章围绕着“锁”在单实例和RAC的使用,详细讲述了RAC原理。这一章是全书最重要的部分,也是作者花费心血最多的章节,希望读者详细研读。   以“锁”为总线来学习RAC,这个灵感来自于我在雅虎工作期间主持的一次内部培训,也正是这个灵感造就了本书。   当时雅虎的一个系统要从SQL Server转移到Oracle,大家希望能对SQL Server和Oracle的区别有所了解,于是我就主持了一次内部培训。当时对培训主题的选择是煞费苦心,如果从两个产品的媒体发布数据、销售数量做比较,对于技术人员显然没有任何意义;如果单从产品功能、用户友好性来比较,也没有任何说服力。在否定了若干方案后,我开始思考“数据库最本质的功能是什么?”,思索的结果就是最终选定“并发和锁”作为比较的主题。通过介绍两种产品的“锁机制”是如何实现的,以及各自的实现方法对并发能力的影响,从而达到比较的目的。这个讲义(PPT格式)可以在我的Blog(http://space.itpub.net/75321)找到。需要说明的是,这个讲义是以Oracle 9i和SQL Server 2000为基础,其中关于Oracle 9i的部分对Oracle 10g仍然有效,但是SQL Server 2000部分对其他版本是否适用,就需要根据具体情况来定。   这次内部培训之后,借助这个灵感,我对RAC知识重新梳理,终于找到了学习RAC最有效的方法(至少我个人这样认为),也最终产生这本书。   第5章带领读者认识ASM,这是Oracle 10推出的自动存储管理系统,这个系统同时综合了集群文件系统和卷管理器两方面功能,也是Oracle 10 RAC的首选存储方案。   本书的第6章到第12章是实战部分,每一章都是一个独立的讨论主题。   Oracle 10g中的管理工具被大大加强,提供了基于Web界面的管理方式。这些工具虽然简单好用,但对于初学者来说恰恰也是缺点,首先这些工具隐藏了背后的运作机制,其次对于这些工具本身的学习也会分散读者的精力,何况在某些现场根本没有图形界面可以使用。所以,我更推荐读者在学习阶段还是使用“笨”方法:手工输入命令+观察输出结果。在有一定的经验以后,再去使用各种图形工具,更何况Oracle中需要记忆的命令数量也是非常有限的,差不多一章的内容就可以全部覆盖。   因此,第6章把RAC环境中可能用到的命令进行整理,并按照一种便于记忆的方式进行归类。但这一章并不是命令手册,很多命令会有些较深入的分析。当然在以后的章节学习中,读者可能还会需要反复查阅这一章。   第7章介绍RAC最主要的亮点“HA和LB”,第8章介绍RAC的备份,第9章介绍恢复技术中的完全恢复、不完全恢复,第10章介绍其他恢复技术,包括数据块恢复、Flashback功能家族介绍。   Oracle的高可用家族除了RAC还有两个兄弟:Data Guard和Stream Replication,相对于RAC,这两种方案都比较容易上手,也是目前企业常用的HA方案。但是简单好学并不是代表功能会打折扣。这三兄弟每个既能独当一面,也可以互相配合使用,提供更强大的功能。但是,这三个兄弟针对的问题并不一样,适用场合也不尽相同。因此学习Oracle的高可用方案时,必须搞清楚这些方案的区别,最贵的并不一定是最适合的。因此,第11章比较了RAC和Data Guard的区别,以及二者如何搭配使用。第12章解释了RAC和Stream Replication的区别和合作。   第13章是对ASM的深度介绍,其中ASM Alias部分很重要,对于用户可能遇到的问题给出了具体的解决办法。   第14章主要介绍了调优方面的内容,但只介绍了SQL调整策略以及RAC环境下要考虑的特殊内容。之所以只选择这些内容,是因为Oracle性能调整是一个非常大的主题,经典话题包括主机、内存、网络调整,SQL语句调整、等待事件调整等,新话题可以讨论Oracle 10g新添的若干工具AWR、ASH、ADDM等。如果在一章中把这些内容都一网打尽,只能是蜻蜓点水、点到为止,与其这样不痛不痒地堆砌,还不如有针对性地深入讨论几个重点。需要更多了解性能优化内容的读者,可以参考其他资料和文档。   本书声明   (1)除了特别声明外,本书实例中使用的操作系统是Red Hat AS 4.0 Update 4,使用的数据库Oracle 10 R2版。   (2)部分工具软件的下载地址。   Oracle Database、Oracle Clusterware、ASM Lib驱动   http://www.oracle.com/technology/global/cn/software/index.html   Red Hat Advanced Server   https://www.redhat.com/apps/download   (3)作者在编写本书过程中,以“够用就好”为原则,尽量覆盖到RAC所有知识点。但所有观点都出自作者的个人见解,疏漏、错误之处在所难免,欢迎大家指正。读者如果有好的建议或者学习本书过程中遇到问题,欢迎到作者的博客(http://space.itpub.net/75321)留言进行探讨,或者发送邮件到mingyan926@hotmail.com,希望能够与大家一起交流和进步。   感谢   在此,感谢芮玉奎先生,他在内容结构的编排方面给我很多帮助,感谢eygle,正是他的推荐,才促成我与人民邮电出版社的这次合作。在本书编写过程中,还得到了很多朋友的支持和帮助,包括清华大学的焦丽静、IT168的贝贝、阿里巴巴的李红星、邹大鹏,Oracle公司的rebeca、bryanxu,爱康网的cindy,还有公司领导林镇武,同事史季强、邝俊彪等,在此一并感谢。   在看得见的地方学习知识,在看不到的地方学习智慧。同时也祝愿大家在Oracle RAC的学习道路上顺风顺水。...   张晓明   2009年2月    序言   16年前,当我第一次接触Oracle数据库时,Oracle数据库对我来说就像一位带着面纱的美女,神秘而又憧憬。看着我们的DBA花了两三天的时间,在键盘上输入几百条甚至上千条命令,经过几次失败,才成功地在一台HP G30小型机上安装成功时,我就想也许还是做一个数据库开发员更适合我。那时的Oracle还没有图形化安装界面,所有操作都是通过命令行完成的。作为开发人员的我们不敢也不允许对数据库数据增、删、改、查之外的其他操作。数据库的安装、配置、建表、建索引、增加用户等也只有DBA才能完成。.   但在今天,情况已经完全不一样了,以前只有DBA能完成的工作现在大部分都可以由开发人员或其他非DBA人员来完成。大部分的开发人员都有在自己的PC机上安装Oracle数据库的经历,运行Oracle Universal Installer和运行其他普通的图形界面应用程序已经没什么区别,用户甚至可以不用提供任何参数,只是点击几下鼠标即可完成,整个过程可以不超过30分钟。但这并不意味着我们不需要DBA,就像波音747飞机上的驾驶员,虽然747的自动导航系统可以控制飞机从起飞、巡航到降落,但我相信没有一个乘客会说不需要飞行驾驶员了,相反我们会提出更高的要求,因为我们需要更安全、更舒适的飞行。同样,DBA也是如此。   我从事IT工作已近20年,还从来没像今天这样关心数据库的安全和可靠性,因为数据库已经成为我们一切业务的核心。我们公司为电信企业提供业务服务,这就要求我们的数据库一年365天不间断地可靠运行,任何一种中断都是不能接受的。每天数据库要处理上亿次的交易,每天数据量接近8GB,并还在不断增长中。为提高数据库的可用性、扩展性和可靠性,我们的DBA团队尝试了不同的技术,最后采用了Oracle RAC。经过整个团队的努力,现在我们已经成功地在我们的生产环境部署了Oracle RAC。张晓明先生,既是本书的作者,也是带领我们DBA团队成功实施Oracle RAC的技术领头人。我相信不久,随着RAC技术越来越成熟,会有越来越多的公司选择RAC。作为DBA,就像作者在书中写的那样:“对于还从没接触过RAC的DBA来说,现在该是未雨绸缪的时候了。”..   在书中,作者也遵循了著名的Oracle大师,Oracle公司副总裁Thomas Kyte提倡的“Test thing yourself and base decision on proven examples”。他从一个简单的实施实例出发,循序渐进、由浅入深地讲解了Oracle RAC的实施细节、RAC的工作原理和实施、维护过程中可能碰到的问题和解决技巧。我相信所有的DBA都可受益匪浅。   IBM创始人Thomas J.Watson曾说过:“Though have been father of every advance since time began,‘I didn't think’has cost the world millions of dollars”,我想这本书能带给你的不仅是知识和技术,更是一种不同的思维和观点。我希望每位读者能从书中得到更多的思考,并为这个世界节省更多的“millions of dollars”。...   林镇武 副总裁   北京无限新锐网络科技有限公司   
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值