Author: mac
-
还原真实的cache recovery
我们在学习Oracle基础知识的时候会了解到实例恢复(Instance Recovery)或者说崩溃恢复(Crash recovery)的概念,有时候甚至于这2个名词在我们日常的语言中表达同样的意思。实际上Instance Recovery与Crash Recovery是存在区别的:针对单实例(single instance)或者RAC中所有节点全部崩溃后的恢复,我们称之为Crash Recovery。而对于RAC中的某一个节点失败,存活节点(surviving instance)试图对失败节点线程上redo做应用的情况,我们称之为Instance Recovery。 不管是Instance Recovery还是Crash Recovery,都由2个部分组成:cache recovery继以transaction recovery。 根据官方文档的介绍,Cache Recovery也叫Rolling Forward,就是我们常说的前滚;而Transaction Recovery也叫Rolling Back,就是我们常说的回滚。前滚和回滚贯穿Oracle恢复的基本概念,是我们入门必要学习的知识,在次不多介绍。 有文事者,必济之以武略。理论学得再好,不实践也无用。所幸Crash Recovery是很容易做成的实验,我们不妨来看一看: SQL> shutdown abort; ORACLE instance shut down. SQL> startup mount; ORACLE instance started. Total System Global Area 1065353216 bytes Fixed Size 2089336 bytes Variable Size 486542984 bytes Database Buffers 570425344 bytes Redo Buffers 6295552…
-
Oracle内部视图:x$targetrba
SQL> desc x$targetrba Name —————————————– ADDR N/A INDX N/A INST_ID N/A TOTALLOGSZ select sum(bytes)/redo_standard_size from v$log LGLOGSZ select bytes/512 from v$Log where status=’CURRENT’ CUR_EST_RCV_READS Number of dirty buffers in the buffer cache. In the Standard Edition, this column is always null. ACTUAL_REDO_BLKS Current actual number of redo blocks required for recovery TARGET_RBA_SEQ target redo block…
-
了解你所不知道的SMON功能(四):维护col_usage$字典基表
SMON的作用还包括维护col_usage$列监控统计信息基表。 最早在9i中引入了col_usage$字典基表,其目的在于监控column在SQL语句作为predicate的情况,col_usage$的出现完善了CBO中柱状图自动收集的机制。 create table col_usage$ ( obj# number, /* object number */ intcol# number, /* internal column number */ equality_preds number, /* equality predicates */ equijoin_preds number, /* equijoin predicates */ nonequijoin_preds number, /* nonequijoin predicates */ range_preds number, /* range predicates */ like_preds number, /* (not) like predicates */ null_preds number, /* (not) null…
-
Oracle等待事件kfk:async disk IO
kfk: async disk IO等待事件是ASM下异步的System I/O等待事件,kfk内核层面在disk_asynch_io=true时被激活。当rbal或其他ASM相关后台进程在维护ASM磁盘组时可能进入kfk: async disk IO等待。 SQL> col name for a20 SQL> col PARAMETER1 for a10 SQL> col PARAMETER2 for a10 SQL> col PARAMETER3 for a10 SQL> col WAIT_CLASS for a15 SQL> select name,parameter1,parameter2,parameter3,wait_class from v$event_name where name=’kfk: async disk IO’; NAME PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS ——————– ———- ———- ———- ————— kfk: async…
-
Too many fragmentation in LMT?
这周和同事讨论技术问题时,他告诉我客户的一套11.1.0.6的数据库中某个本地管理表空间上存在大量的Extents Fragment区间碎片,这些连续的Extents没有正常合并为一个大的Extent,他怀疑这是由于11.1.0.6上的bug造成了LMT上存在大量碎片。 同事判断该表空间上有碎片的依据是从dba_free_space视图中查询到大量连续的Free Extents: SQL> select tablespace_name,EXTENT_MANAGEMENT,ALLOCATION_TYPE from dba_tablespaces where tablespace_name=’FRAGMENT’; TABLESPACE_NAME EXTENT_MAN ALLOCATIO —————————— ———- ——— FRAGMENT LOCAL SYSTEM SQL> select block_id,blocks from dba_free_space where tablespace_name=’FRAGMENT’ and rownum<10; BLOCK_ID BLOCKS ———- ———- 40009 222136 25 8 9 8 17 8 33 8 41 8 49 8 57 8 65 8 ………….. SQL> select count(*),blocks…
-
Oracle内部视图:x$ktfbfe
x$ktfbue:kernel transaction, file bitmap free extents,Free extent bitmap in file header for LMT (equivalent to fet$ in DMT); check dba_free_space view definition,ktfb –space/spcmgmt support for bitmapped space manipulation of files/tablespaces KTFBFE means K[Kernel] T[Transaction] F[File] B[Bitmap] F[Free] E[Extents] SQL> desc x$ktfbfe; Name —————————————– ADDR N/A INDX N/A INST_ID N/A KTFBFETSN TS# containing this free extent…
-
Script:列出失效索引或索引分区
以下脚本可用于列出数据库中的失效的索引、索引分区、子分区: REM list of the unusable index,index partition,index subpartition in Database Select owner, index_name, status From dba_indexes where status = ‘UNUSABLE’ and owner not in (‘SYS’,’SYSTEM’, ‘SYSMAN’, ‘EXFSYS’, ‘WMSYS’, ‘OLAPSYS’, ‘OUTLN’, ‘DBSNMP’, ‘ORDSYS’, ‘ORDPLUGINS’, ‘MDSYS’, ‘CTXSYS’, ‘AURORA$ORB$UNAUTHENTICATED’, ‘XDB’, ‘FLOWS_030000’, ‘FLOWS_FILES’) order by 1, 2 / select index_owner, index_name, partition_name from dba_ind_partitions where status =’UNUSABLE’ and…
-
了解你所不知道的SMON功能(三):清理obj$基表
SMON的作用还包括清理obj$数据字典基表(cleanup obj$) OBJ$字典基表是Oracle Bootstarp启动自举的重要对象之一: SQL> set linesize 80 ; SQL> select sql_text from bootstrap$ where sql_text like ‘CREATE TABLE OBJ$%’; SQL_TEXT ——————————————————————————– CREATE TABLE OBJ$(“OBJ#” NUMBER NOT NULL,”DATAOBJ#” NUMBER,”OWNER#” NUMBER NOT N ULL,”NAME” VARCHAR2(30) NOT NULL,”NAMESPACE” NUMBER NOT NULL,”SUBNAME” VARCHAR2( 30),”TYPE#” NUMBER NOT NULL,”CTIME” DATE NOT NULL,”MTIME” DATE NOT NULL,”STIME” DATE NOT NULL,”STATUS” NUMBER NOT…
-
了解你所不知道的SMON功能(二):合并空闲区间
SMON的作用还包括合并空闲区间(coalesces free extent) 触发场景 早期Oracle采用DMT字典管理表空间,不同于今时今日的LMT本地管理方式,DMT下通过对FET$和UET$2张字典基表的递归操作来管理区间。SMON每5分钟(SMON wakes itself every 5 minutes and checks for tablespaces with default pctincrease != 0)会自发地去检查哪些默认存储参数pctincrease不等于0的字典管理表空间,注意这种清理工作是针对DMT的,而LMT则无需合并。SMON对这些DMT表空间上的连续相邻的空闲Extents实施coalesce操作以合并成一个更大的空闲Extent,这同时也意味着SMON需要维护FET$字典基表。 现象 以下查询可以检查数据库中空闲Extents的总数,如果这个总数在持续减少那么说明SMON正在coalesce free space: SELECT COUNT(*) FROM DBA_FREE_SPACE; 在合并区间时SMON需要排他地(exclusive)持有ST(Space Transaction)队列锁, 其他会话可能因为得不到ST锁而等待超时出现ORA-01575错误。同时SMON可能在繁琐的coalesce操作中消耗100%的CPU。 如何禁止SMON合并空闲区间 可以通过设置诊断事件event=’10269 trace name context forever, level 10’来禁用SMON合并空闲区间(Don’t do coalesces of free space in SMON) 10269, 00000, “Don’t do coalesces of free space in SMON”…
-
了解你所不知道的SMON功能(一):清理临时段
SMON(system monitor process)系统监控后台进程,有时候也被叫做system cleanup process,这么叫的原因是它负责完成很多清理(cleanup)任务。但凡学习过Oracle基础知识的技术人员都会或多或少对该background process的功能有所了解。 曾几何时对SMON功能的了解程度可以作为评判一位DBA理论知识的重要因素,至今仍有很多公司在DBA面试中会问到SMON有哪些功能这样的问题。首先这是一道开放式的题目,并不会奢求面试者能够打全(答全几乎是不可能的,即便是在你阅读本篇文章之后),答出多少可以作为知识广度的评判依据(如果面试人特意为这题准备过,那么也很好,说明他已经能系统地考虑问题了),接着还可以就具体的某一个功能说开去,来了解面试者的知识深度,当然这扯远了。 我们所熟知的SMON是个兢兢业业的家伙,它负责完成一些列系统级别的任务。与PMON(Process Monitor)后台进程不同的是,SMON负责完成更多和整体系统相关的工作,这导致它会去做一些不知名的”累活”,当系统频繁产生这些”垃圾任务”,则SMON可能忙不过来。因此在10g中SMON变得有一点懒惰了,如果它在短期内接收到过多的工作通知(SMON: system monitor process posted),那么它可能选择消极怠工以便让自己不要过于繁忙(SMON: Posted too frequently, trans recovery disabled),之后会详细介绍。 SMON的主要作用包括: 1.清理临时段(SMON cleanup temporary segments) 触发场景 很多人错误地理解了这里所说的临时段temporary segments,认为temporary segments是指temporary tablespace临时表空间上的排序临时段(sort segment)。事实上这里的临时段主要指的是永久表空间(permanent tablespace)上的临时段,当然临时表空间上的temporary segments也是由SMON来清理(cleanup)的,但这种清理仅发生在数据库实例启动时(instance startup)。 永久表空间上同样存在临时段,譬如当我们在某个永久表空间上使用create table/index等DDL命令创建某个表/索引时,服务进程一开始会在指定的永久表空间上分配足够多的区间(Extents),这些区间在命令结束之前都是临时的(Temporary Extents),直到表/索引完全建成才将该temporary segment转换为permanent segment。另外当使用drop命令删除某个段时,也会先将该段率先转换为temporary segment,之后再来清理该temporary segment(DROP object converts the segment to temporary and then cleans up the temporary segment)。 常规情况下清理工作遵循谁创建temporary segment,谁负责清理的原则。换句话说,因服务进程rebuild…