淘宝网首席DBA陈吉平著

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

搭建Oracle高可用系统1.11.21.31.41.51.6理解Oracle数据库Oracle高可用特性(HighAvailability)搭建高可用的周边辅助环境高可用应用设计高可用数据库设计高可用性案例1.7总结4第1章什么是Oracle高可用环境引言近几年来,随着IT技术的不断进步,以及业务需求的不断提高,搭建一个数据库高可用环境已经成为很多企业迫切的需求。本书从Oracle及Oracle周边环境分析Oracle高可用环境的特性,为用户搭建一个良好的Oracle高可用环境打下一定的理论基础。本章是本书的第1章,仅仅提供一些Oracle的基础理论知识与高可用性构架的思想,也希望能起到一个引导作用,为顺利阅读以后的章节打下一定的基础。通过本章,希望能了解如下内容:理解Oracle的大致体系结构理解Oracle内存结构与后台进程理解Oracle物理与逻辑结构理解OracleMAA最高可用性结构与计划理解Oracle的典型高可用特性Oracle并行服务器(OPS/RAC)Oracle数据保护(Standby/Dataguard)Oracle数据复制(AdvancedReplication/Streams)Oracle主机上的HA理解如何搭建一个高可用环境辅助环境的高可用设计应用的高可用设计数据库的高可用设计理解一些典型的高可用设计的案例构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结1.1理解Oracle数据库1.1理解Oracle数据库51.1.1Oracle数据库体系结构Oracle是一个可移植的数据库——它在相关的平台上都可以使用,即具有跨平台特性,也正由于具有这个特性,加上Oracle优越的性能与开放性,才使得Oracle能取得今天这样的成绩。不过,在不同的操作系统上,Oracle除了内核是完全一样的以外,其他地方也略有差别,如在Linux/Unix上,Oracle是多个进程实现的,每一个主要函数都是一个进程;而在Windows上,则是一个单一进程,但是在该进程中包含多个线程。从其内核,也就是内部的整体构架上来看,Oracle在不同的平台上是一样的,如内存结构(Memorystructure)、后台进程(Backgroundprocess)、物理与逻辑结构(Physical&Logicalstructure)等等。所以,作为Oracle爱好者,或者是OracleDBA,了解了Oracle的体系结构,就基本了解了Oracle的运行原理。一般来说,Oracle把一系列物理文件,如数据文件(Datafile)、控制文件(Controlfile)、联机日志(Redologbuffer)、参数文件(Spfileorpfile)等物理结构及与之对应的逻辑结构,如表空间(Tablespace)、段(Segment)、块(Block)等组成的集合,称为数据库(Database)。与此对应,Oracle内存结构和后台进程被做成数据库的实例(Instance),一个实例最多只能安装(Mount)或打开(Open)在一个数据库上,负责数据库的相应操作并与用户交互。一般情况下,一个数据库对应一个实例,但是在特定的情况下,如OPS/RAC的情况下,一个数据库可以对应到多个实例。作为现在使用最广泛的关系型数据库,Oracle到底有什么特性能让它保持如此良好的运行状态呢?除了Oracle的跨平台特性与本身技术一直在发展之外,Oracle的体系构架与运行原理起到了不可忽视的作用,如Oracle的并发机制与锁机制,从设计上就与其他数据库有着本质的区别,保证了让Oracle比其他数据库更适合于高并发访问的OLTP环境。在Oracle版本不断变更,新功能不断添加,系统不断完善的过程中,Oracle最基本的体系结构却是保持不变的,下面我们就先介绍一下Oracle的体系结构,从最基本的体系结构上来理解Oracle。构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结61.1.2第1章什么是Oracle高可用环境Oracle实例(Instance)Oracle内存结构Oracle内存结构主要可以分共享内存区与非共享内存区,共享内存区主要由SGA(SystemGlobalArea)组成,非共享内存区主要由PGA(ProgramGlobalArea)组成(见图1-1)。图1-1Oracle内存结构从图1-1中可以看到,Oracle共享内存区主要包括数据缓冲区(Databuffer)、共享池(Sharedpool)及一些其他的结构。而PGA则主要包括会话的一些信息及排序区,Hashjoin区域等,下面分别介绍这些内容。SGA系统全局区(SGA,SystemGlobalArea)其实是一块巨大的共享内存区域,包含了Oracle的数据缓冲及众多的控制结构。这里的数据可以被Oracle的各个进程共用,如果有互斥的操作,如锁定一个内存对象,则需要通过Latch与Enqueue来控制。每个Oracle实例(instance)只能启动一个SGA,除非通过RAC等一些特殊的全局管理方式,构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结1.1理解Oracle数据库否则不同的实例只能访问自己的SGA区域。通过如下的方式就可以查看SGA大小:10gR2PinershowsgaTotalSystemGlobalArea8877225568bytesFixedSize755296bytes7VariableSizeDatabaseBuffers486539264bytes8388608000bytesRedoBuffers1323008bytes以上结果是一个典型的OLTP环境中的SGA的分配情况,我们可以看到四个大的部分。FixedSize,包括了一些数据库与实例的控制信息、状态信息、字典信息等,启动的时候就固定在SGA中,而且不会改变。VariableSize,包含了sharedpool、largepool、javapool、streamspool、游标区和其他结构等,合计450MB左右。Databasebuffers,有时候也叫Databuffer,它是数据库中数据块缓冲的地方,数据块在内存中就缓存在这里。所以,在OLTP环境中,Databuffer是SGA中最大的缓冲区,是数据库性能高低的关键所在。Redobuffers,它是为了加快日志写进程的速度而设立的缓冲区,在一般OLTP环境中,因为提交很频繁,所以一般不会很大。SGA的大小信息也可以从v$sga中获得,与showsga的结果一样。另外,v$sgastat记录了SGA的一些统计信息,v$sga_dynamic_components则保存了SGA中可以动态调整的区域的一些动态或者手工调整记录。下面将介绍SGA中最重要的两个对象,共享池(Sharedpool)与数据缓冲区(Databasebuffer),其他的池,如Streamspool,在介绍Streams的章节时再另外介绍。共享池(Sharedpool)共享池是SGA中非常关键的内存片段,特别是在性能和可伸缩性上。由初始化参数shared_pool_size决定其大小,在Oracle10g以后,Oracle可以自动管理大小。在典型的OLTP高可用环境中,一个太小的共享池会扼杀性能,导致出现Ora-04031错误,使系统停止运行。但是太大的共享池也将消耗大量的CPU来管理。在数据仓库环境中,因为并发进程的需要,可能会分配比较大的共享池。提醒:在实际的高可用环境中,有很大的一部分故障就是因为共享池的原因而导致系统停顿甚至宕机的,如Latch争用、Ora-0431错误、Librarycache争用与等待。不正确地使用共享池只会带来灾难性的后果,所以,必须先要了解共享池的作用。共享池又可以分为SQL语句缓冲区(LibraryCache)、数据字典缓冲区(DataDictionaryCache)及一些控构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结8第1章什么是Oracle高可用环境制结构。而数据字典缓冲区与控制结构是用户无法直接控制的,所以,真正与用户有关的其实就是SQL语句缓冲区。当一个用户第一次提交一个SQL语句,Oracle会将这句SQL进行硬分析(Hardparse),这个过程类似于程序编译,会耗费相对较多的时间,因为它要分析语句的语法与语义,获得最佳的执行计划(Sqlplan),并在内存中分配一定的空间来保存该语句与对应的执行计划等信息。因为Oracle总是保存语句的执行信息,当数据库第二次或者多次执行该SQL时,Oracle自动跳过这个硬分析过程,变为软分析(Softparse)或快速软分析(Fastsoftparse),从而减少了系统分析的时间,减少CPU与Latch的消耗。注意:Oracle中只有完全相同的语句,包括大小写、空格、换行都要求一样,才能重复使用以前的分析结果与执行计划。图1-2是一个完整的SQL语句的分析过程:图1-2SQL语句的分析过程所以,如果大量的,频繁访问的SQL语句都不采用绑定(Bind)变量,Oracle为了做SQL的硬分析,Sharedpoollatch将变得严重争用与等待,同样也会耗费大量的CPU,直到机器的资源耗尽。另外,因为Oracle会从共享池中分配空间来保存刚做完硬分析的SQL语句,也将耗费大量的内存空间,而且,这些被浪费的空间无法被重用。对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间,一个设计很差的应用程序可以毁掉整个数据库。为了避免出现这样的问题,Oracle从9i开始,还引进了一个新的参数cursor_sharing,不过,因为该参数总是带来很多其他问题,如bug,所以,在现有的数据库版本上,还是不建议在高可用的生产环境中使用。构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结1.1理解Oracle数据库9共享池采用LRU算法来决定共享池中的对象是否继续保存,因为其空间毕竟有限,不可能无限保存所有的信息。所以,假设一个语句已经被执行过了,如果长时间没有被使用,重新执行的时候,也可能面临重新分析,如果真的执行次数如此之少,就不是高可用环境需要关心的了。对于间歇性访问的比较大的对象,如自定义的过程与包,如果不想在运行过程中被系统自动交换出去,可以调用DBMS_SHARED_POOL.KEEP存储过程将该过程或包pin在共享池中,以减少重新载入的巨大代价。我们可以通过如下命令手工清除共享池的内容,除了有指导的特殊情况下外,该命令不建议在高可用的生产环境上运行。SQLaltersystemflushshared_pool;与共享池相关的视图很多,这里介绍几个可能在高可用环境中经常需要用到的视图。v$sqlarea,每条记录都显示了一个SQL语句的详细统计信息,包括历史以来的执行次数、物理读、逻辑读、耗费时间等非常多的重要信息。v$sqltext_with_newlines,因为v$sqlarea只是记录了一个语句或者是一个游标的前1000个字符,如果是比较大的SQL语句,则不能在v$sqlarea中完全显示。如果通过这个视图,可以获得一个SQL语句的详细信息。在这个视图中,一个SQL语句分为多行保存,通过hash_value来标示语句,通过piece来排序。v$sql_plan视图保存了被执行的SQL语句的执行计划,可以通过特定的脚本获得以前执行过的语句的执行计划,在本书的后面章节有这样的讨论。不过,该视图在9i的早些版本,如9206以前,存在一些bug,查询该视图,可能会出现600错误,甚至导致数据库崩溃。v$shared_pool_advice,这个视图会对Oracle的共享池做一些预测,范围可能在当前值的50%~200%之间,优化者可以根据视图显示的信息做优化判断,如重新调整共享池大小。其中的字段SHARED_POOL_SIZE_FACTOR说明了预测的共享池大小与现在大小的比例。对于并发很多,而且

1 / 64
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功