Oracle程序员面试分类模拟33_第1页
Oracle程序员面试分类模拟33_第2页
Oracle程序员面试分类模拟33_第3页
Oracle程序员面试分类模拟33_第4页
Oracle程序员面试分类模拟33_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle程序员面试分类模拟33简答题1.

如何清除V$ARCHIVED_LOG视图中的过期信息?正确答案:在使用RMAN命令(DELETEARCHIVELOGALL;)删除归档信息后V$A(江南博哥)RCHIVED_LOG视图中的NAME列为空,但是依然可以查询到这些删除了的归档信息,出现这样的现象是因为使用RMAN命令在删除归档日志的时候不会清除控制文件中的内容,导致V$ARCHIVED_LOG留下的过期的不完整信息。使用如下的命令可以清除控制文件中关于V$ARCHIVED_LOG的信息:

2.

备库数据文件异常,物理DG如何恢复?正确答案:有的时候由于备库空间不足,在主库添加了数据文件后,导致备库数据文件的缺失,可能很久之后才发现,但是由于归档的缺失等其他原因而导致备库不能正常应用Redo日志。还有其他情况可能导致备库的数据文件不能正常ONLNE,在这种情况下,可以在主库上利用CONVERT命令备份一个数据文件然后复制到备库即可。若是备库归档文件比较全,则可以直接在备库创建数据文件后应用Redo日志即可,而不需要从主库复制数据文件。

恢复过程中的一些关键性的命令如下:

3.

什么是热块?正确答案:当一个会话需要访问一个数据块,而这个数据块正在被另一个用户从磁盘读取到内存中或者这个数据块正在被另一个会话修改时,当前的会话就需要等待,就会产生一个bufferbusywaits等待,也伴随着Latch争用。如果太多的会话去访问相同的数据块,那么会导致长时间的bufferbusywaits等待,通常表现形式为CPU使用率很高,但吞吐量很低。造成热块的原因可能是数据库设置或者重复执行的SQL语句频繁访问一些相同的数据块。热块产生的原因不尽相同,按照数据块的类型,可以分成表数据块、索引数据块、索引根数据块、文件头数据块和数据块自身的争用,不同热块类型处理的方式是不同的。下面给出找到热块的SQL语句:

4.

RESETLOGS和NORESETLOGS的区别是什么?正确答案:RESETLOGS和NORESETLOGS主要用在两个地方,第一是在创建控制文件的时候,第二是在打开数据库的时候。当将控制文件备份到TRACE文件时,可以看到里面包含了两部分的重建语句,一个是使用RESETLOGS,另一个是使用NORESETLOGS。

备份控制文件的SQL如下:

以下是重建控制文件的命令:

若当前的所有在线日志可用,则在创建控制文件的时候使用NORESETLOGS。若当前的在线日志有所损坏时,则在创建控制文件的时候需要使用RESETLOGS。若使用RESETLOGS则将导致在线日志里的内容丢失,并且所有的备份失效。

在打开数据库的时候也可以使用RESETLOGS或NOR_ESETLOGS选项。在做了不完全恢复后,RESETLOGS会初始化日志,重置日志序列号(从1开始),并且创建一个新的INCARNATION。可以使用RMAN命令查看INCARNATION的信息:

做不完全恢复必须使用RESETLOGS,但是RESETLOGS也可以做完全恢复。而NORESETLOGS则必须是在做完全恢复时使用。RESETLOGS会重置日志序列号,强制清空或重建在线日志,而NORESETLOGS则不会这么做。

5.

如何处理Oracle中的坏块?正确答案:(1)坏块的简介Oracle数据文件的坏块可以分为物理坏块和逻辑坏块。物理坏块指的是块格式本身已经损坏,块内的数据没有任何意义。逻辑坏块指的是块内的数据在逻辑上存在问题,比如说索引块的索引值没有按顺序排列导致的逻辑坏块。物理坏块一般是由于内存问题、OS问题、I/O子系统问题或硬件引起的,逻辑坏块一般是由Oracle系统Bug等原因引起的。

坏块通常是通过Oracle的ORA-01578错误报告出来的,详细的损坏描述会在告警日志中打印出来,“oerrora”对该错误的解释如下:

可能的报错如下:

