数据库程序员面试分模拟题4_第1页
数据库程序员面试分模拟题4_第2页
数据库程序员面试分模拟题4_第3页
数据库程序员面试分模拟题4_第4页
数据库程序员面试分模拟题4_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

数据库程序员面试分模拟题4简答题1.

FORUPDATE和FORUPDATEOF的区别是什么?正确答案:SELECT...FORUPDATE语句的语法如下:

SELECT...FOR(江南博哥)UPDATE[OFcolumn_list][WAITn|NOWAIT][SKIPLOCKED];

其中,这个OF子句在涉及多个表时,具有较大作用。若不使用OF指定锁定的表的列,则所有表的相关行均被锁定。若在OF中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。WAIT子句指定等待其他用户释放锁的秒数,以防止无限期的等待。

“使用FORUPDATEWAIT”子句的优点如下:

1)防止无限期地等待被锁定的行。

2)允许应用程序中对锁的等待时间进行更多的控制。

3)对于交互式应用程序非常有用,因为这些用户不能等待不确定的时间。

4)若使用了SKIPLOCKED,则可以越过锁定的行,不会报告由waitn引发的“资源忙”异常报告。

在Oracle10g之前,SELECT...FORUPDATE获取的是2级TM锁,而从Oracle10g开始,SELECT...FORUPDATE获取的是3级TM锁。[考点]锁

2.

什么是更新丢失?正确答案:更新丢失是指多个用户通过应用程序访问数据库时,由于查询数据并返回到页面和用户修改完毕单击保存按钮将修改后的结果保存到数据库这个时间段(即修改数据在页面上停留的时间)在不同用户之间可能存在偏差,从而最先查询数据并且最后提交数据的用户会把其他用户所做的修改覆盖掉。当两个或多个事务选择同一行数据,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在。最后的更新将重写由其他事务所做的更新,这将导致数据丢失。

简单来说,更新丢失就是两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。Serializable可以防止更新丢失问题的发生。其他的三个隔离级别都有可能发生更新丢失问题。Serializable虽然可以防止更新丢失,但是效率太低,通常数据库不会用这个隔离级别,所以,需要其他的机制来防止更新丢失,例如悲观锁和乐观锁。[考点]基本概念

3.

什么是HighVersionCount?正确答案:一个父游标下对应的子游标个数被称为Versioncount,每个子游标对应一个执行计划。对于一个特定的游标有多少个版本(VersionCount)属于高版本游标是没有明确定义的。对于不同的系统有不同的数量界定。HighVersionCount不仅产生的原因是多种多样的,而且会导致各种令人头痛的问题,轻则导致数据库的性能急剧下降,CPU利用率剧增,重则导致数据库挂起,触发ORA-04031或者其他BuG导致宕机。

在AWR报告中,VersionCount大于20就会被报告出来,如下图所示。

SQL执行计划的生成,是受到很多因素影响的。相同父游标只是表示输入SQL的字面值相同。子游标对应的因素,如优化器类型、优化器的模式(OPTIMIZER_MODE)、对应对象权限等的差异,都会影响到子游标的共享。

在Oracle11g中,V$SQLSHARED_CURSOR可以用来诊断子游标不共享问题的原因。该视图通过SOL_ID和CHILD_NUMBER就可以定义某个特定子游标的信息。该视图中大部分列都是以VARCHAR2(1)的Y/N取值,每列的含义都是一个不能共享的理由。需要注意的是,这个理由N表示的是不能与第一个子游标(CHILD_NUMBER=0)共享的理由。[考点]游标

4.

