深入浅出等待事件和性能诊断05
明天就是公司年终晚会,这大半个月来天天练舞也够累的,突然发现自己在ITPUB有大半个月没有发帖子也没去关注了,快点调整自己吧也希望明天的年会表演都还顺利,不虚度每一个年华吧,毕竟练舞还是付出了很多时间的,特别是对于自己这种手脚不是很灵活的同志,比学oracle还难。关于autotrace开启查询sql执行计划时,其实原session用于sql查询输出,另外内嵌了一个session来统计信息Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith the Partitioning, OLAP and Data Mining optionsSQL> set autotrace off;S
深入浅出等待事件和性能诊断04
下面再摘要几个关于log的等待事件Log file switch日志文件切换,数据库进行日志切换时,LGWR需要关闭当前日志组,切换至下一日志组,切换中数据库的所有dml操作都会停止直至切换完成。Log file switch又包含两个子事件:1) log file switch(checkpoint incomplete)检查点尚未完成,如果此时数据库没有完成写出这个redo log所记录的所有dirty block,该等待事件出现。Dbwr写出速度太慢或I /O存在问题,可以考虑增加db_writer_processes参数,不过该参数一般不需要增加,db_writer_process一般设置和cpu数量相等,也可以增加日志组或日
深入浅出等待事件和性能诊断记载03
近段时间在忙于年会舞蹈和过年回家的事情,主要是火车票难买,公司的年假又批得迟,搞得俺这些漂泊在外的人纠结啊,学习习惯也有点懒散了,收心!先摘要记录几个等待事件Db file sequential read(数据文件顺序读取)是个非常常见的I/O相关的等待事件,通常显示于单个数据块相关读取操作,读取索引块或者通过索引块读取数据块时,可能会记录这个等待事件。SQL> col name for a20SQL> col parameter1 for a20SQL> col parameter2 for a20SQL> col parameter3 for a20SQL> col wait_class for a20SQL> select name,parame
深入浅出等待事件和性能诊断02
在oracle 10g中,新增v$session_wait_history视图记录的是数据库的历史状态及session的历史等待信息等数据,也就是活动session的最近十次的等待事件,同期oracle又推出了ASH新特性,活动session历史信息记录active session history ASH。ASH以v$session为基础,每秒钟采样一次,采样工作由oracle 10g新引入的后台进程mmnl完成,可以查看v$process视图或者通过警告日志来查看具体的mmnl进程信息。Ash功能默认是开启的,由隐含参数_ash_enable控制SQL> col ksppinm for a20SQL> col ksppdesc for a20SQL> col ksppstvl for a20SQL&
深入浅出等待事件和性能诊断01
最近都在培训舞蹈,oracle和os上很久没有去看了,年底也快忙完了电还是要冲的,还是回归oracle世界吧!终于算是初步把eygle的深入浅出全部读完了,就深入浅出的最后两章等待事件和sql性能诊断方面记载一二。数据库性能瓶颈方面,可能第一反应便是oracle的等待事件,而v$event_name视图记录了当前数据库支持的等待事件及其基本信息,parameter1,parameter2,parameter3对于不同的等待事件的意思各不相同。Oracle等待事件分为:既空闲idle等待事件和非空闲non-idle等待事件。空闲等待事件指oracle正等待某种工作,在诊断和优化数据库的时候,
2011年初识oracle
2011年初识oracle关于这篇blog构思了很久,但是都未曾动笔,不和往常的技术blog文档和不似之前的心情随笔,其实关于2011这一年自身有了太多变化,要说这一年最值的就是初识甲骨文,也让自己对以后的路子有了一个想法。 回想一年半前毕业自己虽然一心想如何证明自己,但是其实心里很没底,真正能拿出台面的东西真没有,自己是个傲气但是又不付出实际行动的人,说实话这真是一个很能荒废人的性格特征,要想取得自己所需要的东西是沉下去很长一段时间的。 在2011年初过完春节回到工作岗位,当时自己对于oracle真没多
闪回和drop原 undo tbs的一点分析
Flashback闪回,表级闪回是由undo回滚段作支撑的(表的结构不能改变,不能alter,truncate等ddl操作),而10g的闪回drop的表是由于表空间的虚拟回收站来闪回的,被删除的表只是被重命名而已,在空间足够情况下并没有彻底清除。而10g的数据库级的闪回则是又闪回日志来支撑的!表级闪回跟undo表空间SQL> select * from xiaoyu.test03; ID---------- 44 11 22 33 44 11 22 33 8 rows selectedSQL> select dbms_flashback.get_system_change_number from dual; GET_SY
深入浅出undo记载03
这里自己无意中做了个测试:之前修改undo表空间为手工管理Sql>alter system set undo_management=manual scope=spfileSql>startup force。。。。。SQL> insert into xiaoyu.test03 select * from xiaoyu.test03; insert into xiaoyu.test03 select * from xiaoyu.test03 ORA-01552: 非系统表空间 'USERS' 不能使用系统回退段SQL> select * from v$rollname; USN NAME---------- ------------------------------ 0 SYSTEM……SQL> show parameter undo; NAME TYPE V
深入浅出undo记载02
继续理解eygle深入浅出的undo回滚于撤销的重要细节知识点,先说一下以前blog中就提到的关于块清除的知识点。(块清除是个及其复杂的过程,这里因为个人理解只能整理出如下要点) Ora-01555快照过久,oracle经典错误,主要由以下三种情况构成1 查询scn小于block的scn需要undo构造cr块实现一致性读,回滚段被覆盖 2 延迟块清除,查询触发延迟块清除需要从回滚段获得事务提交的scn,如果事务前镜像已经被覆盖,并且查询scn小于回滚段中最小提交的scn,那么oracle将无法判断查询scn和事务提交scn大小,出现ora-01555(这里还说一下极端的情况,
oracle 10g跨越resetlogs恢复-incarnation
Oracle 10g后可以跨越resetlogs恢复数据库,incarnation是跨越resetlogs恢复数据库的重要特性。下面用下列测试来说明下:SQL> create table incarnation_tab01(id number); Table createdSQL> declare 2 begin 3 for i in 1..10 loop 4 insert into incarnation_tab01 select dbms_flashback.get_system_change_number from dual; 5 commit; 6 end loop; 7 end; 8 /PL/SQL procedure successfully completed SQL> select * from incarnation_tab01; ID---------- 1881030 1881031 1881032 1881033
深入浅出undo记载01
初看eygle的深入浅出的关于回滚段undo,其实刚开始自认为对undo的理解还算清晰,undo的记录的信息,dml时undo如何和buffer cache联系(回滚段也是属于buffer cache),从AUM的管理,flashback利用undo来闪回,undo表空间的回滚段的自动扩展于回收,切换undo表空间,快速块清除,延迟块清除,回滚段过旧等,看了回滚这一章发现自己还是有颇多的理解误区和盲区。回滚段具体记录的是什么:在看冯春培的回滚段探究中提到了回滚段具体记载的是什么,同样eygle深入浅出中再次提到了回滚段的具体记录的是什么,自己也有误区认为回滚段会记录整个数
总是归档错误-重置归档目录
这段时间测试redo的产生和热备期间,居然出现了一系列的重做日志块头错误导致无法归档。Sql>alter database clear unarchived logfile group 1;先后执行了清空日志组status为inactive的日志,但是再次查看v$archive_dest的归档目的都出现error,还是现实重做日志块头错误,然后又再次强制清空了几次日志还是出现了所谓的无法归档,重做日志块头错误。实在想不通为什么会出现这种情况,按理说日志组清空不会还报日志块头错误啊。SQL> select dest_id,dest_name,status,error from v$archive_dest where status<>'INACTIVE';
oracle 9.2.0.8.0的drop user而引起的ora-0060[qmxiUnpPacked2], [121], [], [], [], [], [], []
今天和同事在生产库中需要删除一个测试用户,居然碰见一个bug。Sql>drop user test cascadeOra-01001 无效游标Ora-0060内部错误代码,参数: [qmxiUnpPacked2], [121], [], [], [], [], [], [].SQL> select * from v$version; BANNER----------------------------------------------------------------Oracle9i Enterprise Edition Release 9.2.0.8.0 - ProductionPL/SQL Release 9.2.0.8.0 - ProductionCORE9.2.0.8.0 ProductionTNS for 32-bit Windows: Version 9.2.0.8.0 - ProductionNLSRTL Version 9.2.0.8.0 - Production推
深入浅出redo和undo记载03
如何高效快速插入数据,nologging+append+parallel 停掉索引和约束!下面来看看nologging和append模式下产生的redo测试!SQL> archive log list数据库日志模式 非存档模式自动存档 禁用存档终点 USE_DB_RECOVERY_FILE_DEST最早的联机日志序列 1当前日志序列 3SQL> create or replace view redo_size as select name,value from v$mystat a,v$statname b where 2 a.STATISTIC#=b.STATISTIC# and b.NAME='redo size';SQL> create public synonym redo_size for redo_size; Syno
深入浅出-redo和undo记载02
Log_buffer中的redo entries的大小是以bytes为单位,LGWR还是以redo block size为单位把redo写入磁盘,redo block size是oracle源代码固定的,跟操作系统有关,通常的操作系统都是以512bytes为单位。例如Solaris,AIX,Windows,Linux等可以从v$sysstat视图得到redo bloc sizeSQL> select value,name from v$sysstat where name in ('redo size','redo wastage','redo blocks written'); 2 / VALUE NAME---------- ---------------------------------------------------------------- 5065308 redo size 294736 redo wasta
丢失redo的solution
今早打开自己的测试库发现alter system switch logfile无法日志交换,具体问题及解决步骤如下:C:Documents and Settings0990753>sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12月 20 10:19:34 2011Copyright (c) 1982, 2005, Oracle. All rights reserved.连接到:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith the Partitioning, OLAP and Data Mining optionsSQL> alter system switch logfile;总是等待,看来日志交换出了问题,查看v$session_wait有event switch
深入浅出-redo和undo记载01
Redo和undo可以说是oracle实例回滚和事务一致性的重要依据,好在自己对于oracle的这两个理解比shared pool理解透彻,结合eygle的深入浅出这两章再次回味一下redo和undo的特性!Redo用于记录数据库的改变,redo特性有三个组件:redo log buffer重做日志缓存 lgwr后台进程用于把redo log buffer写入disk,redo log file(归档模式下arcn用于把写满的redo log file归档到归档日志下),redo中记录数据库的改变的信息以重做条目redo entries形式存储(又称redo records),redo entrie包含数据库改变的信息,其中有insert update的dml和alter
深入浅出buffer cache和shared pool记载03
还是继续整理eygle深入浅出中关于shared pool部分。Shared pool共享池,初步仅仅只是理解为sql和pl/sql 数据字典的共享区,提供代码共享,当然这也是shared pool最重要的地方。在oracle 10G后的自动sga管理,shared pool回由oracle自动管理,并不需要dba过多的设置,因为系统的业务情况也是不稳定的,buffer cache和shared pool的需求程度也不同,自动sga的管理可以按系统负载情况均衡sga的各个组件。Alter system set events ‘immediate trace name heapdump leval 2’EXTENT 8 addr=28000000 Chunk 28000038 sz= 24 R-freeabl
动态sql无法recover
早上看pub的一个帖子说到动态sql执行恢复的一个错误,SQL> alter database datafile 4 offline; Database altered SQL> declare 2 v_ab number; 3 v_sql varchar2(100); 4 begin 5 select file# into v_ab from v$recover_file; 6 v_sql:='recover datafile'||v_ab; 7 execute immediate v_sql; 8 end; 9 /declare*第 1 行出现错误:ORA-00900: 无效 SQL 语句ORA-06512: 在 line 7SQL> recover datafile 4;完成介质恢复。SQL> alter database datafile 4 online;数据库已更改。Oracle的动态sql可以执行ddl等操
in,exists和not exists ,not in与null的一些关系记载
In和exist,not in和not exists,其中可能还有null,一直是个很纠结的问题,直到现在自己也不能完全说出两种语句的优劣,使用情况等。 先从查询结果上来讲,上个星期五pub的一篇帖子说到了not in和not exists查询结果不同,记得曾经碰到过这种问题,null的影响,因为not in和not exists两种从根本上”算法”是不同的。下面自己做个了测试的例子可以很清晰的看到结果不同SQL> select * from jj_one;ID NAME------ ----------------------------------------1 as2 adkj1 asSQL> select * from jj_two;COL1 COL2---------- ----------1