那么何时进行数据块的一致性检查呢?当一个数据块被读或写的时候,将对块进行一致性检查,检查的内容包括块的版本、块在BlockBuffer中的数据块地址,然后根据要求进行校验(checksum)。

块的一致性检查由DB_BLOCK_CHECKSUM和DB_BLOCK_CHECKING两个初始化参数控制。DB_BLOCK_CHECKSUM是一种物理检查,只有在写入(DBWn常规写或用户进程直接路径写入)数据文件时,根据一个CHECKSUM算法计算数据块的校验和,然后写入数据块的一个特定位置,在读取块时再进行检验,主要是为了防止I/O硬件和I/O子系统的错误。DB_BLOCK_CHECKrNG参数主要用于数据块的逻辑一致性检查,但只是在块内,不包括块间的逻辑检查,用于防止在内存中损坏或数据损坏。

(2)坏块的检测方法坏块的检测方法见下表。

坏块的检测方法

(3)BMR恢复坏块如果数据库只有很少的数据块被破坏,那么使用块介质恢复(BlockMediaRecovery,BMR)是较好的块恢复方法。BMR只能用于恢复物理损坏(PhysicalCorruptions),在数据文件联机时即可恢复相关坏块。BMR主要使用BLOCKRECOVER命令进行恢复坏块,该命令有以下三种使用方式:

1)使用“BLOCKRECOVERCORRUPTIONLIST;”命令恢复在V$DATABASE_BLOCK_CORRUPTION视图中报告的所有块。

2)使用“BLOCKRECOVERDATAFILE1BLOCKIO;”命令恢复单个块,需要指定文件号和块号。

3)使用“BLOCKRECOVERTABLESPACETS_USERDBAXXX;”命令恢复某个表空间的坏块,需要指定表空间和数据块地址。

下面给出几个恢复示例:

1)恢复3个数据文件的损坏块:

2)从数据文件复制中恢复一系列块:

3)从指定的TAG备份中恢复块:

4)从用于恢复数据到两天以前的备份中还原、恢复SYSTEM表空间中的两个块:

5)运行备份验证数据库,修复在V$DATABASE_BLOCK_CORRUPTION中记录的所有损坏块:

(4)如何确定坏块的对象名根据绝对文件号和块号确定数据块对象的SQL语句如下:

如下的SQL可以确定段占用的数据块:

关于坏块需要注意以下几点:

1)对于受损的数据块,仅坏块上的数据无法被查询或读取,其余正常块的数据依旧可以使用。

2)对于受损的表对象进行聚合等相关运算时会收到错误提示,因为坏块上的数据无法被统计。

3)可以基于RMAN的备份文件实现块介质恢复,其数据文件无需OFFLINE,成本损失最小,影响最小。

4)对于多个数据块的损坏,先执行BACKUPVALIDATE校验数据库或相应的数据文件以便标记受损的坏块后,填充V$DATABASE_BLOCK_CORRUPTION后再使用命令“BLOCKRECOVERCORRUPTIONLIST;”一次性恢复所有的坏块。

5)在默认情况下,存在坏块的数据文件无法成功备份,也会导致自动备份脚本失败。

6.

在登记日志文件时为什么必须先写日志文件,后写数据库?正确答案:把对数据的修改写到数据库中和把表示这个修改的日志记录写到日志文件中是两个不同的操作。有可能在这两个操作之间发生故障,即这两个写操作只完成了一个。如果先写了数据库修改,而在运行记录中没有登记这个修改,那么以后就无法恢复这个修改了。如果先写日志,但没有修改数据库,那么在恢复时只不过是多执行一次Undo操作,并不会影响数据库的正确性。所以一定要先写日志文件,即首先把日志记录写到日志文件中,然后写数据库的修改。

7.

Oracle如何删除归档日志文件?正确答案:在RMAN工具里删除归档日志文件:

8.

Switchover和Failover的区别?正确答案:一个DG环境中只有两种角色:Primary和Standby。所谓角色转换就是让数琚库在这两种角色中切换,切换也分两种:Switchover和Failover,关于角色切换需要注意以下几点:

1)Switchover是指主库转换成备库,然后将原备库转换成新主库;而Failover是指将备库转换成主库。