SQL注入的含义是什么?正确答案:所谓SQL注入(SQLInjection),就是通过把SQL命令插入WEB表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令的目的。例如,在代码中使用下面的SQL语句:SQL="SELECTTOP1*FROMUSERWHERENAME='''+NAME+'''ANDPASSWORD='''+PASSWORD+'''''来验证用户名和密码是否正确,其中,NAME和PASSWORD是用户输入的内容,当用户输入用户名为AA,密码为“BB或'A'='A'”时,拼接出来的SQL语句就为“SELECTTOP1*FROMUSERWHERENAME='AA'ANDPASSWORD='BB'OR'A'='A'”,那么只要USER表中有数据,这条SQL语句就会有返回结果,这就达到了SQL注入的目的。作为DBA,永远不要信任用户的输入,相反,必须认定用户输入的数据永远都是不安全的,对用户输入的数据必须都进行过滤处理。[考点]SQL注入

5.

SQLServer、Access、Oracle三种数据库之间的区别是什么?正确答案:Access是一种桌面数据库,只适合于数据量少的应用系统,在处理少量数据和单机访问的数据时是很好的,效率也很高。但是Access数据库有一定的极限,如果数据达到100MB左右,那么很容易造成Access假死,或者消耗掉服务器的内存导致服务器崩溃。

SQLServer是基于服务器端的中型数据库,适合大容量数据的应用,在处理海量数据的效率、后台开发的灵活性、可扩展性等方面强大。因为现在数据库都使用标准的SQL语言对数据库进行管理,所以,如果是标准SQL语言,那么两者基本上都可以通用的。SQLServer还有更多的扩展,可以用存储过程、函数等。

Oracle是基于服务器的大型数据库,主要应用于银行、证券类业务等。[考点]维护操作

6.

集群安装过程中的$GRID_HOME/root.sh脚本的作用是什么?正确答案:该脚本主要执行CRS的配置、格式化OCR磁盘、更新/etc/inittab文件、启动ocssd进程、新建/etc/oracle/ocr.loc文件等,是RAC安装过程中非常重要的一步。若后期OCR、OLR或表决磁盘出现问题都可以通过重新执行root.sh脚本来修复集群的配置信息。

重新执行root.sh脚本的过程如下:

$GRID_HOME/crs/install/rootcrs.pl-deconfig-force-verbose

--卸载配置信息

--$GRID_HOME/crs/install/rootcrs.pl-deconfig-force-verbose-lastnode-keepdg

--最后一个节点可以保留磁盘组

ddif=/dev/zeroof=/dev/rhdiskNbs=1024kcount=1024

--清理磁盘头

$DRID_HOME/root.sh

-重新执行

另外,deconfig执行完后可以考虑删除以下文件:

ls-1$GRID_BASE/Clusterware/ckptGridHA*

