淘宝网首席DBA陈吉平著.docx
- 文档编号:30407885
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:139
- 大小:964.85KB
淘宝网首席DBA陈吉平著.docx
《淘宝网首席DBA陈吉平著.docx》由会员分享,可在线阅读,更多相关《淘宝网首席DBA陈吉平著.docx(139页珍藏版)》请在冰豆网上搜索。
淘宝网首席DBA陈吉平著
搭建Oracle高可用系统
1.1
1.2
1.3
1.4
1.5
1.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数据库
5
1.1.1
Oracle数据库体系结构
Oracle是一个可移植的数据库——它在相关的平台上都可以使用,即具有跨平台特性,也正
由于具有这个特性,加上Oracle优越的性能与开放性,才使得Oracle能取得今天这样的成绩。
不过,在不同的操作系统上,Oracle除了内核是完全一样的以外,其他地方也略有差别,如在
Linux/Unix上,Oracle是多个进程实现的,每一个主要函数都是一个进程;而在Windows上,则
是一个单一进程,但是在该进程中包含多个线程。
从其内核,也就是内部的整体构架上来看,Oracle在不同的平台上是一样的,如内存结构
(Memorystructure)、后台进程(Backgroundprocess)、物理与逻辑结构(Physical&Logical
structure)等等。
所以,作为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高可用环境——企业级高可用数据库架构、实战与经验总结
6
1.1.2
第1章什么是Oracle高可用环境
Oracle实例(Instance)
Oracle内存结构
Oracle内存结构主要可以分共享内存区与非共享内存区,共享内存区主要由SGA(System
GlobalArea)组成,非共享内存区主要由PGA(ProgramGlobalArea)组成(见图1-1)。
图1-1
Oracle内存结构
从图1-1中可以看到,Oracle共享内存区主要包括数据缓冲区(Databuffer)、共享池(Shared
pool)及一些其他的结构。
而PGA则主要包括会话的一些信息及排序区,Hashjoin区域等,下
面分别介绍这些内容。
SGA
系统全局区(SGA,SystemGlobalArea)其实是一块巨大的共享内存区域,包含了Oracle
的数据缓冲及众多的控制结构。
这里的数据可以被Oracle的各个进程共用,如果有互斥的操作,
如锁定一个内存对象,则需要通过Latch与Enqueue来控制。
每个Oracle实例(instance)只能启动一个SGA,除非通过RAC等一些特殊的全局管理方式,
构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结
1.1理解Oracle数据库
否则不同的实例只能访问自己的SGA区域。
通过如下的方式就可以查看SGA大小:
10gR2Piner>showsga
TotalSystemGlobalArea8877225568bytes
FixedSize755296bytes
7
VariableSize
DatabaseBuffers
486539264bytes
8388608000bytes
RedoBuffers1323008bytes
以上结果是一个典型的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-2
SQL语句的分析过程
所以,如果大量的,频繁访问的SQL语句都不采用绑定(Bind)变量,Oracle为了做SQL
的硬分析,Sharedpoollatch将变得严重争用与等待,同样也会耗费大量的CPU,直到机器的资
源耗尽。
另外,因为Oracle会从共享池中分配空间来保存刚做完硬分析的SQL语句,也将耗费
大量的内存空间,而且,这些被浪费的空间无法被重用。
对于编程者来说,要尽量提高语句的重用率,减少语句的分析时间,一个设计很差的应用程
序可以毁掉整个数据库。
为了避免出现这样的问题,Oracle从9i开始,还引进了一个新的参数
cursor_sharing,不过,因为该参数总是带来很多其他问题,如bug,所以,在现有的数据库版本
上,还是不建议在高可用的生产环境中使用。
构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结
1.1理解Oracle数据库
9
共享池采用LRU算法来决定共享池中的对象是否继续保存,因为其空间毕竟有限,不可能
无限保存所有的信息。
所以,假设一个语句已经被执行过了,如果长时间没有被使用,重新执行
的时候,也可能面临重新分析,如果真的执行次数如此之少,就不是高可用环境需要关心的了。
对于间歇性访问的比较大的对象,如自定义的过程与包,如果不想在运行过程中被系统自动
交换出去,可以调用DBMS_SHARED_POOL.KEEP存储过程将该过程或包pin在共享池中,以
减少重新载入的巨大代价。
我们可以通过如下命令手工清除共享池的内容,除了有指导的特殊情况下外,该命令不建议
在高可用的生产环境上运行。
SQL>altersystemflushshared_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说明了预测的共享池大小与现在大小的比例。
对于并发很多,而且访问频繁的高可用环境,需要避免如下的一些情况,在本书的后面将有
详细的案例分析来说明其原因与避免方法:
共享池不够或bug导致的0431错误,该错误可能导致系统无法访问。
分析数据改变导致执行计划改变,错误的执行计划可能导致系统无法运行。
增加了新的对象,如索引,引起执行计划改变而导致系统无法运行。
修改表导致依赖的存储过程或者是包失效,而无法自动编译成功,导致系统崩溃。
错误的操作方法导致严重的Latch争用与等待。
构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结
10
第1章什么是Oracle高可用环境
数据缓冲区(Databuffer)
数据缓冲区(Databuffer)
数据缓冲区(Databuffer)是Oracle中用于数据块缓冲的区域,数据库常规情况下读写(非
直接读写)数据块,Undo块等,都会经过这个缓冲区,并适当地保存在缓冲区。
如果下一次请
求操作同样的块,则不需要从磁盘获得,大大提高了系统的响应速度。
数据缓冲区虽然不像共享池那样容易导致系统故障,但是,它却是影响OLTP系统性能的关
键,因为它的Cache技术可以很大程度地避免磁盘寻道,直接从Databuffer中获得。
所以,Oracle
把从Databuffer获得数据块叫Cachehit,把从磁盘获得数据块叫Cachemiss,它们的比率就是我
们常说的Databuffer命中率。
在一个典型的OLTP的环境中,或者对事务型以及小查询型的数据库来说,更高的命中率意
味着更快的响应速度,所以命中率一般要求在95%以上。
大的Databuffer对提高系统的性能有巨
大的好处,因为Databuffer比较大,缓冲的数据块也就比较多,命中率也就更高。
但是在典型的OLAP环境中,大的Databuffer则不一定是必要的,因为OLAP的查询基本
是要求从磁盘返回,而且以直接读写居多,直接读写是不经过数据缓冲区的,使得命中率失去意
义。
所以在OLAP环境中,需要考虑用更多的磁盘驱动器,OLAP的速度取决于硬盘的多少与系
统的带宽。
数据缓冲区中的块基本上在两个不同的列表中管理。
一个是块的“脏”表(DirtyList),表
示被用户修改过的数据块,采用检查点队列(checkpointqueue)来管理这些脏的数据块,必要的
时候通过数据库写进程(DBWR)来写入这些脏块;另外一个队列是不脏的块的列表(LRUList),
比如通过Select从磁盘获得的数据块。
一般的情况下,Oracle使用最近最少使用(LeastRecently
Used,LRU)算法来管理这些队列,但是,从8i开始,另外还增加了Touch的概念,不仅仅是
纯粹的LRU算法。
块缓冲区高速缓存又可以细分为以下三个部分Defaultpool、Keeppool、Recyclepool,在9i
以前,它们对应的是db_block_buffers、buffer_pool_keep、buffer_pool_recycle三个参数,分别表
示每个缓冲区块的个数。
从9i开始,又重新引入了三个新的参数:
db_cache_size、db_keep_cache_
size、db_recycle_cache_size,分别表示该缓冲区的字节大小。
从9i开始,Oracle支持创建不同块尺寸的表空间,这个新的特性同时也解决了在不同块大小
的数据库之间传输表空间的问题,并且可以为不同块尺寸的数据块指定不同大小的数据缓冲区。
不同块尺寸的数据缓冲区的大小就由相应参数db_nk_cache_szie来指定,其中n可以是2,4,8,
16或32。
如创建了一个大小为2K的非标准尺寸的表空间,就可以指定db_2k_cache_size为这个
表空间指定缓存区的大小。
构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结
1.1理解Oracle数据库
11
注意:
db_block_buffers与db_cache_size这两种不同类型的参数,不能同时设置。
另外,
db_nk_cache_size不能设置默认标准块大小的缓冲区,如默认块大小为8K,则不
能设置参数db_8k_cache_size。
正确使用Defaultpool、Keeppool、Recyclepool也可以提高系统的性能,如把一个访问很频
繁的表或索引放置在适当大小的Keeppool中,可以减少物理读,提升IO性能。
是否决定使用
这个功能,要看系统的具体情况,如参考Statspack中的Segment统计信息,关注其中的物理读
部分,分析Top物理读的对象,如果有些对象的确不大,但是物理读又很大,就可以考虑缓冲分
离。
视图v$db_cache_advice与共享池的v$shared_pool_advice一样,由Oracle自动根据一些数学
模型算法,收集信息后产生的一系列建议值,可以作为调整Databuffer大小的参考。
v$bh与x$bh
v$bh在研究与查询Databuffer使用上,是一个非常不错的视图,非常详细地记录了数据块
在数据缓冲区内的使用情况,一条记录对应一个Block的详细信息。
如果通过如下语句来查询v$bh的来源,可以看到这个视图来源于基表x$bh与x$le,但是,
主要数据与字段都是来源于x$bh的。
SQL>select*fromv$fixed_view_definitiontwheret.view_name='GV$BH'
不同的是,x$bh包含了更多的信息,如touchcount信息,在Oracle8i以上作为LRU算法的
一个重要的参考信息,表示了一个块的热点程度。
touchcount信息对应到x$bh的tch字段,而段
的data_object_id信息对应到x$bh的obj,或者是v$bh的objd。
有了这些基本信息,其实就很好
确认热点块在哪里了。
下面简单地介绍几个关于这个视图与基表的实用方法。
(1)对象有多少个数据块缓冲在Databuffer中
为了详细说明具体的情况,先创建一个测试表,并且插入一定的记录进去。
Piner@10gR2>createtabletest(aint);
Tablecreated.
Piner@10gR2>begin
2foriin1..5000loop
3insertintotestvalues(i);
4endloop;
5end;
6/
PL/SQLproceduresuccessfullycompleted.
Piner@10gR2>commit;
Commitcomplete
构建0racle高可用环境——企业级高可用数据库架构、实战与经验总结
12
第1章什么是Oracle高可用环境
如以上,先创建了一个叫test的表,并插入了5000条记录,插入记录后,用showspace存储
过程分析一下表的空间使用情况。
关于这个存储过程的具体代码,在本书的附录B中可以获得,
因为这个存储过程本身很通用,这里就不多介绍这个存储过程本身了。
Piner@10gR2>setserveroutputon
Piner@10gR2>execshow_space('TEST');
TotalBlocks............................16
TotalBytes.............................131072
UnusedBlocks...........................0
UnusedBytes............................0
LastUsedExtFileId....................4
LastUsedExtBlockId...................17
LastUsedBlock.........................8
PL/SQLproceduresuccessfullycompleted.
可以看到的是,这张TEST的表一共使用了16个块,数据文件id为4,我们再分析一下数
据所在的Rowid。
Piner@10gR2>selectf,bfrom(
2selectdbms_rowid.rowid_relative_fno(rowid)f,
3
dbms_rowid.rowid_block_number(rowid)b
4fromtest)groupbyf,b;
FB
--------------------
412
420
413
421
414
416
422
415
8rowsselected.
可以看到,数据块其实只占用了8个块,但是表合计占用了16个数据块,另外8个块是什
么呢,它们是段头,位图块等,是表中的额外开销。
至于这些块的详细信息,在本书的表空间与
数据分布一章会有详细介绍,现在只需要知道,该表有16个block,数据块占了8个。
注意:
以上通过Rowid查询使用了哪些数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 淘宝 首席 DBA 陈吉平著