2)使用场合不同:Switchover用于有准备的、计划之中的切换,通常是系统升级、数据迁移等常态任务;Failover用于意料之外的突发情况,例如异常断电、自然灾难等。

3)数据丢失程度不同:Switchover表示不会丢失数据,Failover通常意味着有部分数据丢失。

4)善后处理的不同:Switchover之后DG环境不会被破坏,仍然有Primary、Standby两种角色的系统存在,但是Failover之后,DG环境就会被破坏,一般情况下需要重建。

9.

数据库参数RESOURCE_LIMIT的作用是什么?正确答案:该参数用来启用或禁用数据库资源限制(通过PROFILE设定)。关于RESOURCE_LIMIT需要注意以下两点:

1)用户所有拥有的PROFILE中有关密码的限制永远生效,不受限制。

2)用户所有拥有的PROFILE中有关资源的限制与RESOURCE_LIMIT参数的设置有关,当为TRUE时生效,当为FALSE时(默认值是FALSE)无效。在Oracle12c之前该参数默认为FALSE,而从12c开始,该参数默认为TRUE。

10.

Cache替换算法有哪些?正确答案:数据可以存放在CPU或者内存中。CPU处理快,但是容量少;内存容量大,但是转交给CPU处理的速度慢。为此,需要Cache(缓存)来做一个折中。将最有可能调用的数据先从内存调入Cache,CPU再从Cache读取数据,这样会快许多。然而,Cache中所存放的数据不是全部有用的。CPU从Cache中读取到有用数据称为“命中”。

由于主存中的块比Cache中的块多,所以当要从主存中调一个块到Cache中时,会出现该块所映射到的一组(或一个)Cache块已全部被占用的情况。此时,需要被迫腾出其中的某一块,以接纳新调入的块,这就是替换。

Cache替换算法有RAND算法、FIFO算法、LRU算法、OPT算法和LFU算法。

(1)随机(RAND)算法随机算法就是用随机数发生器产生一个要替换的块号,将该块替换出去,此算法简单、易于实现,而且它不考虑Cache块过去、现在及将来的使用情况。但是由于没有利用上层存储器使用的“历史信息”、没有根据访存的局部性原理,故不能提高Cache的命中率,命中率较低。

(2)先进先出(FIFO)算法先进先出(FirstInFirstOut,FIFO)算法是将最先进入Cache的信息块替换出去。FIFO算法按调入Cache的先后决定淘汰的顺序,选择最早调入Cache的字块进行替换,它不需要记录各字块的使用情况,比较容易实现,系统开销小,其缺点是可能会把一些需要经常使用的程序块(如循环程序)也作为最早进入Cache的块替换掉,而且没有根据访存的局部性原理,故不能提高Cache的命中率。因为最早调入的信息可能以后还要用到,或者经常要用到,如循环程序。此法简单、方便,利用了主存的“历史信息”,但并不能说最先进入的就不经常使用,其缺点是不能正确反映程序局部性原理,命中率不高,可能出现一种异常现象。例如,Solar—16/65机Cache采用组相连方式,每组4块,每块都设定一个两位的计数器,当某块被装入或被替换时该块的计数器清为0,而同组的其他各块的计数器均加1,当需要替换时就选择计数值最大的块被替换掉。

(3)近期最少使用(LRU)算法近期最少使用(LeastRecentlyUsed,LRU)算法是将近期最少使用的Cache中的信息块替换出去。

LRU算法是依据各块使用的情况,总是选择那个最近最少使用的块被替换。这种方法虽然比较好地反映了程序局部性规律,但是这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU算法相对合理,但实现起来比较复杂,系统开销较大。通常需要对每一块设置一个称为计数器的硬件或软件模块,用以记录其被使用的情况。

实现LRU策略的方法有多种,例如计数器法、寄存器栈法及硬件逻辑比较法等,下面简单介绍计数器法的设计思路。

计数器方法:缓存的每一块都设置一个计数器。计数器的操作规则如下:

1)被调入或者被替换的块,其计数器清“0”,而其他的计数器则加“1”。

2)当访问命中时,所有块的计数值与命中块的计数值要进行比较,如果计数值小于命中块的计数值,则该块的计数值加“1”;如果块的计数值大于命中块的计数值,则数值不变。最后将命中块的计数器清“0”。

