Oracle流技术
Oracle流技术(精选4篇)
Oracle流技术 第1篇
Oracle数据库因其强大的处理数据的能力而在很多行业占有一席之地, 同时作为大型的数据库管理系统, 其在数据同步技术方面不断推陈出新。其中, Oracle推出的Streams技术可以很好地实现数据同步, Streams技术可以将分散在省内各市州的Oracle数据库中的数据同步到数据中心, 而将分散在省内各市州的Oracle数据库中的数据同步到数据中心是构建省级数据中心的基础及数据来源。
1 Oracle流复制技术概述
Oracle Streams流复制技术是数据库复制技术的实现形式之一。Streams利用高级技术——Log Miner挖掘日志文件, 形成有数据改变的逻辑数据, 然后把变化了的逻辑数据传输目标数据库, 最后将数据运用在数据库中, 这样两边的数据库的数据是可以变成一致的。
Oracle Streams数据同步分为以下几步:
(1) 捕获 (capture) 消息。Oracle Streams的capture进程捕获到message, message被捕获进程格式化为指定的格式并放到一个暂存区域, 该区域通常是一个称作“Streams队列”的内存中的数据结构[1]。
(2) 发布消息 (message) 。capture进程随后将消息发布到Streams队列中。Streams队列中读取这些消息的进程称为消费进程。该进程需要在Streams队列中注册它们接收消息的编号。消费进程可以是一个Streams进程 (如应用进程) 或外部应用程序进程。消费进程将消息应用到目标库, 实现数据的同步[2]。流复制技术原理如图1所示。
2 流复制在省级数据中心中的应用
以贵州省地税局省局数据中心为例, 将数据同步到省局是整个贵州省开展财税库横向联网、网上报税、网上开具发票、网上开具缴款凭证、发票真伪查询等工作的基础。在不影响9个市 (州、地) 及省直属局的生产系统的性能前提下, 将9个市 (州、地) 及省直属局的征管数据同步到省局数据中心是基础工作。
2.1 单向流复制的应用
单向复制相比较而言是Oracle Streams流技术中最常用的形式, 也是比较简单完成的。例如用2个Oracle数据来配置Oracle Streams单向流复制:一个数据库作为源数据库, 另一个作为目标数据库。对源数据库所作的修改将被复制到目标数据库中。在贵州省局数据中心中, 在用户应用程序对数据库A中的数据作了修改, 这些修改会传播并应用到数据库B, 以只读方式访问数据库B的应用程序可以得到该数据。
2.2 流复制的监控
由于同步是在很多个数据库中的数据进行同步的, 并且Oracle Streams复制拥有捕获 (capture) 、传输、应用 (apply) 3个过程, 数据库中全部的数据都存储在队列中, 队列很有可能形成堵塞的状况, 会在一些节点形成异常, 这些异常情况会影响Oracle Streams流复制在同步数据时的不稳定, 并最终导致失败。因此要对Oracle Streams流复制的数据同步的各个环节进行必要的监控。对流复制同步数据的整个过程的监控包括几个方面: (1) 监控capture进程, dba_capture视图中有一个的status字段, 通过这个字段可以查看到capture进程的状态, 如果status字段的内容是enabled, 那么就表示正常, 如果status字段的内容是disabled, 就代表capture进程是停止状态, 就需要把capture进程重启。如果是aborted, 表示capture进程不是正常完成, 是可以通过其对应的error编号和信息发现异常情况。 (2) 监控传送进程, capture队列的状态可以通过VBUFFERED_QUEUE视图查看, 假如长度一直增长, 代表传送进程没有运行。 (3) 监控apply进程, dba_apply视图中有一个status字段, 通过这个字段可以查看到apply进程的状态。其中apply进程包含参数disable_on_error, 假如将该参数设置成Y, 数据同步运行过程中出现异常, apply进程将不工作。
2.3 流复制的实施
以贵州省地税数据中心利用流复制数据同步技术实现数据同步为例, 将9个市 (州、地) 及省直属局的生产数据库中的super用户下400多张业务表的数据同步到省局数据中心数据库集群1中, 如图2所示。
数据同步的主要过程: (1) 在市局生产数据库和省局数据中心数据库中分别建立strmadmin用户, 并授予dba角色。 (2) 在市局生产数据库和省局数据中心数据库中建立DBLINK, 实现市局生产数据库和省局数据中心数据库在用户strmadmin下的相互访问。 (3) 在省局数据中心数据库中建立10个用户, 与9个市 (州、地) 及省直属局的10个super用户对应, 以便实现super用户下表抽取到目标库提供前提。 (4) 在市局生产数据库和省局数据中心数据库上配置Streams, 将9个市 (州、地) 及省直属局10个生产库同步到省局数据中心数据库。
3 结语
本文通过分析现有的系统存在的问题, 结合企事业单位业务发展的需求, 提出了利用Oracle流复制技术实现贵州省地税局省局数据中心的数据同步, 为建立贵州省地税局省局数据中心提供了数据基础。内容包括流复制的规划、单向流复制的技术实现和流复制后续维护。
参考文献
Oracle数据库灾备技术探讨 第2篇
技术的讨沦
技术一:Oraclc DataGuard
Oracle Data Guard提供了一种数据同步技术来实现Oracle的高可用性、增强的性能以及自动的故障转移方案。Oracle Data Guard为主数据库创建和维护多个备用数据库,主数据库的改变能够自动将信息从主数据库传送到备用数据库,并保证在此过程中没有信息的丢失。Oracle DataGuard实现方式(见图1)
在Oracle Data Guard的实现中,将一个运行在ARCHIVELOG模式下的数据库指定为服务于应用程序的主数据库,可以通过Oracle Net(Oracle网络)访问一个或多个备用数据庠来提供故障的转移功能。Data Guard自动将重做信息传送到应用此信息的备用数据库,因此,备用数据库在事物处理上可以保持一致,以实现对数据库的保护。
Data Guard有两种类型的备用数据库:物理备用和逻辑备用数据库。
物理备用数据库具有与主数据库相同的结构。逻辑备用数据库具有不同的内部结构(例如用于报表的额外索引)。通过将重做数据转换为依据备用数据库执行的SQL语句,可以同步逻辑备用数据库和主数据。物理和逻辑备份数据库服务于不同的目的。物理备用数据库是一种对主数据库的逐块的复制,因此它可以用作代替主数据库的数据库备份。在灾难恢复过程中,物理备份数据库看起来就像是它替代的主数据库。逻辑备用数据库支持额外的数据库结构,可以更为容易的支持特定的报表需求。因此许多方案将物理数据库用于灾难恢复,然后添加额外的逻辑备用数据库来支持特定的报表和业务需求。
无论物理备用数据库还是逻辑备用数据库,Data Guard通过提取归档日志文件中相关信息。对备用数据库进行数据操作的重做,以实现主、备数据库的同步。
对于物理备用数据库米讲,它接收到的redo record是按图2的方式:
redo apply维持一个standby database是通过精确的物理块来进行主数据库的备份。RFS(远程服务器进程)进程从主数槲库接收到redo record,并将其写入备用数据库的redo log(后面将被简称为SRL)。redo apply通过介质恢复服务将SRL中的redo record读入内存中,介质恢复协调器(MRPO)管理恢复session,并分析redo映射到不同的apply进程。不同的apply进程读取映射的数据块,并将其写入相应改变的数据块。redo apply会自动设置与cpu数日相等的apply进程。
对于逻辑备用数据库来讲,它接收到的redo record是按下图3的方式:
SQL apply使用的是逻辑standby进程进行协调应用相应的redo log中的改变。SQL apply进程读取SRL,井通过LSP(Logical StandbyProcess)将其转化为逻辑的记录改变,并建立SQL事务,并应用这些SQL到standby DB上。
可以看出Data Guard的两种类型备用数据库,虽然都是通过归档口志来实现主数据库和备用数据库的数据一致性,但是过程却不相同:一个是通过物理磁盘的方式,一个是通过重新生成SQL事物来完成数据同步。
技术二:Oracle GoldenGate
GoldenGate是一种基于日志的结构化数据复制技术,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。GoldenGate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据的实时复制(大概5秒以内的延迟),从而可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾等多个场景下应用。
Oracle GoldenGate技术捕捉源数据库日志文件中记录的对象操作信息,并传递到目的数据库,通过对有关数据库对象执行相关的操作,实现目的数据库与源数据库的同步。在获取数据库变化的机制上,Oracle GoldenGate与Data Guard有相似之处,都是通过捕捉日志文件中相关的信息实现的,但Data Guard是把归档日志文件传递到备用数据库,然后由目的数据库(备用数据库)完成重做操作。GoldenGate则是使用源数据库的捕捉进程,通过捕捉进程完成在线日志或归档日志的分析过滤,形成Trail文件。然后将Trail文件通过加密传送到目标地,然后解析成SQL语句导入目标数据库中。
GoldenGate技术中的目的数据库可以是一对一的关系.一对多的关系。也可以是多对一的关系,甚至是多对多关系。源队列与目的队列间信息的传递路径可以是多层的,信息可以经过中间数据库后再被转发至目的数据库。
由于GoldenGate是通过分析过滤日志来捕捉变化,GoldenGate可以实现跨平台的数据库复制以及非Oracle数据库的数据同步。
技术三:CDP方式
CDP(Continue DataProtection持续数据保护)是一项新兴的技术,也是目前最热门的数据保护技术之一。行业内通常的定义为:持续数据保护是一套方法,它可以捕获或跟踪数据的变化,并将其在生产数据之外独立存放,以确保数据可以恢复到过去的任意时间点。持续数据保护系统可以基于块、文件或应用实现,可以为恢复对象提供足够细的恢复粒度,实现几乎无限多的恢复时间点(见图5)。
目前市场上主流的CDP产品通过在操作系统核心层中植入文件过滤驱动程序,来实时捕获所有文件访问操作。对于需要CDP连续备份保护的文件,当CDP管理模块经由文件过滤驱动拦截到其改写操作时,则预先将文件数据变化部分连同当前的系统时间戳(System Time Stamp)一起自动备份到UnaCDP存储体。从
理论上说,任何一次的文件数据变化都会被自动记录,因而称之为持续数据保护。
由于Oracle数据库对读写一致性的特殊性要求,CDP厂商通常是通过调用Oracle9.2后提供的快照技术,能够在数据库正常运行的同时生成某一个时间点的一致性的镜像(注意一定是一致性镜像),Oracle数据库支持在这个一致性镜像基础上通过recoverdatabase,达到一致性的恢复。
技术比较
通过对这三种技术的介绍,不难看出,这三种技术都实现了数据库的灾难备份,但各有特点,存在以下几方面的不同。
基本原理
Oracle Data Guard是通过Oracle数据库归档日志来实现的,并且通过Oracle Net来传输日志;Oracle GoldenGate是通过对归档日志的捕捉并分析其的变化来实现的,有自己独享的传输方式;CDP技术是通过数据库镜像来来变现数据同步,数据库镜像的归档以及传送策略是通过CDP软件来完成。Oracle DataGuard无论是物理备州或者逻辑备用都最多只能使数据库处在同时读的状态,不能实现同时读写,只能实现主机和备机的单活状态;Oracle GoldenGate由于其实现方式,两端数据库都处在双活状态,备份端可以提供实时的数据查询及报表业务等,从而提高系统整体的业务处理能力,充分利用备份端的计算能力,提升系统整体业务处理性能。可以实现两端数据的同时写入。CDP由于是操作系统及实现数据同步,因此不能实现数据库的双活,两个数据库的状态只能实现单活的状态。
切换的时效性
Data Guard在主备切换时需要改变数据库的状态才能使备用数据库达到可读写状态,Oracle GoldenGate在情况发生时,可以立即实现服务器的切换。CDP需要改变整个系统的状态才能将备用系统达到可用。
对异构数具库的支持
Data Guard通过物理和逻辑的方式在备用机上还原数据库的日志,因此不支持异构数据库,也不支持异构的操作系统;GoldenGate通过分析主数据库的日志来完成tail文件,因此支持异构数据库,也支持异构的操作系统。CDP是通过操作系统层面完成数据同步的,因此不支持异构数据库,更不支持异构的操作系统。
系统资源的占用
Data Guard在完成数剧同步过程中需要占用数据库的一部份资源比如LGWR、ARCN和Net manger进程或服务等,对数据库有较大的影响,使数据库性能下降。GoldenGate和CDP是动态监控方式,对资源的消耗样相对较少。
支持Oracle的归档方式
Data
Guard和GoldenGate都是通过日志来实现数据库的数据同步,因此必须要求Oracle数剧库处在归档状态。而CDP因为其的实现方式,就没有这样的需求。
结语
Oracle分区技术 第3篇
Oracle分区技术在1997年的Oracle 8.0中首次引入, 它是Oracle数据库最重要、最成功的功能之一, 可以提高数以万计的应用程序的性能、可管理性和可用性。Oracle数据库11g引入了第8代分区, 继续提供突破性的新增强功能。新的分区技术使客户能够针对更多的业务案例进行建模, 为更多的业务需求提供最佳分区技术。
2.分区的概念
分区技术能够将表、索引或按索引组织的表进一步细分为小块。这些数据库对象的小块称为分区。每个分区都有自己的名称, 还可以选择自己的存储特性。这样带来一系列好处:
1.增强可用性:如果表的某个分区出现故障, 表在其他分区的数据仍然可用。
2. 维护方便:如果表的某个分区出现故障, 需要修复数据, 只修复该分区即可。
3. 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O, 改善整个系统性能。
4.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区, 提高检索速度。
从数据库管理员的角度来看, 分区后的对象具有多个小块, 这些小块既可以集中管理, 也可以单独管理。这就使管理员在管理分区后的对象时具有相当大的灵活性。
从应用程序的开发人员角度来看, 分区后的表与未分区的表完全相同, 在使用SQL DML语句访问分区后的表时, 无需任何修改。
3. 分区策略
Oracle提供了三种基本数据分配方法:范围 (range) 、列表 (list) 与散列 (hash) 。使用上述数据分配方法, 可以将表分成单一表或组合分区表。用户可以根据实际业务需要以最佳方式调整数据细分。
3.1 单一分区
通过指定其中一个数据分配方法来定义表, 并使用一个或多个列作为分区键。例如, 某个表使用数字列作为分区键, 并具有两个分区"less_than_five_hundred"和less_than_thousand", "less_than_thousand"分区包含符合以下条件的行:500<=分区键<1000。
3.2 组合分区
使用两个数据分配方法的组合来定义组合分区表。首先, 使用一个数据分配方法将表分区, 然后使用第二个数据分配方法为每个分区进一步划分子分区。给定分区的所有子分区一起代表数据的逻辑子集。例如, 首先对范围-散列组合分区表进行范围分区, 然后使用散列分区技术为每个单独的范围分区进一步划分子分区。
所提供的组合分区技术包括范围-散列、范围-列表、范围-范围、列表-范围、列表-列表和列表-散列。
4. 分区扩展
除了基本分区策略以外, Oracle 11g中还提供了分区扩展, 包括间隔分区、引用分区与基于虚拟列的分区。分区扩展显著增强分区表的可管理性, 扩展分区键定义的灵活性。
4.1 间隔分区
间隔分区扩展了范围分区的功能, 可以使用间隔定义来定义同类分区范围。当分区的数据首次插入时, Oracle将根据需要自动创建分区, 而非显式指定单独的范围。间隔分区可以大大提高分区表的可管理性。例如, 可以定义一个间隔分区表, 以便Oracle为日历年的每个月份创建一个新分区;随后, 当"Sep2007"的第一条记录插入数据库时, 就会为该月份自动创建一个分区。
可用于间隔分区表的技术包括间隔、间隔-列表、间隔-散列和间隔-范围。
4.2 引用分区
Oracle数据库11g允许利用现有的父子关系对表进行分区。子表可以继承父表的分区策略, 而无需在子表中存储父表的分区键列。在没有引用分区的情况下, 如果您想要利用相同的分区策略, 就必须将父表的所有分区键列复制到子表。此外, 引用分区还允许您根据逻辑数据模型自然地对表进行分区, 而无需存储分区键列, 从而减少了非规范化的手动开销并节省了空间。引用分区还可以透明地继承所有分区维护操作, 从而将表的逻辑形式从父表更改为子表。此外, 引用分区还可以为父表和子表的同类分区自动进行分区智能联接, 从而提高该操作的性能。
例如, 父表ORDERS根据ORDER_DATE列进行了范围分区;其子表ORDER ITEMS没有包含ORDER_DATE列, 但可以根据对ORDERS表的引用进行分区。如果ORDERS表按月份分区, 则"Jan-2007"订单的所有订单项将存储在ORDER ITEMS表的单个分区中, 该表与父表ORDERS具有相同类型的分区。如果将"Feb-2007"分区添加到ORDERS表, Oracle将透明地将同类分区添加到ORDER ITEMS表。
所有基本分区策略都可用于引用分区。
4.3 基于虚拟列的分区
在以前的Oracle版本中, 只有当分区键以物理方式存在于表中, 才可以对表进行分区。虚拟列是Oracle数据库11g中的一个新功能, 该功能移除了这个限制, 并允许使用表达式定义分区键, 以便使用表的一个或多个现有列, 并将表达式仅作为元数据存储。
分区已经得到增强, 以允许在虚拟列上定义分区策略, 从而实现更全面地满足业务需求。您通常会看到信息过载的列;例如, 一个10位的帐户ID可以在前三位中包含帐户分支信息。利用基于虚拟列的分区扩展, 可以通过虚拟 (派生) 列AC-COUNT_BRANCH来扩展包含ACCOUNT_ID列的ACCOUNTS表, ACCOUNT_BRANCH列派生自ACCOUNT_ID列 (该表的分区键) 的前三位。
基于虚拟列的分区支持所有基本分区策略。
5. 索引分区
索引可以与基础表的基本分区策略耦合, 也可以不与之耦合, 包括局部索引、全局分区索引与全局非分区索引。应该根据业务需求选择相应的索引分区策略, 从而实现最合适的分区, 以支持任何类型的应用程序。
5.1 局部索引
局部索引是针对分区表的索引, 该索引可以与基本分区表耦合, 并"继承"该表的分区策略。因此, 局部索引的每个分区仅对应于基础表的一个分区。耦合可实现优化的分区维护;例如, 在删除表分区之后, Oracle只需删除相应的索引分区。不需要进行代价高昂的索引维护。局部索引在数据仓库环境中是最常见的。
5.2 全部分区索引
全局分区索引是使用不同于其所在表的分区键或分区策略进行分区的索引, 其所在表可以是分区表, 也可以是非分区表。全局分区索引可以使用范围分区或散列分区进行分区, 还可以解除与基础表的耦合。例如, 某个表可以按月份进行范围分区, 因此具有12个分区, 而该表上的索引则可以使用不同的分区键进行范围分区, 从而具有不同的分区数量。全局分区索引在OLTP中比在数据仓库环境中更为常见。
5.3 全局非分区索引
全局非分区索引实质上与非分区表的索引一样。索引结构未分区并且未与基础表耦合。在数据仓库环境中, 全局非分区索引的最常见用法是实现主键约束。另一方面, OLTP环境在很大程度上依赖于全局非分区索引。
6. 利用分区进行信息生命周期管理
利用Oracle分区, 可以最好地解决当今面临的以尽可能低的成本存储大量数据的挑战。单个分区的独立性是解决"分层存档"策略联机部分的关键点。特别是在包含历史数据的表中, 数据的重要性 (以及访问模式) 在很大程度上依赖于数据的年龄;分区使您能够将单个分区 (或分区组合) 存储在不同的存储层, 从而提供不同的物理属性和价值点。例如, 一个包含2年数据的Orders表可以仅将最近一个季度的数据存储在昂贵的高端存储层上, 并将表的其余数据 (绝大多数的数据) 存放在廉价的低成本存储层上。通过Oracle分区, 可以大大降低存储成本, 并且不会影响最终用户访问, 从而最佳化存储信息的拥有成本。
7. 总结
Oracle分区可以大大增强几乎所有数据库应用程序的可管理性、性能和可用性。分区可用于前沿应用程序, 并且是确保这些应用程序成功的关键技术因素。对于较为普通的数据库应用程序, 以便简化这些应用程序的管理工作, 并降低管理成本。而且, 分区对应用程序是透明的, 因此可以轻松实现, 因为这不需要进行高成本且耗时的应用程序更改
参考文献
[1].Thomas Kyte, 《Oracle 9i&10g编程艺术》, 人民邮电出版社, 2007.7
Oracle性能调整技术研究 第4篇
1 系统设计开发阶段的调整
为了充分利用Oracle数据库的功能特性,在设计信息系统时,数据库设计人员需要根据业务情况(如访问量或客户端数量)和现有资源状况(如数据库服务器的配置)考虑系统结构和数据库的逻辑结构的设计:
1.1 调整应用程序结构设计
即应用程序采用的是传统的C/S两层体系结构,还是B/W/D三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。
1.2 恰当使用分区、索引及存档功能
如果某种业务的数据量增长非常快,可以考虑存放该业务的数据库表是否使用Oracle数据库的分区功能;对于经常访问的数据库表是否需要建立索引(注意:并不是在某个表上建立了索引后,该索引列就会起在查询中就会起作用,这要视where子句中索引列所应用的查询条件而定),索引可增加查询速度,索引不仅包含索引列的值,而且包含表中有该值的行的ROWID,而在数据库查询中,直接使用ROWID查询某行是效率最高的查询;对于经常访问但是当业务流程完成后不再变动的数据可采用放入历史档案的方法来实现应用系统中访问尽可能少的数据量,或者将频繁查询的数据查询一次后将结果存放在内存中,减少磁盘I/O次数
1.3 恰当编写访问数据的SQL和PL/SQL语句
调整Oracle服务器本身之前,必须确信应用程序已充分利用了SQL语言和Oracle特性,以提高应用程序的处理速度,如调整SQL语句提高执行效率、执行数组处理、PL/SQL编程(存储过程触发器函数包)、ORACLE优化器、行级锁管理器等。
存储过程:编写存储过程放在数据库服务器端,在客户端程序中调用,可以降低网络传输量,在服务器端执行存储过程时,与客户端传到服务器端的SQL语句不同,对SQL语句不需要编译再执行,可以提高数据请求的执行效率,调用服务器端的函数和包(存储过程和函数的组合)的提高执行效率的原理类似。
触发器:使用触发器可以降低网络I/O,需要消耗系统资源。若使用了过多的触发器,则可能发现性能受到负面影响,这时候需要修改或者禁用它。
良好的SQL语句可以被数据库重复使用而减少分析时间;恰当的使用索引可使访问的数据块大大减少从而减少响应时间。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率决定了Oracle数据库的性能。可以使用TKPROF、Oracle Trace工具查找有问题的语句和存储过程,或者查询V$SORT_USAGE视图,以查看临时段相关的会话和SQL语句。Oracle公司推荐使用Oracle语句优化器(Oracle Optimize,采用基于开销的优化,从10G开始摒弃了基于规则的优化)和行锁管理器(rowlevel manager)来调整优化SQL语句。
Oracle优化器(Optimizer):选择最有效的方法来执行SQL语句,是任何DML语句的过程中的一个重要步骤。执行一个SQL语句经常存在不同的方法,如变换顺序访问表或索引。Oracle用于执行语句的过程可以很大程度地影响语句执行的速度。Oracle优化器只应用于直接提交的查询,而不应用于从PL/SQL内提交的查询,因此对于编写PL/SQL程序时,查询优化需要自己根据经验来编写执行效率高的语句。Oracle用于执行某语句的步骤组合成为执行计划(Execution Plan),这些步骤称为访问路径。explain plan工具可显示查询优化器的访问路径的SQL语句,显示优化器对SELECT等语句选择的执行计划。另外,Oracle的Hint机制可以允许用户在SQL语句中指定访问路径,可以指定比优化器选择的更高效的执行计划。
1.4 调整硬盘I/O
这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。在磁盘比较富裕的情况下还应该遵循以下原则:将表和索引分开;创建用户表空间,与系统表空间(system)分开磁盘;创建表和索引时指定不同的表空间;创建回滚段专用的表空间,防止空间竞争影响事务的完成;创建临时表空间用于排序操作,尽可能的防止数据库碎片存在于多个表空间中。
1.5 确定数据块大小和存储参数
由于数据库的块大小在数据库创建以后就不能再修改(除非重建数据库),因此为了减少数据链接和行迁移,又提高磁盘空间的利用率,在设计数据库时要确定合适的数据块大小和存储参数。通常我们是根据样例数据确定数据块大小,而根据业务现状和未来发展趋势确定存储参数。
2 数据库运行阶段的调整
2.1 操作系统级的调整
实施操作系统级调整的主要目的是减少内存交换,减少分页,使SGA(System Globle Area)可留驻内存。
2.1.1 减少内存交换
内存交换(swapping)可能会造成很大的内存开销,应将它最小化。运行在Solaris Unix操作系统上的Oracle数据库,可利用vmstat或sar命令来检查交换,查看到系统级内存和硬盘I/O的使用情况,调整unix数据缓冲池的大小、每个进程所能使用的内存大小等参数。
vmstat命令:它报告Solaris上的进程、虚拟内存、磁盘、分页和CPU的活动情况。下面命令将显示系统每5秒钟做的事情的概要:
%vmstat 5
sar命令:用于监控交换、分页、磁盘和CPU活动。下面命令用于每10秒显示10次分页活动的概要:
%sar-p 10 10
若系统内存交换较多,且需要节省内存,可采用以下措施:1)避免运行不必要的系统daemon进程或应用程序进程;2)在不明显影响数据块命中率的前提下减少数据库缓冲区的数量,以释放一些内存;3)减少UNIX文件缓冲区的数量(特别是在使用裸设备时)。
2.1.2 控制分页
少量的内存分页不会太显著地影响系统的性能,因为应用程序不必全部放在内存中。但是分页过多将会造成系统性能下降。为了检测过多的分页,可在快速响应或空闲期间运行测量,并与响应迟缓时的测量进行比较。可通过以下办法来解决:
使用vmstat或sar-p监控分页;
安装更多的内存;
配置系统核心使用更少的内存;
保持SGA在单个共享内存段中。
2.1.3 使SGA(System Globle Area)驻留内存
SGA是对数据库数据进行快速访问的一个系统全局区,若SGA本身需要频繁地进行释放、分配,则不可能达到快速访问数据的目的,因此,要求SGA驻留内存。这时,我们可以重新配置UNIX核心,调整一些操作系统参数以达到增加共享内存的目的。若SGA的页被交换到磁盘,则它的数据访问速度就会急速下降。通过设置初始参数PRE_PAGE_SGA为YES,在启动实例时Oracle将整个SGA读入内存,然后为SGA的每页预建立操作系统页表条目。该设置可能增加实例启动时所需时间,但在启动后可能减少Oracle达到它全部性能能力所需的时间。
2.2 数据库级的调整
每一个Oracle实例都是由一组Oracle后台进程和SGA的一个内存区组成的。这组后台进程会自动的读写数据库的数据文件,因此,数据库性能可以被这些因素所影响:SGA各部分的分配是否合理,使用效率是否正常;I/O和锁竞争是否较多。
2.2.1 SGA的分配及使用效率
SGA是对数据库数据进行快速访问的一个系统全程区,若SGA本身需要频繁地进行释放、分配,则不能达到快速访问数据的目的,因此应把SGA放在主存中,不要放在虚拟内存中。SGA的分配主要是指调整组成SGA的内存结构的大小来提高系统性能,由于Oracle数据库服务器的内存结构需求与应用密切相关,所以该调整应在磁盘I/O调整之前进行,大量的V$动态性能试图可用于帮助调整系统,调整系统性能,它们允许用户访问SGA中的内存结构。
分配给每个实例的内存,即SGA的使用效率如何,会大大影响数据库系统的性能。SGA由下列部分组成:共享池、数据块缓冲区、重做日志缓冲区、大池组成。
1)共享池(Shared pool):共享池存放库缓存(存储共享SQL和PL/SQL区)和数据字典缓存(数据库对象信息)以及会话期间信息。由于这些信息是应用程序需要经常访问的,因此这些信息需要保持高的命中率。可以通过以下语句来确认共享池数据的命中率:
库缓存:
select gethitratio from v$librarycache应大于90%
select sum(reloads)/sum(pins)from v$librarycache应小于1%
数据字典缓存:
select sum(getmisses)/sum(gets)from v$rowcache应小于15%
对于一些应用系统非常频繁使用的SQL对象如存储过程、函数、包等,可以通过钉在内存中的方式来防止由于共享池太小被移出(移出共享池的算法为最近最少使用算法LRU):
exec dbms_shared_pool.keep(对象名)
2)数据块缓冲区(Db block buffer):数据块缓冲区存放用户所经常访问的数据文件的数据块内容以及用户修改的数据内容。数据库把数据文件里的内容读到内存中,下次需要时直接从内存中读取,从而减少了磁盘的I/O和响应时间。当然,一般只在比较小的数据表(如常用代码表)才缓存到内存中。
由于数据快缓冲区中不可能存放所有的数据,因此可使用LRU算法来确定移出哪些数据块,但又尽量保证有较高的数据命中率。
查看数据块命中率的SQL语句为:
select 1-(phy.value/(cur.value+con.value))from v$sysstat cur,v$sysstat con,v$sysstat phy
where cur.name='db block gets'and con.name='consistent gets'
and phy.name='physical gets'
如果这个命中率小于0.85,就要考虑为数据块缓冲区分配更多的内存了。
3)重做日志缓冲区(Log buffer):重做日志缓冲区存放从用户内存区复制来的每个DML或DDL语句的重做条目。如果这个缓冲区分配太小会导致没有足够的空间来放重做条目而等待。
2.2.2 I/O和资源竞争
由于有众多的进程要写数据文件,因此需要通过I/O调整来解决I/O瓶颈问题。如果在设计阶段有效地考虑了表空间的合理分配,就能有效地在一定程度上减少I/O竞争。在数据库运行时,由于数据的动态增长,原来分配给表或索引的空间已经用完,Oracle会自动分配空间给这些数据库对象。而这个动态分配会对系统性能有所影响,所以要求:
1)避免动态空间管理;2)表空间的本地化管理,以减少与数据字典表空间的磁盘竞争。
在系统设计和试运行阶段数据量相对较小,效率低下的SQL可能并不会影响系统响应时间,但当系统数据量增长到一定程度时,需要在系统运行时监控并找出是哪些SQL不能有效使用索引或缺少索引,并进行相应调整:建立索引;修改SQL写法。
另外,在Oracle中,需要采用一些机制来保证数据库对象在使用期间的稳定性和数据的一致性,如使用锁存器(latch)、锁(lock)等。因此争用和这些机制相关的资源会影响数据库的性能。为了减少这种资源竞争,可以通过调整数据库的相关初始化参数(如db_block_lru_latches、dml_locks)来减少资源的争用,优化数据库性能。
3 结束语
Oracle数据库的性能调整相当重要,但难度也较大。数据库管理员需要综合运用上面介绍的规律,在数据库建立时,就能根据应用的需要合理设计分配表空间以及存储参数、内存使用初始化参数,对以后的数据库性能有很大的益处。只有认真分析Oracle运行过程当中出现的各种性能问题,才能保证Oracle数据库高效可靠地运行。还需要指出的是:数据库的性能调整是一个系统工程,涉及的方面很多,不能仅仅根据一个时间点的情况就断定数据库运行性能的好与坏。如何有效地进行调整,数据库管理员需要经过反反复复的过程。这些都需要在大量的实践工作中不断地积累经验,从而更好地进行数据库的调优。
摘要:该文以ORACLE数据库性能优化的基本原则为出发点,主要研究在数据库设计阶段如何避免竞争和如何优化数据访问,在数据库运行阶段如何从操作系统和数据库实例级别上调整内存和I/O来达到数据库性能优化的各种技术。
关键词:ORACLE,SQL语句,I/O,SGA,缓冲区
参考文献
[1]Niemiec R J.Oracle Database10g性能调整与优化[M].薛莹,译.北京:清华大学出版社,2009.
[2]Loney K.Oracle Database10g完全参考手册[M].张立浩,尹志军,译.北京:清华大学出版社,2006.
[3]王海亮.精通Oracle10g SQL和PL/SQL.水利水电出版社,2007.
Oracle流技术
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


