Oracle诊断案例
- 格式:doc
- 大小:231.50 KB
- 文档页数:45
案例1ORACLEANALYZE命令的使用ORACLEANALYZE命令是Oracle数据库中一种用于调优和优化数据库性能的工具。
它能够收集数据库对象的统计信息、诊断性能问题并提供解决方案。
在本文中,我们将讨论ORACLEANALYZE命令的使用以及相关的案例。
首先,ORACLEANALYZE命令可以通过以下方式使用:```ANALYZE TABLE table_name [PARTITION partition_name][ESTIMATE [SAMPLE] statistics_sample_size [PERCENT] [FOR PARTITION (partition)][DELETESTATISTICS][FORCE];```ORACLEANALYZE命令的功能主要有两个方面:统计信息收集和性能问题诊断。
1. 统计信息收集:通过使用ORACLEANALYZE命令,可以收集数据库对象的统计信息,例如表、索引和分区等。
统计信息对于查询优化和执行计划的选择非常重要。
通过收集统计信息,我们可以使Oracle优化器更准确地评估查询的成本,并选择效率最高的执行计划。
2. 性能问题诊断:ORACLEANALYZE命令还可以诊断性能问题,并提供相应的解决方案。
它可以识别出表和索引的性能问题,例如表中的高聚簇因子(cluster factor)或者索引的低选择性(selectivity)。
此外,ORACLEANALYZE命令还可以检测到过时的统计信息,以及需要重新收集统计信息的对象。
下面以一个具体的案例来说明ORACLEANALYZE命令的使用。
假设我们有一个名为"orders"的表,用于存储订单信息。
这个表有一个名为"order_date"的列,我们希望通过ORACLEANALYZE命令收集该列的统计信息,并对性能进行诊断。
首先,我们可以使用以下命令来收集统计信息:```ANALYZE TABLE orders ESTIMATE STATISTICS SAMPLE 10 PERCENT FOR COLUMNS (order_date);```上述命令中,我们使用了"ESTIMATE STATISTICS"子句来指定要收集统计信息,"SAMPLE 10 PERCENT"表示我们希望对10%的数据样本进行统计。
问题描述:这是帮助一个公司的诊断案例.应用是个后台新闻发布系统.症状是,通过连接访问新闻页是极其缓慢通常需要十数秒才能返回.这种性能是用户不能忍受的.操作系统:sunos 5.8数据库版本:8.1.71.检查并跟踪数据库进程诊断时是晚上,无用户访问在前台点击相关页面,同时进行进程跟踪查询v$session视图,获取进程信息sql> select sid,serial#,username from v$session; sid serial# username---------- ---------- ------------------------------ 1 1 2 1 3 1 4 1 5 1 6 1 7 284 iflow 11 214 iflow 12 164 sys 16 1042 iflow10 rows selected.启用相关进程sql_tracesql> exec dbms_system.set_sql_trace_in_session(7,284,true)pl/sql procedure successfully completed.sql> exec dbms_system.set_sql_trace_in_session(11,214,true)pl/sql procedure successfully completed.sql> exec dbms_system.set_sql_trace_in_session(16,1042,true)pl/sql procedure successfully completed.sql> select sid,serial#,username from v$session; sid serial# username---------- ---------- ------------------------------ 1 1 2 1 3 1 4 1 5 1 6 1 7 284 iflow 11 214 iflow 12 164 sys 16 1042 iflow10 rows selected.等候一段时间,关闭sql_tracesql> exec dbms_system.set_sql_trace_in_session(7,284,false)pl/sql procedure successfully completed.sql> exec dbms_system.set_sql_trace_in_session(11,214,false)pl/sql procedure successfully completed.sql> exec dbms_system.set_sql_trace_in_session(16,1042,false)pl/sql procedure successfully completed.2.检查trace文件检查发现以下语句是可疑的********************************************************************************selectauditstatus,categoryid,auditlevel from categoryarticleassign a,category b where b.id=a.categoryid and articleid= 20030700400141 and auditstatus>0call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------parse 1 0.00 0.00 0 0 0 0execute 1 0.00 0.00 0 0 0 0fetch 1 0.81 0.81 0 3892 0 1------- ------ -------- ---------- ---------- ---------- ---------- ----------total 3 0.81 0.81 0 3892 0 1********************************************************************************这里显然是根据articleid进行新闻读取的.非常可疑的是query读取有3892这个内容引起了我的注意.如果遇见过类似的问题,大家在这里就应该知道是怎么回事情了.如果没有遇见过的朋友,能在这里思考一下再往下看.misses in library cache during parse: 1optimizer goal: chooseparsing user id: 41 rows row source operation------- --------------------------------------------------- 1 nested loops 2 index range scan (object id 25062) 1 table access by index rowid category 2 index unique scan (object id 25057)********************************************************************************selectauditstatus,categoryid from categoryarticleassign where articleid=20030700400138 and categoryid in (63, 138,139,140,141,142,143,144,168,213,292,341,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,383,460,461,462,463,621,622,626,629,631,634,636,643,802,837,838,849,850,851,852,853,854, 858,859,860,861,862,863,-1)call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------parse 1 0.00 0.00 0 0 0 0execute 1 0.00 0.00 0 0 0 0fetch 1 4.91 4.91 0 2835 7 1------- ------ -------- ---------- ---------- ---------- ---------- ----------total 3 4.91 4.91 0 2835 7 1misses in library cache during parse: 1optimizer goal: chooseparsing user id: 41 rows row source operation------- --------------------------------------------------- 1 table access full categoryarticleassign我们注意到,这里有一个全表扫描存在********************************************************************************3.登陆数据库,检查相应表结构sql> select index_name,table_name,column_name from user_ind_columns 2 where table_name=upper(categoryarticleassign);index_name table_name column_name ------------------------------ ------------------------------ -------------------- idx_articleid categoryarticleassign articleidind_articleid_categ categoryarticleassign articleid ind_articleid_categ categoryarticleassign categoryid idx_sortid categoryarticleassign sortid pk_categoryarticleassign categoryarticleassign articleid pk_categoryarticleassign categoryarticleassign categoryid pk_categoryarticleassign categoryarticleassign assigntype idx_cat_article categoryarticleassign auditstatus idx_cat_article categoryarticleassign articleid idx_cat_article categoryarticleassign categoryid idx_cat_article categoryarticleassign assigntype 11 rows selected.我们注意到,idx_articleid索引在以上查询中都没有被用到.检查表结构:sql> desc categoryarticleassign name null? type ----------------------------------------- -------- ---------------------------- categoryid not null number articleid not null varchar2(14) assigntype not null varchar2(1) auditstatus not null number sortid not null number unpass varchar2(255)问题发现:因为articleid是个字符型数据,查询中给入的articleid= 20030700400141 是个数字值oracle发生潜在的数据类型转换,从而导致了索引失效sql> select auditstatus,categoryid 2 from 3 categoryarticleassign where articleid=20030700400132;auditstatus categoryid ----------- ---------- 9 94 0 383 0 695 elapsed: 00:00:02.62execution plan---------------------------------------------------------- 0 select statement optimizer=choose (cost=110 card=2 bytes=38) 1 0 table access (full) of categoryarticleassign (cost=110 card=2 bytes=38)4.解决方法简单的在参数两侧各增加一个,既可解决这个问题.对于类似的查询,我们发现query模式读取降低为2几乎不必花费cpu时间了********************************************************************************select unpass from categoryarticleassign where articleid=20030320000682 and categoryid=113 call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------parse 1 0.00 0.00 0 0 0 0execute 1 0.00 0.00 0 0 0 0fetch 1 0.00 0.00 0 2 0 0------- ------ -------- ---------- ---------- ---------- ---------- ----------total 3 0.00 0.00 0 2 0 0misses in library cache during parse: 1optimizer goal: chooseparsing user id: 20 rows row source operation------- --------------------------------------------------- 0 table access by index rowid categoryarticleassign 1 index range scan (object id 3080)********************************************************************************至此,这个问题得到了完满的解决.--******************************************************************************************************问题说明:非常多时候在我们进行数据库操作时比如drop user,drop table等,经常会遇见这样的错误ora-00604: error occurred at recursive sql level 1 .这样的提示,非常多时候是没有丝毫用处的.本案例就这一类问题提供一个思路及方法供大家参考.1. drop user出现问题报出以下错误后退出ora-00604: error occurred at recursive sql level 1ora-00942: table or view does not exist .关于recursive sql 错误我们有必要做个简单说明.我们知道,当我们发出一条简单的命令以后oracle数据库要在后台解析这条命令,并转换为oracle数据库的一系列后台操作. 这些后台操作统称为递归sql比如create table这样一条简单的ddl命令oracle数据库在后台,实际上要把这个命令转换为对于obj$,tab$,col$等底层表的插入操作.oracle所作的工作可能比我们有时候想的要复杂的多.2.跟踪问题我们知道oracle提供sql_trace的功能能用于跟踪oracle数据库的后台递归操作.通过跟踪文件,我们能找到问题的所在以下是格式化(tkprof)后的输出:********************************************************************************the following statement encountered a error during parse:delete from sdo_geom_metadata_table where sdo_owner = wapcommerror encountered: ora-00942********************************************************************************oracle把错误信息首先呈现出来我们看到ora-00942错误是由于sdo_geom_metadata_table表/视图不存在所致问题由此能定位对于这一类的错误,定位问题以后解决的方法就要依据具体问题原因而定了。
oracle报错处理案例Oracle数据库在运行过程中可能会遇到各种错误,下面列举几个报错案例以及相应的解决思路:1、ORA-00701: 这个错误通常与内部错误或者核心对象有关。
根据2021年的信息,处理ORA-00701的一个解决方案是将数据库启动到升级模式(upgrade mode)进行修复,或者配置特定的事件(如event 38003),以便让Oracle跳过某些验证步骤。
在某些情况下,可能需要重建受影响的核心对象。
2、数据库无法打开并开始crash recovery:当数据库因异常关闭(如服务器断电)后,重启时可能会出现类似"alter database open... crash recovery"的情况。
此时,Oracle会自动尝试执行恢复过程来确保数据一致性。
DBA需要监控redo日志应用情况和归档日志状态,确保所有必需的redo已成功应用,以完成数据库的正常恢复开放。
3、ORA-00235:这个错误在官方文档中没有明确记录,但根据历史资料中的案例,它可能与备份或RMAN操作期间的同步恢复目录有关。
解决方案可能涉及检查并协调任何冲突的RMAN任务、确保恢复目录的一致性,或者重新同步恢复目录信息。
4、服务器断电导致的数据恢复:在服务器意外断电后,Oracle数据库可能无法正常启动。
在这种情况下,数据恢复工作包括检查物理文件的完整性、评估控制文件、联机重做日志文件和数据文件的状态,并使用RMAN或其他工具进行介质恢复或不完全恢复操作。
如果数据文件损坏严重,可能还需要从最近的有效备份和归档日志中恢复。
在实际处理Oracle数据库错误时,关键在于理解错误的具体含义、分析错误产生的上下文环境,并按照Oracle官方提供的最佳实践和建议步骤进行操作。
同时,维护详细的日志记录和定期备份也是避免数据丢失和快速恢复服务的关键措施。
oracle19c 查询实例-回复如何在Oracle 19c中进行查询实例。
在本文中,我将向您介绍Oracle 19c数据库中的查询实例。
Oracle 19c 是一款功能强大的关系型数据库管理系统,提供了多种查询和数据操作功能,以帮助用户有效地管理和检索数据。
步骤1:连接到Oracle 19c数据库首先,我们需要通过使用适当的凭据连接到Oracle 19c数据库。
我们可以使用Oracle SQL开发者或类似的工具来连接数据库。
在获取凭据后,我们可以使用以下命令连接到数据库:sqlplus username/password@hostname:port/service_name其中,username是数据库用户的名称,password是用户的密码,hostname是数据库服务器的主机名,port是数据库监听的端口号,而service_name是数据库的服务名。
步骤2:选择要查询的表一旦成功连接到数据库,我们需要选择要查询的表。
表是Oracle数据库中存储数据的组织形式。
我们可以使用以下命令选择要查询的表:SELECT * FROM table_name;其中,table_name是数据库中的表名称。
这将返回表中的所有行和列。
步骤3:编写基本查询语句一旦选择了要查询的表,我们可以编写基本的查询语句来检索所需的数据。
查询语句使用SQL(结构化查询语言)编写,以在数据库中执行特定的操作。
以下是一个示例查询语句:SELECT column1, column2 FROM table_name WHERE condition;其中,column1和column2是要从表中检索的列的名称,table_name 是要查询的表名称,而condition是一个可选的条件,用于过滤查询结果。
步骤4:使用其他查询操作符和函数在Oracle 19c中,我们可以使用多种查询操作符和函数来执行复杂的数据检索操作。
以下是一些常用的查询操作符和函数:- 比较操作符:比较操作符(例如=、>、<等)可用于比较列的值。
ORACLE数据库常见问题诊断方法(分布式事务篇)对于数据库服务端到服务端的访问(如DBLINK、复制、快照等),由于网络等原因可能会产生一个节点的事务无法恢复,与之相关的另一个节点的数据库事务挂起,因而产生分布式数据库事务问题。
一、诊断分布式事务1)检查alert<sid>.log文件,发现相应的错误确保网络正常,并检查DBLINK是”valid”和可操作的2)SELECT * FROM V$DBLINK 或GV$DBLINGK3)查找悬挂的事务( DBA_2PC_PENDING)SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID, STATE, MIXED, HOST, COMMIT#FROM DBA_2PC_PENDINGLOCAL_TRAN_ID 是本机的事务号(报告错误的机器),如果 LOCAL_TRAN_ID = GLOBAL_TRAN_ID, 即分布式事务来源于本机,也可以从本机的alert<sid>.log中得到 LOCAL_TRAN_ID 。
二、检查其它节点的事务(DBA_2PC_NEIGHBORS)1)执行下列命令:SELECT LOCAL_TRAN_ID, IN_OUT, DATABASE, INTERFACEFROM DBA_2PC_NEIGHBORS2)在init<sid>.ora中检查参数COMMIT_POINT_STRENGTH该参数应有较大值(最好最大值)三、通过DBA_2PC_PENDING字典表检查事务的状态1)如果状态是 commit,则本地数据库提交成功,即不必在本数据库实施COMMIT FORCE或ROLLBACK FORCE。
如果状态是 not commited(prepared),则必需在本数据库实施COMMIT FORCE或ROLLBACK FORCE,SCN号可在DBA_2PC_PENDING字典表中找到。
常见错误:ORA—00001:违反唯一约束条件(主键错误)ORA—00028:无法连接数据库进程ORA—00900:无效sql语句ORA-00904:字段名写错或是建表时最后一个字段有逗号ORA—00907:缺少右括号ORA—00911:无效字符ORA-00917:缺少逗号ORA-00918:未明确定义列ORA-00922:丢失或无效的选项(表名等可能有空格)ORA—00923:未找到FROM关键字ORA—00926:缺少valueORA-00933: SQL命令未正确结束ORA—00936:缺少表达式ORA-00937:不是单组分组函数ORA—00942:表或视图不存在ORA-00947:没有足够的值(一般是插入语句出现的错,插入值的数量与字段不符)ORA-00979:不是group by的表达式ORA-01009:缺少法定参数(eg:sql做参数时,且sql语句为空时,报错)ORA—01098:数据库无法关闭及启动ORA-01400:无法将null值插入ORA—01401:插入的值对于列过大ORA-01476:sql中存在除数为零ORA-01579:恢复过程中出现写错误ORA—01580: 创建控制备份文件时出错ORA-01581: 尝试使用已分配的回退段()新区()ORA—01582: 无法打开要备份的控制文件ORA-01583:无法获得要备份的控制文件的块大小ORA—01584:无法获得要备份的控制文件的文件大小ORA-01585:标识备份文件时出错ORA-01586: 无法打开要备份的目标文件ORA—01587:复制控制文件的备份文件时出错ORA—01588: 要打开数据库则必须使用RESETLOGS 选项ORA—01589:要打开数据库则必须使用RESETLOGS 或NORESETLOGS 选项ORA-01590:段可用列表数() 超出最大数ORA—01591: 锁定已被有问题的分配事务处理挂起ORA—01592:将第7 版回退段()转换为Oracle 8 版格式时出错ORA-01593:回退段最佳大小(blks) 小于计算的初始大小(blks)ORA-01594: 尝试放回已释放的回退段() 区()ORA—01595:释放区() 回退段()时出错ORA-01596:无法在参数中指定系统ORA-01597: 无法改变联机或脱机系统回退段ORA-01598: 回退段'’未联机ORA—01599:无法获得回退段(), 高速缓存空间已满ORA—01600:至多只有一个”"在子句"”()中ORA-01601: 子句""()中的存储桶大小非法ORA-01603:子句””()中的分组大小非法ORA-01604:子句”"()中的编号范围非法ORA-01605:子句"”()中缺少编号ORA-01606:gc_files_to_locks 不同于另一已安装例程的参数ORA—01608: 无法将回退段’'联机,其状态为()ORA—01609:日志是线程的当前日志- 无法删除成员ORA-01610: 使用BACKUP CONTROLFILE 选项的恢复必须已完成ORA—01611: 线程编号无效—必须介于1 和之间ORA-01612:线程已经启用ORA-01613: 线程只有日志- 要求至少启用2 个日志ORA-01614: 线程正忙- 无法启用ORA—01615:线程已安装—无法禁用ORA—01616: 线程已打开- 无法禁用ORA-01617: 无法安装: 不是有效的线程编号ORA-01618:线程未启用- 无法安装ORA-01619:线程已由另一例程安装ORA—01620: 没有可用于安装的公用线程ORA-01621: 数据库打开时无法重命名当前日志的成员ORA-01622:必须指定线程编号- 没有特定默认值ORA-01623:日志是线程的当前日志- 无法删除ORA—01624: 线程的紧急恢复需要日志ORA—01625:回退段’'不属于此例程ORA-01626: 回退段号'’无法处理更多事务处理ORA—01627:回退段号'’未联机ORA-01628:已达到max #extents ()(回退段)ORA—01629:已达到max # extents (),此时正在保存表空间的撤消ORA—01630: 表空间中的temp 段达到max # extents()ORA-01631:表。
flinkcdc oracle 测试案例Flink CDC(Change Data Capture)是一种用于实时数据同步和流式数据处理的开源技术,它可以捕获数据库中的变化,并将这些变化作为数据流进行处理。
本文将以Flink CDC与Oracle数据库的测试案例为题,介绍一些常见的测试场景和案例。
1. 测试CDC连接Oracle数据库在这个测试案例中,我们将测试Flink CDC与Oracle数据库的连接是否正常。
通过配置正确的数据库连接信息和表名,运行CDC作业,并观察是否可以成功捕获变化数据并进行处理。
2. 测试CDC捕获新增数据在这个测试案例中,我们将在Oracle数据库中插入一些新的数据,并观察Flink CDC是否可以及时捕获到这些新增数据,并将其作为数据流进行处理。
3. 测试CDC捕获更新数据在这个测试案例中,我们将在Oracle数据库中更新一些已有的数据,并观察Flink CDC是否可以及时捕获到这些更新数据,并将其作为数据流进行处理。
4. 测试CDC捕获删除数据在这个测试案例中,我们将在Oracle数据库中删除一些已有的数据,并观察Flink CDC是否可以及时捕获到这些删除数据的变化,并将其作为数据流进行处理。
5. 测试CDC处理数据在这个测试案例中,我们将使用Flink CDC捕获到的变化数据,进行一些数据处理操作,比如数据清洗、数据过滤、数据转换等,并观察处理结果是否符合预期。
6. 测试CDC数据写入外部系统在这个测试案例中,我们将使用Flink CDC捕获到的变化数据,将其写入到外部系统,比如Kafka、HDFS等,并观察数据写入是否成功,并且数据是否与源数据保持一致。
7. 测试CDC的容错和恢复能力在这个测试案例中,我们将模拟Flink CDC的异常情况,比如网络中断、数据库故障等,观察CDC作业的容错和恢复能力,以及是否可以正确处理数据流的连续变化。
8. 测试CDC的性能和吞吐量在这个测试案例中,我们将对Flink CDC进行性能测试,包括数据捕获的延迟、数据处理的吞吐量等指标,以评估CDC作业的性能和效率。
oracle数据库应用案例
以下是一些常见的Oracle数据库应用案例:
1. 企业级应用:许多大型企业使用Oracle数据库来支持企业资源规划(ERP)系统、客户关系管理(CRM)系统和供应链管理系统等重要业务应用。
2. 金融领域:银行和金融机构经常使用Oracle数据库来管理大量的交易数据、客户账户信息和风险分析等。
3. 电信行业:电信运营商使用Oracle数据库来管理用户资料、通信记录和计费信息等。
4. 零售业:零售业公司使用Oracle数据库来管理存货、销售数据、订单处理和供应链信息等。
5. 健康保健:医院和保健机构使用Oracle数据库来管理患者记录、医疗图像和诊断数据等。
6. 教育部门:大学和学校使用Oracle数据库来管理学生信息、教职工信息和学术研究数据等。
7. 公共部门:政府和政府机构使用Oracle数据库来管理公
民信息、税务数据和人口统计数据等。
Oracle 性能调整案例Oracle诊断案例-I/O子系统 (1)系统软硬件现状 (1)Vmstat数据 (2)Statpack数据 (2)业务分析 (3)数据库性能分析 (3)修改建议 (4)调整后性能的改善 (5)Oracle诊断案例-Spfile案例 (5)Oracle诊断案例-SGA与Swap (17)SGA与Swap之二 (32)Oracle诊断案例-Sql_trace之一 (38)Oracle诊断案例-I/O子系统系统软硬件现状Oracle数据库运行环境Unix主机: 2 * IBM M85CPU :4个系统内存:6GB磁盘阵列子系统:IBM SSA RAID-5Oracle版本:8.1.7.1.0 32-bitOS 版本: AIX 4.3.3-10业务系统:×××××业务管理系统Vmstat数据kthr memory page faults cpu----- ----------- ------------------------ ------------ -----------r b avm fre re pi po fr sr cy in sy cs us sy id wa2 4 897649 6717 0 7 23 437 957 0 1011 1184 164 13 7 60 1912 9 893274 9676 0 30 0 0 0 0 1787 70898 20625 41 23 2 346 15 881613 18578 0 147 0 0 0 0 2035 62910 14427 37 31 1 311 10 880631 17850 0 13 0 0 0 0 1940 38678 10031 27 17 4 5116 10 886848 9508 0 36 0 0 0 0 2226 48349 7778 26 16 4 542 14 892766 541 0 20 0 0 0 0 2331 88696 14576 43 18 1 3815 19 895124 34 0 15 382 2007 4143 0 1878 59445 10411 26 16 2 561 12 883561 12427 0 28 270 1288 2735 0 1910 45451 6520 20 14 1 6522 11 882698 11794 0 29 0 0 0 0 1856 51539 5399 21 25 4 509 19 879662 12982 0 17 0 0 0 0 1914 39960 7045 20 16 3 611 12 878367 12601 0 33 0 0 0 0 2016 30913 5410 18 104 682 14 881742 7084 0 51 0 0 0 0 2256 35721 7131 22 7 5 652 11 888809 0 0 25 149 975 1981 0 1893 46405 6496 22 14 6 581 11 877357 9894 0 27 212 631 1314 0 1636 28126 4256 16 26 2 553 9 880033 5315 0 25 0 0 0 0 1714 44692 5093 20 24 3 537 11 879638 3862 0 48 0 0 0 0 2044 62118 8235 27 28 3 421 9 871947 9857 0 28 0 0 0 0 1954 49887 11556 30 22 5 448 12 872208 7408 0 40 0 0 0 0 2132 38014 6991 22 14 4 591 10 879075 3815 0 14 396 2269 4650 0 1775 38587 5830 16 14 6 633 14 884434 4 0 24 235 1632 3575 0 1963 51640 7198 22 15 4 60 。
Statpack数据Top 5 Wait Events~~~~~~~~~~~~~~~~~ Wait % Total Event Waits Time (cs) Wt Time -------------------------------------------- ------------ ------------ ------- log file sync 95,588 1,675,398 58.21 db file sequential read 402,294 917,696 31.88 db file parallel write 7,780 114,321 3.97db file scattered read 8,560 70,945 2.46buffer busy waits 12,303 40,058 1.39-------------------------------------------------------------(详细信息参见《2.16 如何理解STATPACK的报告》.doc)业务分析1. 主要业务发生在每天8点到22点之间2. 每天的事务量是60G左右,要求较高的数据的完整性3. 每天有较多的DML(主要是INSERT 和UPDATE操作,几乎没有DELETE操作)和大量的查询操作。
DML操作主要是用来更新在B/S结构和C/S结构中的业务信息,select操作主要是提供大量的检索功能,业务的操作模式是每个DML之后就会commit;4. 目前的备份方式是冷备,目前的归档方式是归档到一个本地磁盘和RAID上各一份5. 目前的Web 服务,数据库服务,C/S结构的服务器都跑在RAID5上数据库性能分析问题1:由于系统存在大量的transaction, 造成了redo log对磁盘的巨大io压力,造成了系统大量的IO 等待。
所以,当前数据库的主要性能瓶颈是磁盘子系统的性能问题,系统的IOWait 严重偏高,尤其是log file sync事件,20分钟内发生95,588次,平均每秒发生80个左右,占系统所有等待时间的将近60%。
由于log file sync的产生是由于应用程序过度的Commit造成的,所以最好的方法是修改应用程序,采用Batch Commit技术,来提高系统的性能。
如果由于第三方软件的原因,导致应用程序无法进行修改,我们也可以提出一个变通的方案,即优化用户磁盘子系统,提高用户磁盘的性能,以达到减少系统的IO资源等待,提高系统性能的目标。
问题2:还有一个系统的主要问题所在是Oracle的配置问题。
当前系统有6GB的物理内存,但是Oracle SGA只是开了600M。
这是对资源的巨大浪费。
如果这个服务器只是运行Oracle Database,那么Oracle SGA可以调节到3.5-4GB。
(当前系统使用的是32Bit Oracle,建议升级到64Bit Oracle)。
问题3:1)另外的几个小问题是系统地rollback segment 数目偏少。
2)系统地log_buffer偏大。
3)系统把redo log file作了两个member, 是高可用性的一个比较好的策略,不过当前的配置是在同一个磁盘上面,似乎意义不大。
Log file switch 过于频繁, logfile 大小偏小。
修改建议1)如果系统没有配置hacmp作为HA 可用性解决方案,建议把redolog 从hdisk2,hdisk3所在的磁盘移动到hdisk0,hdisk1上面(采用raw device)。
这样,可以大大降低系统地IO 压力,同时保证redo log的安全性。
2)当前磁盘子系统,主要IO 集中在hdisk2, hdisk3这两个逻辑磁盘上面。
为了降低系统地IO 压力,建议把一部分datafile 移到hdisk4磁盘上。
3)如果有可能调节引用程序,建议使用batch commit技术,把下面的语句修改一下:同时注意,Buffer Gets Executions Gets per Exec % Total Hash Value--------------- ------------ -------------- ------- ------------2,440,675 1,218,841 2.0 18.1 1115576732update nlc50.z07 set z07_rec_key = :r1:i1,z07_sequence = :r2:i2,z07_level = :r3:i3,z07_source = :r4:i4,z07_history = :r5:i5 where z07_rec_key = :v1同时注意:Executions Rows Processed Rows per Exec Hash Value------------ ---------------- ---------------- ------------1,218,841 355 0.0 1115576732update nlc50.z07 set z07_rec_key = :r1:i1,z07_sequence = :r2:i2,z07_level = :r3:i3,z07_source = :r4:i4,z07_history = :r5:i5 where z07_rec_key = :v1程序的写法有问题。
执行那么多次,实际上被处理的行的数据很少,就是实际上很多都是无用功。
却找成了系统的那么多的commit,从而赵成了IO 子系统的很大的压力。
4)调节下面的SQL的索引策略:Physical Reads Executions Reads per Exec % Total Hash Value--------------- ------------ -------------- ------- ------------83,852 5 16,770.4 19.9 3357555463select max(z30_rec_key_2) from nlc50.z30 where z30_rec_key_2 like :v1SQL ordered by Executions for DB: ALEPH0 Instance: aleph0 Snaps: 1 -2-> End Executions Threshold: 100497,348 17,371 0.0 695152841select z98_rec_key,z98_type,z98_direction,z98_compress_type,z98_total_map_length,z98_map_length,z98_data from nlc09.z98 where z98_rec_key >= :v1340,815 93,393 0.3 3969206952select z98_rec_key,z98_type,z98_direction,z98_compress_type,z98_total_map_length,z98_map_length,z98_data from nlc01.z98 where z98_rec_key >= :v1141,423 137,021 1.0 3698977705select * from nlc01.z101 where z101_rec_key >= :v1调整后性能的改善系统IO Wait%降低到10%左右,系统CPU空闲可以从现在的小于8%增加到30%以上。