3)需要替换时,则选择计数值最大的块被替换。

(4)最优替换(OPT)算法使用最优替换(OPTimalreplacement,OPT)算法时必须先执行一次程序,统计Cache的替换情况。有了这样的先验信息,在第二次执行该程序时便可以用最有效的方式来替换,以达到最优的目的。

前面介绍的几种页面替换算法主要是以主存储器中页面调度情况的历史信息为依据的,它假设将来主存储器中的页面调度情况与过去一段时间内主存储器中的页面调度情况是相同的,显然,这种假设不总是正确的。最好的算法应该是选择将来最久不被访问的页面作为被替换的页面,这种替换算法的命中率一定是最高的,它就是最优替换算法。

要实现OPT算法,唯一的办法是让程序先执行一遍,记录下实际的页地址的使用情况。根据这个页地址的使用情况才能找出当前要被替换的页面。显然,这样做是不现实的。因此,OPT算法只是一种理想化的算法,然而它也是一种很有用的算法。实际上,经常把这种算法用来作为评价其他页面替换算法好坏的标准。在其他条件相同的情况下,哪一种页面替换算法的命中率与OPT算法最接近,那么它就是一种比较好的页面替换算法。

(5)近期最少使用(LFU)算法近期最少使用(LeastFrequentlyUsed,LFU)算法选择近期最少访问的页面作为被替换的页面。显然,这是一种非常合理的算法,因为到目前为止最少使用的页面,很可能也是将来最少访问的页面。该算法既充分利用了主存中页面调度情况的历史信息,又正确反映了程序的局部特性。但是,这种算法实现起来非常困难,它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。在选择被替换页面时,要从所有计数器中找出一个计数值最大的计数器。

11.

动态SQL是什么?正确答案:在PL/SQL开发过程中,使用SQL或PL/SQL可以实现大部分的需求,但是,在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,例如需要动态建表或执行某个不确定的操作的时候,就需要动态执行,此外,DDL语句及系统控制语句也不能在PL/SQL中直接使用,这就需要使用动态SQL来实现。因此,在Oracle数据库开发PL/SQL块中,可以把SQL分为静态SQL和动态SQL。所谓静态SQL指的是在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。动态SQL允许在SQL客户模块或嵌入式宿主程序的执行过程中执行动态生成的SQL语句,动态SQL语句在程序编译时尚未确定。其中,有些部分需要程序在执行过程中临时生成的SQL语句,SQL标准引入动态SQL的原因是由于静态SQL不能提供足够的编程灵活性。

动态SQL是使用EXECUTEIMMEDIATE语句来实现的。

12.

Oracle用户的状态有几种?分别表示什么含义?正确答案:Oracle用户的状态是由密码来决定的,而Oracle中的密码是由PROFILE来配置的。PROFILE是口令限制、资源限制的命令集合。当建立数据库时,Oracle会自动建立名称为DEFAULT的PROFILE。当创建用户而没有指定PROFILE选项时,Oracle就会将DEFAULT分配给用户。

通过如下的命令可以查出与密码相关的PROFILE的值:

每个参数的含义如下所示:

(1)FAILED_LOGIN_ATTEMPTS设定登录到Oracle数据库时可以失败的次数。一旦某用户尝试登录数据库的次数达到该值时,该用户的账户就被锁定,只能由DBA解锁。

(2)PASSWORD_LIFE_TIME设定口令的有效时间(天数),一旦超过这一时间,必须重新设口令。缺省为UNLIMITED。

(3)PASSWORD_REUSE_TIME许多系统不许用户重新启用过去用过的口令。该资源项设定了一个失效口令要经过多少天,用户才可以重新使用该口令,默认周期为180天。

(4)PASSWORD_REUSE_MAX重新启用一个先前用过的口令前必须对该口令进行重新设置的次数(重复用的次数)。

(5)PASSWORD_LOCK_TIME设定账户被锁定的天数(当登录失败达到FAILED_LOGIN_ATTEMPTS时)。

(6)PASSWORD_GRACE_TIME设定在口令失效前,给予的重新设置该口令的宽限天数。当口令失效之后,在登录时会出现警告信息显示该天数。如果没有在宽限天数内修改口令,口令将失效。