fredSGRID_HOME/gpnp/*-typef

find$GRID_HOMF/gpnp/*-typef-execrm-rf{}\;

集群的配置信息包含在文件$GRID_HOME/crs/install/crsconfig_params中,root.sh脚本根据该文件的配置信息设置OCR的内容。在执行root.sh脚本的过程中产生的日志在目录$GRID_HOME/cfgtoollogs/crsconfig/下。[考点]RAC

7.

假定SERV表有A、B、C三个字段:SERV(ANUMBER(10),BNUMBER(10),CNUMBER(10))。表SERV的内容如下:ABC110702305011080

以下两段PL/SQL的功能是根据A列的值,查找出对应B列的值赋予变量X,请分别判断这两段PL/SQL是否能正常执行,若不能正常执行,请指出错误的原因并修改。

1)

DECLARE

XNUMBER;

BEGIN

SELECTBINTOXFROMSERVWHEREA=1;

DBMS_OUTPUT.PUT_LINE(TO_CHAR(X));

END;

2)

DECLARE

XNUMBER;

BEGIN

SELECTBINTOXFROMSERVWHEREA=2;

DBMS_OUTPUT.PUT.LINE(TO_CHAR(X));

END:正确答案:这两段程序除了WHERE语句后的值不同以外,其他均一样。对于程序1),当A=1时,返回了2行记录;对于程序2),当A=2时,返回了1行记录。对于变量X而言,只能接受一个值,所以,程序2)执行不报错,程序1)执行报错:ORA-01422:exactfetchreturnsmorethanrequestednumberofrows。

对于程序1)有两种修改方法,第一种就是将“SELECTBINTOXFROMSERVWHEREA=1;”修改为“SELECTDISTINCTBINTOXFROMSERVWHEREA=1;”。第二种方法就是返回集合类型,修改后的程序块如下:

DECLARE

VARCURSORSYS_REFCURSOR;

X

SERV%ROWTYPE;

BEGIN

OPENVARCURSORFORSELECTT.*FROMSERVTWHEREA=1;

LOOP

FETCHVARCURSORINTOX;

EXITWHENVARCURSOR%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(R.B);

ENDLOOP;

END;[考点]高级操作

8.

对于Oracle数据库,使用裸设备的好处有哪些?正确答案:因为使用裸设备避免了再经过OS这一层,数据直接从磁盘到数据库进行传输,所以,使用裸设备对于读写频繁的数据库应用来说,可以极大地提高数据库系统的性能。当然,这是在磁盘的I/O非常大,并且磁盘I/O已经成为系统瓶颈的情况下才成立。如果磁盘读写确实非常频繁,以至于磁盘读写成为系统瓶颈的情况成立,那么采用裸设备确实可以大大提高性能。[考点]裸设备(RAW)

9.

如何捕获存储过程中出现异常的行号?正确答案:使用函数DBMS_UTILITY.FORMAT_ERROR_BACKTRACE可以获取到出现异常时候的程序的行号,而函数DBMS_UTILITY.FORMAT_ERROR_STACK可以获取到出现异常时的错误信息,作用和SQLERRM一样。[考点]程序处理

10.

如何查询SCHEDULERJOB的运行日志?正确答案:可以通过查询视图DBA_SCHEDULER_JOB_RUN_DETAILS来获取SCHEDULERJOB的运行日志、产生的错误等信息。代码如下:

SELECTJRD.LOG_ID,JRD.JOB_NAME,N.JOB_CLASS,

TO_CHAR(JRD.LOG_DATE,'YYYY-MM-DDHH24:MI:SS')LOG_DATE,

JRD.STATUS,JRD.ERROR#,JRD.RUN_DURATION运行时长,JRD.ADDITIONAL_INF.O

FROMDBA_SCHEDULER_JOB_LOGN,DBA_SCHEDULER_JOB_RUN_DETAILSJRD

WHEREN.LOG_ID=JRD.LOG_ID

ANDN.JOB_NAME='JOB_INSERT_SQL_LHR'

--JOB的名称

ORDERBYJRD.LOG_IDDESC;

从查询结果中可以看到,JOB_INSERT_SQL_LHR从2016-11-2913:03:36开始执行的时候就报错了,报错信息可以从ADDITIONAL_INFO列里找到,其报错的具体信息如下:

ORA-01658:unabletocreateINITIALextentforsegmentintablespaceTS_LHR

ORA-06512:at"DB_MONITOR.PKG_SQL_HISTORY_LHR",line180

可见,涉及的程序是DB_MONITOR用户下的PKG_SQL_HISTORY_LHR包,而ORA-01658的错误是由于表空间不足引起的。[考点]JOB

11.

差异增量备份和累积增量备份的区别是什么?正确答案:数据库备份可以分为完全备份和增量备份。完全数据文件备份是包含文件中所有已用数据块的备份。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),它们的区别见下表。方式关键字默认说明差异增量备份DIFFERENTIAL是将备份上次进行的同级或低级备份以来所有变化的数据块,有同级备份同级,无同级备份低级累积增量备份CUMULATIVE否将备份上次进行的低级备份以来所有变化的数据块

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

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

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

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

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

12.

Oracle中锁的兼容性是什么样的?正确答案:常见SQL语句的锁兼容情况见下表。SQL语句行级锁模式表级锁模式是否允许锁操作?RS(2)RX(3)S(4)SRX(5)X(6)SELECT...FROMtable...

NULLYYYYYINSERTINTOtable...XRXYYNNNINSERT/*+APPEND*/INTOtable...XXNNNNNUPDATEtable...XRXY*Y*NNNDELETEFROMtable...XRXY*Y*NNNSELECT...FROMtableFORUPDATE(OF)...XRX(Oracle9i是RS)Y*Y*Y*Y*NLOCKTABLEtableINROWSHAREMODE

