ORACLE数据库物理分布设计
- 格式:doc
- 大小:42.00 KB
- 文档页数:7
Oracle的逻辑结构物理结构与实例数据库(Database)数据库是一个数据的集合,不仅是指物理上的数据,也指物理、存储及进程对象的一个组合。
Oracle是一个基于B/S模式的关系型数据库管理系统(RDBMS)。
Oracle系统体系结构由三部分构成:逻辑结构、物理结构与实例。
数据库(Database)一、Oracle的逻辑结构Oracle的逻辑结构是一种层次结构。
要紧由:表空间、段、区与数据块等概念构成。
逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。
数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不一致层次的粒度关系。
1.数据块(Data Blocks)数据块是Oracle最小的存储单位,Oracle数据存放在“块”中。
一个块占用一定的磁盘空间。
特别注意的是,这里的“块”是Oracle的“数据块”,不是操作系统的“块”。
Oracle每次请求数据的时候,都是以块为单位。
也就是说,Oracle每次请求的数据是块的整数倍。
假如Oracle请求的数据量不到一块,Oracle也会读取整个块。
因此说,“块”是Oracle 读写数据的最小单位或者者最基本的单位。
块的标准大小由初始化参数DB_BLOCK_SIZE指定。
具有标准大小的块称之标准块(Standard Block)。
块的大小与标准块的大小不一致的块叫非标准块(Nonstandard Block)。
操作系统每次执行I/O的时候,是以操作系统的块为单位;Oracle每次执行I/O的时候,都是以Oracle的块为单位。
Oracle数据块大小通常是操作系统块的整数倍。
数据块的格式(Data Block Format)块中存放表的数据与索引的数据,不管存放哪种类型的数据,块的格式都是相同的,块由块头(header/Common and Variable),表目录(Table Directory),行目录(Row Directory),空余空间(Free Space)与行数据(Row Data)五部分构成,如下图块头(header/Common and Variable):存放块的基本信息,如:块的物理地址,块所属的段的类型(是数据段还是索引段)。
数据库物理设计的内容和步骤数据库物理设计是啥玩意儿?简单来说,就是把你的数据放在一个地方,让它们井井有条地排列好,这样计算机才能轻松找到它们。
那么,这个过程是怎么进行的呢?别着急,我们一步一步来告诉你。
我们需要明确数据库的类型。
数据库有很多种,比如关系型数据库、非关系型数据库等等。
不同的数据库有不同的物理设计方法。
这里我们以关系型数据库为例,来看看它的物理设计过程。
1.1 确定数据结构在开始物理设计之前,我们首先要确定数据的结构。
这就像是给你的数据搭建一个框架,告诉计算机它们应该长成什么样子。
关系型数据库中,数据是由行和列组成的表格。
每一行代表一条记录,每一列代表一个属性。
所以,我们需要知道每个属性的数据类型(如整数、字符串等)以及属性之间的关系(如一对一、一对多等)。
1.2 选择存储引擎接下来,我们需要选择一个合适的存储引擎。
存储引擎是关系型数据库中负责将数据存储到磁盘上的软件。
不同的存储引擎有不同的性能特点和适用场景。
例如,InnoDB存储引擎适用于高并发、高可用的场景,而MyISAM存储引擎则适用于读密集型的应用。
1.3 创建表空间有了数据结构和存储引擎,我们就可以开始创建表空间了。
表空间是关系型数据库中用于存放数据的逻辑结构。
它可以是一个文件、一个分区或者一个分布式文件系统。
创建表空间时,我们需要考虑数据的容量、备份策略等因素。
1.4 分配磁盘空间在创建好表空间之后,我们需要为每个表分配磁盘空间。
这就像是给数据找一个家。
在关系型数据库中,每个表都有一个唯一的表名,我们可以通过这个表名找到对应的磁盘空间。
为了提高查询效率,我们通常会将经常访问的表放在离磁盘更近的位置。
2.1 建立索引为了提高查询速度,我们还需要为经常用于查询条件的列建立索引。
索引就像是一本字典,可以帮助我们快速找到需要的数据。
不过,索引也会占用额外的磁盘空间,并且在插入、更新和删除数据时会降低性能。
因此,我们需要权衡索引的大小和性能。
Oracle 结构图Oracle数据库由两个实体组成(1)实例(2)数据库实例实例由存储结构和进程组成,短暂存在于RAM和CPU;因此实例的生存时间其在内存的时间,我们可以启动和停止实例。
一个Oracle实例由一块被称为系统全局区SGA的共享内存以及若干进程组成。
系统全局区(SGA):在实例启动时分配,是Oracle实例的基本组件SGA也称作共享全局区,用于存储数据库进程共享的数据库信息。
它包含有关Oracle服务器的数据和控制信息,在Oracle服务器所在计算机的虚拟内存中分配。
程序全局区(PGA):在服务器进程启动时分配,并在终止进程时回收它包含有关单个服务器进程或单个后台进程的数据和控制信息内存结构(其SGA中三个必备元素):共享池(shared pool):用于存储①最近执行的SQL语句②最近使用的数据定义数据库高速缓冲(Data buffer cache):存储已从数据文件中检索到的数据块的副本重做日志缓冲区(Redo buffer cache):记录对数据库数据块所做的全部更改,主要用于恢复还有可选的是:流池(Streams pool):用于缓存流进程在数据库间移动/复制数据时使用的队列消息大池(Large pool):用于①共享服务器的会话内存②I/O服务器进程③备份和恢复操作或RMAN④并行执行消息缓冲区Java池(Java pool):存储Java命令的服务分析要求后台进程数据写进程(DBWn):负责将更改的数据从数据库缓冲区高速缓存写入数据文件日志写进程(LGWR):将重做日志文件缓冲区的更改写入在线重做日志文件系统监控进程(SMON):检查数据库的一致性,如有必要还会在数据库打开启动时数据库的恢复进程监控进程(PMON):负责在一个oracle进程失败时清理资源检查点进程(CKPT):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库信息归档进程:在每次日志切换时把已满的日志组进行备份和归档服务进程:用户进程服务用户进程(不属于后台进程):在客户端,负责将用户的SQL语句传递给服务进程组成,并从服务器端拿回查询数据用户连接到Oracle实例包括:(1)建立用户连接(2)创建会话连接是用户进程和Oracle服务器之间的通信路径会话是用户与Oracle服务器的一种特定连接数据库数据库分为物理结构和逻辑结构。
oracle物理结构在一个服务器中,每一个运行的数据库都有一个数据库实例(instancename) 相联系。
数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),即构成了oracle的内存结构。
然后启动若干个常驻内存的操作系统进程,即组成了oracle的进程结构。
除此之外,还有数据库的物理与逻辑结构。
数据库体系统结构图可以参考第一篇。
在接下来的篇幅中将分五篇来详细说明oracle数据库的体系结构。
•oracle物理结构•oracle逻辑结构•oracle内存结构•oracle进程结构•oracle连接配置结构本篇说明物理结构。
物理结构,即oracle数据库使用的操作系统文件结构。
对于数据库物理结构文件,不同的oracle版本,不同的操作系统平台上有不同的存储目录结构。
•winnt | d:/oracle/product/10.1.0/oradata/DB_NAME/*.*(oracle 10g);d:/orant/database/*.*(oracle7,oracle8)•Unix | /home/app/oracle/product/10.1.0/oradata/DB_NAME/*.*(10g);/home/app/oradata/db_name/*.*(8i,9i)数据库的物理结构文件按其作用可以分为三类:•数据文件•日志文件•控制文件物理存储结构是指从物理角度分析数据库的构成,即Oracle数据库创建后所使用的操作系统文件。
从物理存储结构上分析:每一个Oracle数据库是主要由三种类型的文件组成:数据文件、日志文件和控制文件,另外还包括一些参数文件。
其中:数据文件的扩展名为.DBF;日志文件的扩展名为.LOG;控制文件的扩展名为.CTL。
一、数据文件数据文件(Data File)用于存储数据库数据的文件,如表中的记录,索引,数据字典信息等都存储于数据文件中。
在存取数据时,Oracle数据库系统首先从数据文件中读取数据,并存储在内存中的数据缓冲区中。
oracle11g关于内存的分配方案。
1,在32位的操作系统上,安装oracle的话,oracle最大能分配到的内存是1.7G。
这样的话,推荐最好使用64位的操作系统。
这样在物理内存足够大的情况下,oracle也能分配到无限制的足够大的内存。
2,在物理内存既定的情况下,如果服务器是只为oracle应用提供的服务器。
在创建数据库实例时,oracle的典型内存分布,默认总共给sga 和pga分配系统内存的40%,同时oracle建议自动内存管理。
此时,如果选择oracle的典型内存分布,同时不选择自动管理内存分布,那么sga : pga的内存比是3:1。
但是当sga的内存达到1536M之后,就不会再增加内存了,多出来的内存全都被增加到了pga的内存中去了。
(问题一:请问一下,如果是自动管理内存分布的话,sga和pga 也会出现这样的情况吗? sga达到1536m之后也不会继续增加吗?问题二:pga增多的话,排序等的性能会增加。
但是如果适当的增加sga,将表数据全都缓存到sga中的话,内存中的排序等性能同样会得到很大的提升。
为什么典型配置在sga增加到1536m之后就不再增加了呢?)3,定制数据库实例的内存时:pga,根据实际的情况,可以增加到足够大。
sga的共享池,日志缓冲池如果过大的话,会对性能产生较大的负面影响。
sga的java池,建议20msga的共享池,建议sga的22%sga的large池,建议sga的9.9%sga的缓冲区,可以设置到足够大。
(问题三,当创建数据库实例时,如果选择的是自动管理内存的话,这时的内存结构参数的值都是0。
如果只想要手动管理sga的一个缓冲区的话,是不是必然将重新手动设置sga的全部内存结构?包括重新设置sga本身的大小?)4,问题四:请问一下,如果手动设置的话,那sga和pga的内存比应该多少比较合适?以上只是个人的一些理解,有可能有错误的地方,希望大家能帮忙指出,最后将做出总结,将错误的地方改正。
有一张图能非常清晰的表示出Oracle物理结构与逻辑结构的区别;如下图:对上图的解释:每个数据库都必须由一个或多个表空间组成。
(一对多关系)每个表空间都必须由一个或多个数据文件(data file)组成。
(一对多关系)每个表空间都可以包含一个或多个段。
(一对多关系)每个数据文件都必须由一个或多个操作系统块(OS bolck)组成。
(一对多关系)每个段都必须由一个或多个区间组成(一对多关系)每个区间都必须由一个或多个Oracle数据块(Oracle block)组成。
(一对多关系)每个区间都必须被定位并且只能定位在一个数据文件内,数据文件中的空间可以被分配一个或多个区间(多对一关系)每个Oracle数据块都必须由一个或多个操作系统数据块组成(一对多关系)物理结构1.数据文件(data file)是保存Oracle数据的操作系统文件。
数据库创建阶段会创建许多数据文件,这些数据文件可以保存数据字典、SYSAUX表空间数据以及希望同时创建的其他表空间数据。
2.操作系统数据库(OS block)是文件系统所使用的最小分配单元。
比如:4KB 或8KB逻辑结构1.表空间(tablespace)SYSTEM表空间包含数据字典(描述数据库自身结构、所有对象、用户及角色的的表)。
SYSTEM表空间是数据库中数据字典所处的位置。
如果没有SYSTEM表空间,那么数据库就无法运作创建数据库后,需要创建存储数据的其他表空间。
2.段(segment)表空间中被分配给若干个段。
段是存储的对象,如一张表或一个索引。
注意:视图不存储数据所以不是段3.区(extent)是为某个段分配的若干邻近数据块的集合。
可以在表空间内本地管理区间4.数据块(block)是数据库内I/O最小单位。
数据库需要读取数据时总是无法只读取一条记录,而是必须读取整个数据块。
只有在创建表空间时就指定数据块容量,无法修改数据块容量。
ORACLE数据库物理分布设计概述我们无论使用哪种数据库,无论怎样设计数据库,我想都会遵从一个原则:数据安全性和性能高效这两个主要方面,但是关于这两个方面的话题太多,在这里就不一一陈述,我只是从数据库物理分布设计方面和大家一起简单的探讨一下。
因为数据库良好的物理分布设计也是对数据安全性和性能高效影响比较大, 就象我们在建大楼之前一定要先打好地基一样。
現实中我们在应用各种不同数据库的时候,往往会忽略数据库的物理布局,只有在数据库性能遇到问题的时候才去考虑,但这是得不偿失的,这样一来不仅会导致与设计相关的问题出现,而且会影响性能的调整效果,所以我们在创建数据库之前先进行规划数据库的物理布局也是很必要的,这也符合人们常说的”磨刀不误砍柴工”的道理。
下面我就以Oracle为例从优化操作系统、磁盘布局优化和配置、数据库初始化参数的选择、设置和管理内存、设置和管理CPU、设置和管理表空间、设置和管理回滚段、设置和管理联机重做日志、设置和管理归档重做日志、设置和管理控制文件等几个方面作以陈述。
一. 优化操作系统为了获得最佳的服务器性能, 对操作系统的优化也是很必要的, 因为操作系统性能问题通常会涉及到进程管理、内存管理、调度等,所以用户需要确保有足够的I/O带宽、CPU的处理能力、交换空间来尽可能的降低系统时间。
如果应用程序在缓冲区出现过多的”忙”等待, 那么系统调用的进程将会增加, 虽然可以通过优化SQL语句等方法来降低调用的数目,但是这也是治病不治根的。
用户可以启动Oracle的初始化参数timed_statistics来增加系统调用的数目, 反之如果关闭此参数,那么系统调用的数目也会减少。
操作系统的缓存和Oracle自己的缓存管理是不相冲突的, 虽然它能消耗一定的资源, 但是它对性能还是有一定好处的, 因为一般所有数据库的I/O需要通过系统文件缓存来访问文件存储器。
Oracle的操作可能会用到许多的进程(有的系统叫线程), 所以用户应该确保所有Oracle的进程、后台进程、用户进程具有相同的优先级, 否则就会产生恶化的现象, 导致高优先级的进程等待低优先级的进程处理完毕释放出CPU资源后再处理, 更不能将Oracle的后台进程绑定到CPU中, 这样一来也会导致被绑定的进程被CPU资源饿死。
比较好的是有些操作系统提供有操作系统资源管理器(Operating System Resource Manager), 通过它可以对系统资源访问划分优先级来降低峰值负载模式的影响,来实现多种管理策略和方法,控制用户资源的访问,限制用户资源的可消耗量。
二.磁盘布局优化和配置在大多数产品数据库应用中,数据库文件一般都放在磁盘上,因此磁盘的良好使用和布局也是很重要的。
磁盘布局的目标是:磁盘性能是不能阻碍实现数据库性能,数据库磁盘必须专用于数据库文件,否则非数据库将会影响到该数据库,且这种影响是不可预测的; 系统硬件和镜像必须满足恢复和性能的要求,数据文件大小和I/O不能超过磁盘的大小和I/O,数据库一定是可以恢复的,必须使后台进程之间的竞争最小化。
在规划硬盘配置时也要注意:首先所用的磁盘容量,有时用多个容量小的磁盘比用一个大的磁盘效果更好,因为可以进行更高级的并行I/O操作; 其次磁盘的速度,如反应时间和寻道时间都将影响I/O的性能, 可以考虑使用合适的文件系统作为数据文件; 再者使用合适的RAID。
RAID(Redundant Arrays of Inexpensive Disks)廉价冗余阵列可以改善数据的可靠性,而I/O的性能又取决于RAID配置的方式:RAID1可以提供比较好的可靠性和较快的读取速度,但写的代价比较大,所以不适合频繁写的应用;RAID0+1在原RAID1的基础上读取的速度更快,所以这也是大家常会选择的方式;RAID5可以提供比较好的可靠性,有顺序的读操作比较适合这种方式,但性能会受到影响,对于写操作频繁的应用也不适合这种。
对于该选择那种方式不能一概而论,要根据具体的情况而定。
有些应用软件先天性受到磁盘的I/O限制, 所以在设计的时候应尽量使Oracle的性能不受I/O的限制, 所以在设计一个I/O系统时要考虑以下的数据库需要: 存储磁盘的最小字节; 可用性, 如24X7, 9X5; 性能如I/O的输出和响应时间。
决定Oracle文件的I/O统计信息可以来查询下列: 物理读数量(V$filestat.phyrds)、物理写数量 (V$filestat.phywrites)、平均时间, I/O=物理读+物理写。
而I/O的平均数量=(物理读+物理写)/共用秒数), 估计这个数据对于新系统是有用的, 可以查询出新应用程序的I/O需求与系统的I/O能力是否匹配以便及时调整。
三.创建数据库初始化参数的选择管理数据库的第一阶段就是初始化数据库的创建,尽管可以在数据库创建好以后再来调整性能,但是有些参数是不能修改的或很难修改,比如:Db_block_size、Db_name、Db_domain、Compatible、Nls_language、Nls_characterset、Nls_nchar_characterset。
Db_block_size参数决定Oracle数据库块的大小,一般可以选择的范围是2K、4K、8K、16K、32K,使用下一个较大值数据库块大小的效果一般可以集中查询中性能提高50%。
但是按常规来说对于一般服务器不提倡把这个值设的很大,小型机除外,因为这样一来数据库块中将会有更多的行,在数据库维护期间发生块级竞争的可能性比较大,避免这种竞争的办法是在表级和索引级增大Freelists、maxtrans和initrans的设置值,通常Freelists设置为大于4会带来更多的好处。
Db_name该参数指定一个数据库标识符,一般在Create Database中指定的名称,改参数是可选的(在Oracle9i实时应用集群时是必选的,多个实例有相同的参数值),但是建议在Create Database之前设置它,如果不指定则要出现在Startup或Alter Database mount命令中。
Db_domain该参数指定全局数据库名的扩展部分,在Oracle9i实时应用集群时是必选的,多个实例有相同的参数值。
Compatible该参数指定Oracle服务器维护版本的兼容性,保证与早期的版本向下兼容的时候允许用户使用新的版本,在Oracle9i实时应用集群时是必选的,多个实例有相同的参数值。
Nls_language和Nls_characterset及Nls_nchar_characterset三个参数是数据库的字符集参数,在数据库创建完成后一般也不能改变或很难改变,所以在创建数据库的时候要先设置好。
四.设置和管理内存Oracle使用共享内存来管理其内存和文件结构,Oracle常使用的内存结构如下:系统全局区(System Global Area,SGA),SGA随着不同的环境而不同,没有一种普通的最佳方案,我们在设置它直前要先考虑以下的几个方面:物理内存多大;操作系统是那种及占多大的内存,数据库系统是文件系统还是裸设备;数据库运行的模式。
SGA包括:Fixed size、Variable size、Database Buffers、Redo Buffers。
SGA占有物理内存的比例没有严格的规定,只能遵从一般的规则:SGA占据物理内存的40%–60%左右。
如果通过直观的公式化来表达则为:OS使用内存+SGA+并发进程数*(Sort_area_size+Hash_area_size+2M)90%,说明命中率合适。
否则,应增大共享池的大小。
重做日志缓冲区(Read log buffer),下面将有陈述,在此就不做说明。
SQL共享池(Shared pool size),该共享池包括包括执行计划及针对数据库执行SQL语句的语法分析用的,在第二次运行相同的SQL语句时可用SQL中的语法分析来加快执行速度。
如果它太小,语句会连续不断地再装入到库缓存区,从而影响性能。
可以通过Alter system命令来修改此参数,9I以后的版本可以动态地修改其大小。
大池(Large pool size),是一个可选的内存区。
如果选择可对数据库象备份/恢复这些大的操作提高性能。
如果不选择此参数,则系统会使用共享池。
JAVA池(Java pool size),由其名字而言可知,是为满足JAVA命令语法分析的需求。
在UNIX系统中如果区组的大小为4MB,则默认大小应该为24M,如果区组大小为 16MB,则默认大小为32M。
如果数据库没有使用JAVA,则保持在10M—20M足够。
多缓冲区池(Multiple buffer pools),可以使用多缓冲区池把大数据集与应用的剩余部分分开,以减少它们争夺缓存区内相同资源的可能性,创建时需要在初始化参数中设定其大小。
程序全局区(Program global area,PGA)是Oracle的一个私有的内存区,9i以后的版本中,如果Workarea_size_policy=auto,则所有的会话共用一块内存,该内存在参数Pga_aggregate_target设置,它的一个好的初始设置是:对于一个OLTP系统 Pga_aggregate_target=(totalL_mem*80%)*20%;对于一个DSS系统Pga_aggregate_target= (total_mem*80%)*50%。
这里的total_mem 是物理内存。
在调整Pga_aggregate_target参数时,下面的几个动态视图会有帮助的:V$sysstat和 V$sesstat;V$sql_workarea_active;V$pgastat;V$sql_workarea; V$process。
五.设置和管理CPU在设置和安装数据库的过程中,基本不用对CPU做什么配置的,系统会自动默认的,但是在管理过程中我们可以利用操作系统监控工具来监控CPU的状况。
例如在UNIX系统中,可以运行sar–u的工具来检查整个系统使用CPU的水平。
其统计信息包括:用户时间、系统时间、空闲时间、I/O等待时间。
在正常工作负载的情况下,如果空闲时间和I/O等待时间接近于0或少于5%,那就表示CPU的使用存在问题。
对于Windows系统可以通过性能监视器(Performance monitor)来检查CPU的使用状况可以提供以下信息:处理器时间、用户时间、特权时间、中断时间、DPC时间。
如果CPU的使用存在问题,则可以通过以下的方式来解决:优化系统和数据库;增加硬件的能力;对CPU资源分配进行划分优先级,Oracle数据库资源管理器(Database Resource Manager)负责在用户和应用程序之间分配和管理CPU资源。