(7)PASSWORD_VERITY_FUNCTION该资源项允许调用一个PL/SQL来验证口令。Oracle已提供该应用的脚本,为$ORACLE_HOME/rdbms/admin/utlpwdmg.sql。但是,用户可以制定自己的验证脚本。该参数的设定就是PL/SQL函数的名称,默认为NULL。

用户的状态可以由以下脚本查询获得:

以上九种可以分为两大类:①基本状态;②组合状态。前五种是基本状态,后四种是组合状态。具体分类如图所示。

用户状态的分类

每种状态的解释见表。

在Oracle中,若用户的密码变为锁定状态[LOCKED、LOCKED(TIMED)1时,DBA可以直接执行“ALTERUSER用户名ACCOUNTUNLOCK”来解锁。但是,如果用户的状态变成过期状态[EXPIRED、EXPIRED(GRACE)],那么DBA必须要更改用户的密码账户才能重新使用。但有些时候,因为各种原因并不知道原密码的明文是什么,这时候可以有如下两种办法来更新密码。

(1)用原密码的密文来更改密码

在Oracle10g中,DBAUSERS视图的PASSWORD字段提供了密码的密文形式,而在Oracle11g中,该字段被弃用了,内容为空,但是在基表USER$中的PASSWORD字段依然有记录密文形式。另外,可以通过DBMS_METADATA.GET_DDL包或者expdp.exp命令来获取创建用户的语句从而获取密码的密文形式。如下的SQL即获取密码的密文形式:

获取了密码的密文后就可以用如下的命令来修改了,注意:使用密文的命令中多了一个VALUES关键字:

所以,即使不知道用户的原密码是什么,也可以用它的密文来更改密码。这样既保持了密码不改变,又可以把EXPIRED的状态更改掉。在MOS文档ID1543668.1中也有命令可以直接获取密码。

(2)直接更新USER$基表

不管用户的状态是什么,通过更新USER$表可以让用户处于OPEN状态。

13.

静态链接与动态链接有什么区别?正确答案:静态链接是指把要调用的函数或者过程直接链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的.exe文件中,该文件包含了运行时所需的全部代码。静态链接的缺点是当多个程序都调用相同函数时,内存中就会存在这个函数的多个复制,这样就浪费了内存资源。

动态链接是相对于静态链接而言的,动态链接所调用的函数代码并没有被复制到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库(dynanuclinklibrary,简称dll)之间建立链接关系。当要执行所调用.dll文件中的函数时,根据链接产生的重定位信息,操作系统才转去执行.dll文件中相应的函数代码。

静态链接的执行程序能够在其他同类操作系统的机器上直接运行。例如,一个.exe文件是在Windows2000系统上静态链接的,那么将该文件直接复制到另一台Windows2000的机器上,是可以运行的。而动态链接的执行程序则不可以,除非把该.exe文件所需的dll文件都一并复制过去,或者对方机器上也有所需的相同版本的.dll文件,否则是不能保证正常运行的。

14.

差异增量备份和累积增量备份的区别是什么?正确答案:数据库备份可以分为完全备份和增量备份。完全数据文件备份是包含文件中所有已用数据块的备份。RMAN将所有块复制到备份集或映像副本中,仅跳过从未使用的数据文件块。完全映像副本可准确地再现整个文件的内容。完全备份不能成为增量备份策略的一部分;它也不能作为后续增量备份的基础。

增量备份就是将那些与前一次备份相比发生变化的数据块复制到备份集中。通过RMAN可以为单独的数据文件、表空间或者整个数据库进行增量备份。增量备份是0级备份,其中包含数据文件中除从未使用的块之外的所有块;或者是1级备份,其中仅包含自上次备份以来更改过的那些块。0级增量备份在物理上与完全备份完全一样。唯一区别是0级备份可用作1级备份的基础,但完全备份不可用作1级备份的基础。要使用增量备份,必须先执行0级增量备份。

通过BACKUP命令中的INCREMENTAL关键字可指定增量备份,可以指定INCREMENTALLEVEL[0|1]。在RMAN中建立的增量备份可以具有不同的级别,每个级别都使用一个不小于0的整数来标识,也就是在BACKUP命令中使用LEVEL关键字指定的,例如LEVEL=0表示备份级别为0,LEVEL=1表示备份级别为1。每次进行增量备份仅操作那些发生了“变化”的数据块。RMAN中增量备份有两种:差异增量备份(DIFFERENTIAL)和累计增量备份(CUMULATIVE),它们的区别见下表。

差异增量备份和累积增量备份的区别

差异增量备份和累计增量备份如下图所示。

差异增量备份和累计增量备份

1)执行0级增量备份的命令为:RMAN>BACKUPINCREMENTALLEVEL0DATABASE;。