RSYYYYNLOCKTABLEtableINSHAREUPDATEMODE

RSYYYYNLOCKTABLEtableINROWEXCLUSIVEMODE

RXYYNNNLOCKTABLEtableINSHAREMODE

SYNYNNLOCKTABLEtableINSHAREROWEXCLUSIVEMODE

SRXYNNNNLOCKTABLEtableINEXCLUSIVEMODE

XNNNNN

注:Y*表示当不与其他事务的行级锁冲突时才允许,否则将产生等待。锁之间的兼容模式见下表。

Held/GetNull(1)RS(2)RX(3)S(4)SSX(5)X(6)0、1none、Null√√√√√√2RS√√√√√

3RX√√√

4S√√

5SSX√√

6X√

[考点]锁

13.

YUM有哪些常见的操作命令?正确答案:YUM的命令形式如下:

yum[options][command][package...]

其中的[options]是可选的,选项包括-h(帮助)、-y(当安装过程提示选择全部为yes)、-q(不显示安装的过程)等;[command]为所要进行的操作;[package...]是操作的对象。

YUM部分常用的命令包括:

自动搜索最快镜像插件:yuminstallyum-fastestmirror

安装yum图形窗口插件:

yuminstallyumex

查看可能批量安装的列表:yumgrouplist

1.安装

yuminstall全部安装

yuminstallpackage1安装指定的安装包package1

yumgroupinsallgroup1安装程序维group1

2.更新和升级

yumupdate全部更新

yumupdatepackage1更新指定程序包package1

yumcheck-update检查可更新的程序

yumupgradepackage1升级指定程序包package1

yumgroupupdategroup1升级程序组group1

3.查找和显示

yuminfopackage1显示安装包信息package1

yumlist显示所有已经安装和可以安装的程序包

yumlistpackage1显示指定程序包安装情况package1

yumgroupinfogroup1显示程序组group1信息yumsearchstring,根据关键字string查找安装包

4.删除程序

yumremove|erasepackage1删除程序包package1

yumgroupremovegroup1删除程序组group1

yumdeplistpackage1查看程序package1依赖情况

5.清除缓存

yumcleanpackages清除缓存目录下的软件包

yumcleanheaders清除缓存目录下headers

yumcleanoldherders清除缓存目录下旧的headers

yumclean,yumcleanall(=yumcleanpackages;yumcleanoldheaders)清除缓存目录下的软件包及旧的headers

14.

直方图(Histogram)的意义是什么?直方图的适用场合有哪些?正确答案:在Oracle数据库中,CBO会默认认为目标列的数据在其最小值(LOW_VALUE)和最大值(HIGH_VALUE)之间是均匀分布的,并且会按照这个均匀分布原则来计算对目标列施加WHERE查询条件后的可选择率以及结果集的Cardinality,进而据此来计算成本值并选择执行计划。但目标列的数据是均匀分布这个原则并不总是正确的,在实际的系统中,可以很容易地发现有一些目标列的数据分布是不均匀的,甚至是极度倾斜、分布极度不均衡的。对这样的列如果还按照均匀分布的原则去计算可选择率与Cardinality,并据此来计算成本、选择执行计划,那么CBO所选择的执行计划就可能是不合理的,甚至是错误的,所以此时应该收集列的直方图。