2)执行差异增量备份的命令为:RMAN>BACKUPINCREMENTALLEVEL1DATABASE;。

3)执行累积增量备份的命令为:RMAN>BACKUPINCREMENTALLEVEL1CUMULATIVEDATABASE;。

可以对处于NOARCHIVELOG模式的数据库执行任何类型的备份(完全或增量)。当然,前提条件是数据库处于未打开状态。需要注意的是,数据库只能恢复到上次备份时的状态。只有当数据库处于ARCHIVELOG模式时,才可以将其恢复到上次提交事务处理时的状态。

15.

OracleHint中的DRIVINGSITE的作用是什么?正确答案:在日常工作中经常会用到分布式数据库查询,即通过DBLINK同时查询本地表和远程表。分布式查询一般有两种处理方式:一种是将远程表数据取回本地,然后和本地表关联查询,获取最终结果;另一种是将本地表数据传到远程和远程表关联查询后,再将关联结果取回。前一种处理方式可理解为只有一次网络传输操作,比后一种少,也就作为了数据库的默认处理方式。DRIVING_SITE提示能够指定执行计划在远程还是本地做,使用DRIVING_SITE,特别是本地小结果集,远程大结果集,最终结果集较小时,那么最好是执行计划在远程操作,这样远程执行完毕,将结果集传输到本地,避免了大结果集的网络传输,从而达到整体优化的效果。使用DRIVING_SITE可以减少总体的网络传输数据量。

当DRIVING_SITE驱动的对象嵌套在视图中时,可通过DRIVING_SITE(V.T)方式来指定,其中,V表示视图别名或名称,T表示视图里表的别名或名称。

需要注意的是,对于DML和DDL语句,DRIVING_SITE提示是失效的,会自动被Oracle忽略掉,此时将以目标表所在库为主计划驱动,相当于DRIVING_SITE(目标表库),此时可以通过视图转换来达到优化的目的。在DML和DDL中如果是对本地表做DML,主计划总是在本地执行,会将远程数据拉到本地,相当于DRIVING_SITE(本地表)。如果是对远程表做DML,那么主计划总是在远程执行,会将本地数据送到远程,相当于自动DRIVING_SITE(远程表)。

16.

如何跟踪tnsping过程?正确答案:sqlnet是oracle提供的与网络层面交互的一个工具,比如如何解析客户端发起的连接,如何对客户端发起的连接进行辨别,如何对客户端连接进行阻隔限制或者启用日志及跟踪(logandtrace)功能等一系列的功能。所以,可以通过sqlnet工具对tnsping进行跟踪分析,查找为何外部网络无法连接数据库的原因。

可以在客户端的sqlnet.ora文件中配置:

其中,TNSPINGTRACE_LEVEL指的是跟踪的级别,SUPPORT为最高级别,该参数可选的级别包括off、user、admin和support。一般来说既然是跟踪错误原因,作者建议还是设置为support较好。TNSPrNG.TRACE_DIRECTORY指的是跟踪产生的trace文件存放的位置。

在执行“tnspingorcl”后,在目录“D:\app\oracle\product\11.2.0.1\dbhome_1\NETWORK\ADMIN”下会生成一个跟踪文件称为tnsping.trc,然后分析该文件即可。

17.

LogMiner是什么?其有哪些用途?请简述LogMiner的使用过程。正确答案:众所周知,所有对用户数据和数据字典的改变都记录在Oracle的Redo日志中,因此,Redo日志包含了所有进行恢复操作所需要的信息。但是,原始的Redo日志文件无法看懂,所以,Oracle从8i版本以后提供了一个非常有用的分析工具,称为LogMiner。使用该工具可以轻松获得Redo日志文件(包含归档日志文件)中的具体内容。特别是该工具可以分析出所有对于数据库的DML操作(INSERT、UPDATE、DELETE等)语句。Oracle9i版本后可以分析DDL语句,另外还可分析得到一些必要的回滚SQL语句。LogMiner一个最重要的用途就是不用全部恢复数据库就可以恢复数据库的某个变化。该工具特别适用于调试、审计或者回退某个特定的事务。

LogMiner工具既可以用来分析在线日志,也可以用来分析离线日志文件,既可以分析本身自己数据库的重作日志文件,也可以用来分析其他数据库的重做日志文件。当分析其他数据库的重做日志文件时,需要注意的是,LogMiner必须使用被分析数据库实例产生的字典文件,而不是安装LogMiner的数据库产生的字典文件,另外,必须保证安装LogMiner数据库的字符集和被分析数据库的字符集相同。源数据库(SourceDatabase)平台必须和分析数据库(MiningDatabase)平台一样。

Oracle通过LogMiner工具对Redo日志进行挖掘,显示出一系列可读的信息,该过程称为日志挖掘。LogMiner通过V$LOGMNR_CONTENTS视图显示Redo日志中的信息。

总的说来,LogMiner工具的主要用途有:①跟踪数据库的变化:可以离线地跟踪数据库的变化,而不会影响在线系统的性能;②回退数据库的变化:回退特定的变化数据,减少Point-In-TimeRecovery的执行;③优化和扩容计划:可通过分析日志文件中的数据以分析数据的增长模式;④确定数据库的逻辑损坏时间:准确定位操作执行的时间和SCN;⑤确定事务级要执行的精细逻辑恢复操作,可以取得相应的Undo操作;⑥执行后续审计。

(1)安装LogMiner工具在默认情况下,Oracle已经安装了LogMiner工具。若是没有安装,则可以运行下面两个脚本:

这两个脚本必须均以SYS用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包,该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。若要使普通用户具有日志挖掘的权限,则可以执行如下的SQL进行赋权:

脚本执行完毕后,LogMiner包含两个PL/SQL包和几个视图:

1)DBMS_LOGMNR_D包,包括一个用于提取数据字典信息的过程,即DBMS_LOGMNR_D.BUILD()过程,还包含一个重建LogMiner表的过程,DBMS_LOGMNR_D.SET_TABLESPACE。在默认情况下,LogMiner的表是建在SYSTEM表空间下的。

2)DBMSLOGIMNR包,它有3个存储过程:

①ADD_LOGFILE(NAMEVARCHAR2,OPTIONSNUMBER)用来添加或删除用于分析的日志文件。

②START_LOGMNR(START_SCNNUMBER,END_SCNNUMBER,START_TIMENUMBER,END_TIMENUMBER,DICTFILENAMEVARCHAR2,OPTIONSNUMBER)用来开启日志分析,同时确定分析的时间或SCN窗口以及确认是否使用提取出来的数据字典信息。

③END_LOGMNR()存储过程用来终止分析会话,它将回收LogMiner所占用的内存。

与LogMiner相关的数据字典视图:

1)V$LOGHIST:显示历史日志文件的一些信息。

2)V$LOGMNR_DICTIONARY:因为LOGMINER可以有多个字典文件,所以该视图显示字典文件信息。

3)V$LOGMNR_PARAMETERS:显示LOGMINER的参数。

4)V$LOGMNR_LOGS:显示用于分析的日志列表信息。

5)V$LOGMNR_CONTENTS:LOGMINER结果。

(2)LogMiner的数据字典为了完全地转换Redo日志中的内容,LogMiner需要访问一个数据库字典。LogMiner使用该字典将Oracle内部的对象标识符和数据类型转换为对象名称和外部的数据格式。没有字典,LogMiner将使用十六进制字符显示内部对象ID。

例如,对于如下的SQL语句:

在没有数据字典的情况下,LogMiner将显示为:

LogMiner提供了3种提取字典文件的方式:

1)将字典文件提取为一个FlatFile(平面文件或中间接口文件)。

2)将字典文件提取为Redo日志。