直方图是一种列的特殊的统计信息,主要用来描述列上的数据分布情况。当数据分布倾斜时,直方图可以有效地提升Cardinality评估的准确度。构造直方图最主要的原因就是帮助优化器在表中数据严重偏斜时做出更好的规划。例如,表中的某个列上,其中的某个值占据了数据行的80%(数据分布倾斜),相关的索引就可能无法帮助减少满足查询所需的I/O数量。创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或何时应该根据WHERE子句中的值返回表中80%的记录。如果对目标列收集了直方图,那么意味着CBO将不再认为该目标列上的数据是均匀分布的了,CBO就会用该目标列上的直方图统计信息来计算对该列施加查询条件后的可选择率和返回结果集的Cardinality,进而据此计算成本并选择相应的执行计划。

通常情况下在以下场合中建议使用直方图:

1)当WHERE子句引用了列值分布存在明显偏差的列时:当这种偏差相当明显时,以至于WHERE子句中的值将会使优化器选择不同的执行计划,这时应该使用直方图来帮助优化器来修正执行路径。(注意:若查询不引用该列,则在该列上创建直方图没有意义。)

2)当列值导致不正确的判断时,这种情况通常会发生在多表连接时。例如,假设有一个五张表的连接操作,其目标SQL最终结果集只有10行。Oracle将会以一种使第一个连接的结果集(集合基数)尽可能小的方式将表连接起来。通过在中间结果集中携带更少的负载,查询将会运行得更快。为了使中间结果最小化,优化器尝试在SQL执行的分析阶段评估每个结果集的集合基数。在偏差的列上拥有直方图将会极大地帮助优化器做出正确的决策。如优化器对中间结果集的大小做出不正确的判断,则它可能会选择一种未达到最优化的表连接方法。因此向该列添加直方图经常会向优化器提供使用最佳连接方法所需的信息。[考点]统计信息

15.

常用的10046及10053诊断事件的区别是什么?正确答案:最为常用的诊断事件是10046和10053事件。10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强。Oracle的10046事件,可以跟踪应用程序所执行的SQL语句,并且得到其解析次数、执行次数、CPU使用时间等信息。这对DBA来分析、定位数据库性能问题是非常有用的。

10046事件可分成不同的级别(LEVEL),分别追踪记录不同程度的有用信息。对于这些不同的级别,应当注意的是向下兼容的,即高一级的TRACE信息包含低于此级的所有信息。

10046事件可以设置以下级别:

1)level0:禁用SQL_TRACE,等价于SQL_TRACE=FALSE。

2)level1:启用标准的SQL_TRACE功能跟踪SQL语句,包括解析、执行、提取、提交、回滚、响应时间、服务时间、处理的行数、物理读和写的数目、执行计划以及其他一些额外信息,等价于SQL_TRACE=TRUE。

3)level4:Level1+包括绑定变量(BindValues)的详细信息。

4)level8:Level1+包括等待事件。

5)level12:包括绑定变量与等待事件,包含Level1+Level4+Level8。

10053事件是最常用的Oracle优化器跟踪Trace。10053事件解析优化器为什么选择某个执行计划但并不记录这个执行计划到底运行得如何。10046事件并不解释优化器的工作,但它记录了在SQL解析阶段所遇到的等待事件和所消耗的CPU等资源,以及执行阶段的各项指标。需要注意的是,如果一个SQL语句已经被解析过,那么就不会生成10053的trace文件,但10046的trace文件可以重复生成。

简而言之,10046事件记录SQL如何运行,而10053记录优化器为什么为这个SQL选择某个执行计划。[考点]性能诊断

16.

MySQL的分区表是什么?如何查询MySQL是否支持分区?正确答案:表分区是指根据一定规则,将数据库中的一张表分解成多个更小的、容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成,每个分区都是一个独立的对象。分区有利于管理大表,体现了“分而治之”的理念。一个表最多支持1024个分区。

在MySQL5.6.1之前可以通过命令“showvariableslike'%have_partitioning%'”来查看MySQL是否支持分区。若have_partintioning的值为YES,则表示支持分区。从MySQL5.6.1开始,该参数已经被去掉了,而是用SHOWPLUGI

温馨提示

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

评论

0/150

提交评论