3)使用OnlineCatalog(联机日志)。

下面分别介绍这3种方式:

1)将字典文件提取为一个FlatFile(平面文件或中间接口文件)。为了将数据库字典信息提取为FlatFile,需要使用带有STORE_IN_FLAT_FILE参数的DBMS_LOGMNR_D.BUILD程序。DBMS_LOGMNR_月份D.BUILD程序需要访问一个能够放置字典文件的目录。因为PL/SQL程序通常不能直接访问用户目录,必须手动指定一个由DBMS_LOGMNR_D.BUILD程序使用的目录。为了指定该目录,必须修改初始化文件中的UTL_FILE_DIR参数:

然后重新启动数据库。确保在创建FlatFile文件的过程中,不能有DDL操作被执行。在创建FlatFile文件时,数据库必须处于OPEN状态,然后执行DMBS_LOGMNR_D.BUILD程序:

脚本执行完成后会在/home/oracle下生成一个dictionary.ora的文本文件。该文件中包含一系列的建表语句和插入语句。

2)将字典文件提取为Redo日志。为了将字典文件提取为Redo日志,数据库必须处于OPEN状态,并且处于归档模式。将字典提取为Redo日志的过程中,数据库系统不能有DDL语句被执行。为了将字典提取为Redo日志,需要使用带有STORE_IN_REDO_FILES参数的DBMS_LOGMNR_D.BUILD程序:

需要注意的是,将字典文件提取为Redo文件的时候需要开启附加日志,如下:

在这些Redo日志被归档之后,可以通过查询V$ARCHIVED_LOG视图来查询:

如果将字典信息提取为Redo文件,那么在使用DBMD_LOGMNR.ADD_LOGFILE指定所需要分析的日志文件时,需要将这些包含字典信息的Redo文件也添加进去。同时在使用START_LOGMNR开始分析时,需要指定DICT_FROM_REDO_LOGS的参数。

3)使用OnlineCatalog(联机日志)。为了使LogMiner直接使用数据库当前使用的字典,在开始LogMiner时可以指定将联机目录作为字典源:

使用联机目录,意味着不需要再提取字典文件,它是开始分析日志的最快的方式。除了可以分析联机Redo日志外,还可以在和产生归档日志文件相同的系统上分析归档日志文件。然而,记住联机目录只能重建应用于表的最新版本上的SQL语句。一旦表被修改,联机目录就无法反映出表之前的版本。这就意味着LogMiner不能重建执行于表的旧版本上的SQL语句。

(3)跟踪DDL语句当LogMiner被启动时,它会自动创建自己的内部字典。如果源字典是FlatFile字典或Redo日志中的字典,则可以使用DDL_DICT_TRACKING参数来跟踪DDL语句。DDL跟踪默认是关闭的。为了打开这一功能,可以在启动LogMiner时使用DDL_DICT_TRACKING参数:

当使用DDL_DICT_TRACKING时,需要注意如下几点:

1)当使用联机目录(Onlinecatalog)时,也就是当使用DICT_FROM_ONLINE_CATALOG参数时,是不能使用DDL_DICT_TRACKING选项的。

2)使用DDL_DICT_TRACKING时,要求数据库处于OPEN状态。

3)尽量为LogMiner的表提供一个单独的表空间。默认情况下LogMiner的表是创建在SYSTEM表空间中的。使用DBMS_LOGMNR_D.SET_TABLESPACE可以在一个单独的表空间中重建这些LogMiner的表:SQL>EXECUTEDBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$');.

(4)过滤LogMiner返回的数据可以使用COMMITTED_DATA_ONLY参数来只显示那些被提交的事务:

当使用这一参数时,LogMiner将所有的DML操作按照事务的关系组合在一起。这些事务按照它们被提交的顺序显示出来。可以使用SKIP_CORRUPTION参数来忽略Redo日志中的所有错误:

可以使用STARTTIME和ENDTIME参数按照时间过滤数据,还可以使用STARTSCN和ENDSCN参数按照SCN(SystemChangeNumber)来过滤数据。

(5)典型的LogMiner步骤一个典型的LogMiner的操作包含如下步骤:

1)进行初始化设置:开启附加日志,设置LogMiner的表空间,设置UTL_FI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论