一份ORACLE DBA面试题
一:SQL tuning 类
1:列举几种表连接方式
答:
Oracle的多表连接算法有Nest Loop、Sort Merge和Hash Join三大类,每一类又可以分为三小类。
以Nest Loop为例:
- 传统的Nest Loop连接;
- 针对In、Exists优化的Semi Nest Loop;
- 专门针对Not In、Not Exists优化的Anti Nest Loop。
Semi/Anti *** Join这几种也叫半连接。
(可以补充一下这三个连接的不同之处)
2:不借助第三方工具,怎样查看sql的执行计划
答:
第一种:
Explain Plan For...命令是最简单的获得执行计划的方法,这个命令生成指定的SQL语句的执行计划,并把执行计划保存到用户指定的表中供用户查询。
但是Explain Plan For命令获得的执行计划不是Libary Cache中的执行计划,因此其准确性会打折扣。
第二种:
SQLPLUS中的SET TRACE 即可看到Execution Plan Statistics
SET AUTOTRACE ON;
3:如何使用CBO,CBO与RULE的区别
答:
在确定最佳的访问路径里面。如果是RBO,根据一些预定义的规则来决定访问路径;如果是CBO,则根据对象的统计信息确定访问路径。
CBO是基于成本(Cost)来评估执行计划的,CBO所用到的成本其实就是物理IO、逻辑IO的数量。
Oracle数据库中的优化器又叫查询优化器(Query Optimizer)。它是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。
Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO)
RBO: Rule-Based Optimization 基于规则的优化器
CBO: Cost-Based Optimization 基于代价的优化器
RBO自ORACLE 6以来被采用,一直沿用至ORACLE 9i。ORACLE 10g开始,ORACLE已经彻底丢弃了RBO,它有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说RBO对数据不“敏感”;它根据ORACLE指定的优先顺序规则,对指定的表进行执行计划的选择。比如在规则中,索引的优先级大于全表扫描;RBO是根据可用的访问路径以及访问路径等级来选择执行计划,在RBO中,SQL的写法往往会影响执行计划,它要求开发人员非常了解RBO的各项细则,菜鸟写出来的SQL脚本性能可能非常差。
CBO优化器根据SQL语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,并调用计划生成器(Plan Generator)生成执行计划,比较执行计划的代价,最终选择选择一个代价最小的执行计划。查询优化器由查询转换器(Query Transform)、代价估算器(Estimator)和计划生成器(Plan Generator)组成。
在Oracle 9i中,优化器模式可以选择first_rows_n,all_rows, choose, rule 等模式:
Rule: 基于规则的方式。
Choolse:指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
All Rows: 10g中的默认值,也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐
4:如何定位重要(消耗资源多)的SQL
答:
根据v$sqlarea 中的逻辑读/disk_read。以及寻找CPU使用过量的session,查出当前session的当前SQL语句,或者:监控WIN平台Oracle的运行
(1 )查看值得怀疑的SQL
select substr(to_char(s.pct, '99.00'), 2) || '%' load,
s.executions executes,
p.sql_text
from (select address,
disk_reads,
executions,
pct,
rank() over(order by disk_reads desc) ranking
from (select address,
disk_reads,
executions,
100 * ratio_to_report(disk_reads) over() pct
from sys.v_$sql
where command_type != 47)
where disk_reads > 50 * executions) s,
sys.v_$sqltext p
where s.ranking <= 5
and p.address = s.address
order by 1, s.address, p.piece;
(2 )查看消耗内存多的sql
select b.username ,a. buffer_gets ,a.executions,
a.disk_reads/decode(a.executions,0,1,a.executions),a.sql_text SQL
from v$sqlarea a,dba_users b
where a.parsing_user_id = b.user_id
and a.disk_reads >10000
order by disk_reads desc;
(3) 查看逻辑读多的SQL
select *
from (select buffer_gets, sql_text
from v$sqlarea
where buffer_gets > 500000
order by buffer_gets desc)
where rownum <= 30;
(4) 查看执行次数多的SQL
select sql_text, executions
from (select sql_text, executions from v$sqlarea order by executions desc)
where rownum < 81;
(5) 查看读硬盘多的SQL
select sql_text, disk_reads
from (select sql_text, disk_reads from v$sqlarea order by disk_reads desc)
where rownum < 21;
(6) 查看排序多的SQL
select sql_text, sorts
from (select sql_text, sorts from v$sqlarea order by sorts desc)
where rownum < 21;
(7) 分析的次数太多,执行的次数太少,要用绑变量的方法来写sql
set pagesize 600;
set linesize 120;
select substr(sql_text, 1, 80) "sql", count(*), sum(executions) "totexecs"
from v$sqlarea
where executions < 5
group by substr(sql_text, 1, 80)
having count(*) > 30
order by 2;
(8) 游标的观察
set pages 300;
select sum(a.value), b.name
from v$sesstat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'opened cursors current'
group by b.name;
select count(0) from v$open_cursor;
select user_name, sql_text, count(0)
from v$open_cursor
group by user_name, sql_text
having count(0) > 30;
(9) 查看当前用户&username执行的SQL
select sql_text
from v$sqltext_with_newlines
where (hash_value, address) in
(select sql_hash_value, sql_address
from v$session
where username = '&username')
order by address, piece;
5:如何跟踪某个session的SQL
答:
先找出对应的'sid,serial',然后调用system_system.set_sql_trace_in_session(sid,serial,true);参考:跟踪某个会话
6:SQL调整最关注的是什么
答:
逻辑读。IO量
7:说说你对索引的认识(索引的结构、对dml影响、对查询影响、为什么提高查询性能。
答:
默认的索引是b-tree.
对insert的影响.(分裂,要保证tree的平衡)
对delete的影响.(删除行的时候要标记改节点为删除).
对update的影响,如果更新表中的索引字段,则要相应的更新索引中的键值。
查询中包含索引字段的键值和行的物理地址。
8:使用索引查询一定能提高查询的性能吗?为什么。
答:
不一定能够。如果返回的行数目较大,使用全表扫描的性能较好。
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为text,image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。
9:绑定变量是什么?绑定变量有什么优缺点
答:通俗的说,绑定变量就是变量的一个占位符,使用绑定变量可以减少只有变量值不同的
语句的解析。
10:如何稳定(固定)执行计划
答:
使用stored outline.
11:和排序相关的内存在8i和9i分别怎样调整,临时表空间的作用是什么
答:
使用sort_area_size,hash_area_size,每个session分配相同的值,不管有无使用。
9i: 使用pga_aggregate来统一管理。
临时表空间的作用:
在sort_area_size中不能完成的部分在临时表空间完成,临时表空间在重建索引,创建临时表等都要用到。
还有hash join不能完成的也在临时表空间中做。
12:存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql
select a,b,c,d from (select a,b,c,d from T order by c) where rownum<=30
minus
select a,b,c,d from (select a,b,c,d from T order by c) where rownum <=20;
或者:
select * from (select rownum rn,a.* from (select a,b,c,d from T order by c) a )where rn between 21 and 30;
二:数据库基本概念类
1: pctused和pctfree表示什么含义有什么作用
答:
表示数据块什么时候移入和移出freelist。
pctused:如果数据块的使用率小于pctused的值,则该数据块重新加入到fresslist中。
pctfree:如果数据块的使用率高于pctfree的值,则该数据块从freelist中移出。
2:简单描述table / segment / extent / block之间的关系
答:
一个table至少是一个segment,如果分区表,则每个分区是一个segment,table可以看成是一个逻辑上的概念,segment可以看成是这个逻辑概念的物理实现;
segment由一个或多个extents组成,segment不可以跨表空间但可以跨数据文件;
extent由多个连续的blocks组成,不可以跨数据文件;
block由1-多个os块组成,是oracle i/o的最小存储单位。
3:描述tablespace和datafile之间的关系
答:
tablespace是逻辑上的概念,datafile是物理上的概念。
一个tablespace可以由多个datafile组成,一个datafile不能跨越多个tablespace。
4:本地管理表空间和字典管理表空间的特点,ASSM有什么特点
答:
一个使用freelist管理,一个使用位图管理。
5:回滚段的作用是什么
答:
保存数据的前像,保证数据读取的时间点一致性。Oracle里数据的多版本特性就是通过回滚段来实现的,正因为此,Oracle数据库实现了读写不竞争的性能优势!
6:日志的作用是什么
答:
记录对数据库的操作,便与恢复。
7:SGA主要有那些部分,主要作用是什么
答:
db_cache(缓存数据块),shared_pool(缓存sql,执行计划,数据字典信息等),large_pool(MTS模式、parallel 、rman等要用到),java pool(java程序如SQLJ存储过程运行时要用到)
8:oracle系统进程主要有哪些,作用是什么
答:
smon(合并空间,实例恢复),
pmon(清理失败的进程),
归档进程(负责在日志切换的时候归档日志文件),
lgmr(日志书写器进程,负责写日志),
ckpt(检查点进程,触发检查点),
dbwr(数据库写入器,负责把数据写入导datafile)
三:备份恢复类
1:备份如何分类
答:
逻辑备份(exp)与物理备份。或者冷备份与热备份。
2:归档是什么含义
答:
把日志文件放到另一个地方。
3:如果一个表在2004-08-04 10:30:00 被drop,在有完善的归档和备份的情况下,如何恢复
答:
拷贝备份,
recover database until time 2004-08-04 10:30:00
alter database open resetlogs;
4:rman是什么,有何特点
答:
rman叫恢复管理器.
特点很多。可以在线备份,到少目标数据库是mount状态。
1:热备份。
2:可以存储脚本。
3:可以增量备份。
4:自动管理备份集。
5:standby的特点
答:
利用传输重做日志来达到同步的目的。可以设定多个保护级别,9i后支持逻辑standbyDB。
6:对于一个要求恢复时间比较短的系统(数据库50G,每天归档5G),你如何设计备份策略
答:
每天一个全备份。
四:系统管理类
1:对于一个存在系统性能的系统,说出你的诊断处理思路
答:
做一个statspack,根据top 5,system load,top sql等来做相应的调整。
2:列举几种诊断IO、CPU、性能状况的方法
答:
hp-unix:iostat -x 1 5;
top/vmstat/glance
3:对statspack有何认识
答:
一个性能诊断工具而已,其本质就是在两个时间点采样两个系统数据。(动态性能视图),然后根据两个snapshot,产生一个报告。
4:如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响
答:
1:增大sort_area_size(8i)/pga_aggregate_target(9i)值。
2:如果表有分区(一般大表都要用到分区的),按分区逐个建索引,如果是本地索引的话;
3:系统空闲的时候建。
5:对raid10 和raid5有何认识
答:raid10是先镜像后条带,适合对写入速度要求较高的数据库系统,特别是online redolog文件,raid5适合大部分的数据库系统和数据仓库系统,读性能优于写性能。
五:综合随意类
1:你最擅长的是oracle哪部分?
答:性能/sql 调优、备份恢复。
2:喜欢oracle吗?喜欢上论坛吗?或者偏好oracle的哪一部分?
答:http://www.itpub.net/,Oracle的SQL 优化。
3:随意说说你觉得oracle最有意思的部分或者最困难的部分
答:SQL调优,最困难的是Oracle的网络管理,Oracle的Connect Manager没用过。
4:为何要选择做DBA呢?
答:爱好加职业历史积累。
4:如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响
答:1:增大sort_area_size(8i)/pga_aggregate_target(9i)值。
2:用并行的方式来建。
3:系统空闲的时候建。
其他:
什么是聚集索引,什么是非聚集索引,什么又是主键?
聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。
非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
能够唯一表示数据表中的每个记录的字段或者字段的组合就称为主键,通过它可强制表的实体完整性。
1、事务是什么?
答:
所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
2、oracle中truncate和delete命令有何区别?
答:
(1)delete将在回滚段中产生回滚信息,truncate不产生,因此无论表中的记录多少,truncate执行都很快。
(2)truncate 是 DDL,执行隐含的commit,truncate不能回滚。任何没有提交的 DML 改变也将会和truncate一起提交。
(3)truncate 重置表及其索引高水位标志。全表扫描和索引快速全扫描读高水位标志下的所有数据块,因此在delete后全扫描性能没有提高,但truncate后将会变快。
(4)truncate 不触发 delete 触发器。
(5)没有对象权限允许一个用户 truncate 另一个用户的表。这样做需要 DROP ANY TABLE 系统权限。
(6)当一个表被 truncate,表及其索引的存储将被重置回初始大小。而 delete 不收缩表及其索引的大小。
(7)当父表有一个可用的引用完整性约束时不能被 truncate。必须先disable引用父表的外键约束,再truncate。
3、Oracle中char和varchar2数据类型有什么区别?有数据”test”分别存放到char(10)和varchar2(10)类型的字段中,其存储长度及类型有何区别?A:char是定长字符类型,varchar2是变长字符类型。“test”在char(10)中被补齐空格,存储长度是10字节,在varchar2(10)中存储长度是4字节。
Oracle DBA笔试及面试题汇总:基础篇-考试认证
使用篇
1:使用索引查询一定能提高查询的性能吗?举出实例
2:数据库设计的一、二、三范式、BCNF是什么?
3:StoreProcedure和Function有何区别?
4:如何跟踪某个session的SQL?
5:如何使用CBO,CBO与RULE的区别?
6:描述tablespace和datafile之间的关系
7:truncate和delete有何区别?哪一种操作性能更快?
8:什么是Snapshot?与View有何区别?
9:pctused and pctfree 表示什么含义有什么作用
10:cursor一般用在什么地方?有何弱点?
管理篇
1:SQL调整最关注的是什么?
2:Oracle的系统进程有哪些?作用是什么?
3:本地管理表空间和字典管理表空间的特点,ASSM有什么特点?
4:备份如何分类?
5:如果一个表被drop,在有完善的归档和备份的情况下,如何恢复
6:rman是什么,有何特点?
7:standby的特点
8:对于一个要求恢复时间比较短的系统(数据库50G,每天归档5G),你如何设计备份策略
9:对于一个存在系统性能的系统,说出你的诊断处理思路
10:列举几种诊断IO、CPU、性能状况的方法
11:对statspack有何认识
12:如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响
13:对raid10 和raid5有何认识
14:SGA主要有那些部分,主要作用是什么
15:简单描述table / segment / extent / block之间的关系
16:说说你对索引的认识(索引的结构、对dml影响、对查询影响、为什么提高查询性能)
8.简述堆栈与队列的区别。
Oracle DBA 笔试题
(答题时间60分钟)
Unix/Linux题目
1、如何查看主机cpu,内存、IP和磁盘空间?
2、你常用的进程管理、主机性能察看命令有哪些?
3、建立组dba和该组下用户oracle,默认shell为bash。
4、如何查看用户oracle的登陆历史和命令操作历史?
5、写crontab,让脚本/opt/test.sh在每周日晚上8:00执行。
6、如何查找当前目录及其所有子目录下含有“ORA-”或“warning”字符内容的所有带log后缀的文件。
7、写一个shell,完成自动登陆数据库(用户名密码是test/testpwd, 网络连接串是db_wending)并获取数据库当前SCN的功能。
Oracle Database题目
1、如何快速了解一个已经运行很久的数据库系统?
2、如何获得SQL语句的执行计划和统计信息?
3、列出你常用的数据字典视图和动态性能视图。
4、陈述使用过的数据库备份和恢复技术,及其优缺点。
5、描述 table/segment/tablespace/datafile/extent/block 之间的关系。
6、前台系统反映非常慢,需要你去分析诊断。请详细陈述诊断流程,包括写下可能用到的操作系统命令、数据库视图等。
7、公司准备把Oracle9i升级为Oracle10.2.0.4,但批准的停库时间仅为10分钟,你打算如何应对?
8、详细陈述RAC、Dataguard、Streams Replication、Advanced Replication等Oracle HA技术的原理和优缺点。
9、写存储过程,把当前用户下数据库对象个数信息按对象类型分组输出来。
10、请写下你常关注的oracle初始化参数。
--End--
国外公司的Oracle DBA 面试题
2007-11-20 10:20
Oracle DBA Interview Questions By B G
1. How many memory layers are in the shared pool?
2. How do you find out from the RMAN catalog if a particular archive log has been backed-up?
3. How can you tell how much space is left on a given file system and how much space each of the file system's subdirectories take-up?
4. Define the SGA and:
? How you would configure SGA for a mid-sized OLTP environment?
? What is involved in tuning the SGA?
5. What is the cache hit ratio, what impact does it have on performance of an Oracle database and what is involved in tuning it?
6. Other than making use of the statspack utility, what would you check when you are monitoring or running a health check on an Oracle 8i or 9i database?
7. How do you tell what your machine name is and what is its IP address?
8. How would you go about verifying the network name that the local_listener is currently using?
9. You have 4 instances running on the same UNIX box. How can you determine which shared memory and semaphores are associated with which instance?
10. What view(s) do you use to associate a user's SQLPLUS session with his o/s process?
11. What is the recommended interval at which to run statspack snapshots, and why?
12. What spfile/init.ora file parameter exists to force the CBO to make the execution path of a given statement use an index, even if the index scan may appear to be calculated as more costly?
13. Assuming today is Monday, how would you use the DBMS_JOB package to schedule the execution of a given procedure owned by SCOTT to start Wednesday at 9AM and to run subsequently every other day at 2AM.
14. How would you edit your CRONTAB to schedule the running of /test/test.sh to run every other day at 2PM?
15. What do the 9i dbms_standard.sql_txt() and dbms_standard.sql_text() procedures do?
16. In which dictionary table or view would you look to determine at which time a snapshot or MVIEW last successfully refreshed?
17. How would you best determine why your MVIEW couldn't FAST REFRESH?
18. How does propagation differ between Advanced Replication and Snapshot Replication (readonly)?
19. Which dictionary view(s) would you first look at to understand or get a high-level idea of a given Advanced Replication environment?
20. How would you begin to troubleshoot an ORA-3113 error?
21. Which dictionary tables and/or views would you look at to diagnose a locking issue?
22. An automatic job running via DBMS_JOB has failed. Knowing only that "it's failed", how do you approach troubleshooting this issue?
23. How would you extract DDL of a table without using a GUI tool?
24. You're getting high "busy buffer waits" - how can you find what's causing it?
25. What query tells you how much space a tablespace named "test" is taking up, and how much space is remaining?
26. Database is hung. Old and new user connections alike hang on impact. What do you do? Your SYS SQLPLUS session IS able to connect.
27. Database crashes. Corruption is found scattered among the file system neither of your doing nor of Oracle's. What database recovery options are available? Database is in archive log mode.
28. Illustrate how to determine the amount of physical CPUs a Unix Box possesses (LINUX and/or Solaris)。
29. How do you increase the OS limitation for open files (LINUX and/or Solaris)?
30. Provide an example of a shell script which logs into SQLPLUS as SYS, determines the current date, changes the date format to include minutes & seconds, issues a drop table command, displays the date again, and finally exits.
31. Explain how you would restore a database using RMAN to Point in Time?
32. How does Oracle guarantee data integrity of data changes?
33. Which environment variables are absolutely critical in order to run the OUI?
34. What SQL query from v$session can you run to show how many sessions are logged in as a particular user account?
35. Why does Oracle not permit the use of PCTUSED with indexes?
36. What would you use to improve performance on an insert statement that places millions of rows into that table?
37. What would you do with an "in-doubt" distributed transaction?
38. What are the commands you'd issue to show the explain plan for "select * from dual"?
39. In what script is "snap$" created? In what script is the "scott/tiger" schema created?
40. If you're unsure in which script a sys or system-owned object is created, but you know it's in a script from a specific directory, what UNIX command from that directory structure can you run to find your answer?
41. How would you configure your networking files to connect to a database by the name of DSS which resides in domain icallinc.com?
42. You create a private database link and upon connection,
fails with: ORA-2085: connects to .
What is the problem? How would you go about resolving this error?
43. I have my backup RMAN script called "backup_rman.sh". I am on the target database. My catalog username/password is rman/rman. My catalog db is called rman. How would you run this shell script from the O/S such that it would run as a background process?
44. Explain the concept of the DUAL table.
45. What are the ways tablespaces can be managed and how do they differ?
46. From the database level, how can you tell under which time zone a database is operating?
47. What's the benefit of "dbms_stats" over "analyze"?
48. Typically, where is the conventional directory structure chosen for Oracle binaries to reside?
49. You have found corruption in a tablespace that contains static tables that are part of a database that is in NOARCHIVE log mode. How would you restore the tablespace without losing new data in the other tablespaces?
50. How do you recover a datafile that has not been physically been backed up since its creation and has been deleted. Provide syntax example.
如何获得Oracle DBA工作?
不过48个小时,就有120封Oracle 数据库管理员的求职信堆在了Debbie Reames的桌子上,Reames是位于洛杉矶的商业编程公司的高级技术招聘人员。然后Reames做了许多招聘人员都做的事情。她通过三个步骤的过程剔除了其中的一般简历。需要H-1B visa信用卡?走吧。需要重新安置?不适合这个工作。只在小公司工作过?这个职位对你来说太大了。
根据多项调查,除了IT历史上最低迷的时期之外,Oracle总是为那些经过认证的专业人士和数据库管理员提过了大量的工作机会。当然,具有资格的候选人的列表就更长了。当在市场上寻找一份工作的时候,即使是最资深的IT专家都需要记住一些他们在很久以前就学到的规则,并且同时采用一些新的策略。
数据库管理员市场可以按照以多种方式分为两个部分——初级和高级。
Don Burleson,位于美国北卡罗来纳州Kittrell的BEI Oracle顾问公司的所有者,说,那些工作经验少于3年的初级数据库管理员,经常会面临失业和低等的工作市场。Burleson曾写过与Oracle技术和职业生涯有关的17本书,其中包括《Oracle工作面试指导(Conducting the Oracle Job Interview)》,这本书是为那些需要评估Oracle周围候选人的IT经理们准备的指南。
“过去,许多公司都不会雇佣初学者,” Burleson说。
然而,Burleson说,那些初级数据库管理员仍然是有希望的。那些不愿意花12万美元年薪雇佣经验丰富的专家的公司有时候会雇佣这些新手并对他们进行培训。Burleson建议那些新入门的数据库管理员可以到体检行业和大学这两个地方去找到他们的第一份工作。
政府安全检查对资深人员很关键
然后就是资深人士。那些拥有超过10年经验的,拥有高级学位,并且具有专业技能的数据库管理员仍然有很大的需求量。
Oracle财务知识,SAP,PeopleSoft, 9i RAC, 9iAS 和 Unix都是重要的能力,Burleson说。还有,政府安全调查是在第一轮的简历挑选中排除许多Oracle数据库管理员的一项。另外,开发技能,例如Java,Windows,J2EE和门户,都是候选人具有竞争力的优势。
更重要的是,Reames说,候选人的技能需要与公司的需要相匹配。“他们真的需要拥有全面技能,” Reames说。
“如果工作需要的是能够进行数据建模的人,”她说,“并且我没有在简历中看见任何的数据建模经验,那么我就会对这个人大打折扣。”
除了专业技能之外,Burleson说,许多的公司都愿意要那些有教育背景的人,倾向于雇佣那些拥有研究生学位或者MBA的候选人。公司认为那些懂得财务或者会计,具有数据库管理员支持的业务过程知识的数据库管理员有价值。
打跟进电话,第一轮面试
对于两个群体,要通过关键的第一轮面试都有一些基本的规则需要遵守。
今早地投递简历是有帮助的。如果有120份简历需要阅读的话,Reames也许不会把所有简历都读完就找到了达到面试要求,具有足够特点的候选人。
候选人应该给招聘人员打电话确认他们的简历被收到了,她说。“不要害怕打跟进电话,” Reames说。“这会带给你一个优势,否则我们可能就不会看你的简历。”
通过第一轮筛选的申请人通常是在电话中面试。记住面试你的人也许没有任何技术背景,这一点很重要,Burleson说。在这一点上,是对候选人从技术之外的其他品质上进行判断。专家说,此时沟通技巧非常重要。
因为沟通技巧在工作中是如此的重要,Burleson推荐候选人提供给潜在的雇主写作样例,尤其是那些得到发表的。有几个在线网站,包括这一个,都接受技术贴士投稿,他指出。
实际的技术对话
少数能够通过电话面试的候选人能够到工作地点去进行面试,Burleson称之为候选人的技术化。他建议面试人员提出一些专业的问题,例如“Oracle中的SYS用户默认密码是多少?”
这些问题没有捏造的答案,面试人员可以轻松地判断候选人的技术能力。“只有那些实践过的数据库管理员知道答案是‘change_on_install,’” Burleson说。“经验丰富的数据库管理员可以立即发现谎话。”
然后就是最后一个阶段,与公司的IT人员在线会见。这些会见通常会持续半天,这是真正在测试你是否会被雇佣。有时候是一些开放的问题,例如“如果一个终端用户抱怨性能差劲,你要做的第一件事情是什么?”这些问题的答案非常具有启发性,Burleson说,因为他们也没有正确答案,他们只是看看候选人是如何独立思考的,或者是数据库管理员有多少创新思维。
也许更重要的是,这个最后的交流就是判断一些无形的,例如人际关系技巧的过程。拥有一个能够成为团队中一员的数据库管理员对于大多数公司(即使不是所有的公司)来说都是优先考虑的。在很多情况下 ,这些无形的东西形成了差别。
“我见过公司拒绝了技术能力最强的候选人。这样的事情总是发生,” Burleson指出。“数据库管理员需要与其他人打好关系。”
最后,Burleson说,忘掉星期五可以穿便装的习惯。
“面试中穿得太随便是对自己的极度不负责,”他说。
“外表确实重要。”
整理了几个Oracle面试中的技术问题,各位可以借鉴一下:
1.解释冷备份和热备份的不同点以及各自的优点
解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库性能会比归档模式稍好。(因为不必将archive log写入硬盘)
2.你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?
解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。
3.如何转换init.ora到spfile?
解答:使用create spfile from pfile 命令.
4.解释data block , extent 和 segment的区别(这里建议用英文术语)
解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment.
5.给出两个检查表结构的方法
解答:1.DESCRIBE命令
2.DBMS_METADATA.GET_DDL 包
6.怎样查看数据库引擎的报错
解答:alert log.
评价:这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度。
Oracle DBA 问题记录
1.select执行时oracle内部的过程
分析:其中包括语法分析、语义分析、视图转换、表达式转换、选择优化器、选择连接方式、选择连接顺序、选择数据搜索路径等等,然后在SGA中的共享SQL区中找是否执行过该语句,如找到则直接执行已编译的SQL语句,如没有找到,则先编译后放入SGA,并执行编译后的SQL语句。
执行:在执行编译过的SQL语句时,先在SGA中的数据库缓冲区内查找是否存在所需要的数据,如有直接读取,如果没有,则从物理文件中读取至数据库缓冲区并读取。
返回结果:对SELECT 语句需要返回结果的语句,先看是否需要排序,需要,则排序后返回给用户,然后根据内存的大小不同,可以一次取出一行数据,也可以一次取一组数据。
2.热备份导致非一致性解决方法
使用热备份会导致备份的数据具有非一致性,在Oracle提供的RMAN工具中可以依靠联机重做日志解决恢复备份时导致的非一致性。
3.热备份所备份文件
数据库文件
日志文件
控制文件
参数文件
口令文件
网络参数文件
4.数据库中的最小读写操做以什么为单位
Oracleblock是Oracle数据库中读写操作的最小单元。一个Oracleblock由三个部分组成,分别是数据块头、自由空间、实际数据三部份组成。
数据块头:主要包含有数据块地址的一些基本信息和段的类型,以及表和包含有数据的实际行的地址。
自由空间:是指可以为以后的更新和插入操作分配的空间,大小由PCTFREE和PCTUSED两个参数影响。
实际数据:是指在行内存储的实际数据。
当创建或者更改任何表和索引的时候,Oracle在空间控制方面使用两个存储参数:PCTFREE: 为将来更新已经存在的数据预留空间的百分比。PCTUSED:用于为插入一新行数据的最小空间的百分比。这个值决定了块的可用状态。可用的块时可以执行插入的块,不可用状态的块只能执行删除和修改,可用状态的块被放在freelist中。
5.数据库的两种连接模式
1.专用服务器连接(dedicated server)
在专用服务器模式下,优点就是每个用户都有一个连接,所以大家不至于有的应用占着连接造成别的客户的请求给挂起了。而最大的缺点在于内存管理上。
2.共享服务器连接(shared server)
而共享连接方式优点在于连接数量固定,所以内存数量不会占用很多。共享服务器的最大的缺点还是在于数据仓库模式下运行的时候,如果有大量的请求需要长时间占用服务器,那么就会造成很多别的请求的挂起,导致整个服务器性能的降低。
6.oracle服务器的体系结构
oracle系统体系结构由实例、逻辑结构和物理结构组成。
1.实例:SGA、系统监视SMON、进程监视PMON、数据库写入器DBWn、日志写入器LGWR、检查点CKPT等进程组成。
2.逻辑结构:主要由:表空间、段、区和数据块等概念组成。逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系
3.物理结构:主要是数据库文件,包括控制文件、重做日志文件、数据文件等等。
7.RAC实际应用群集
RAC允许不同计算机上的多个实例打开共享磁盘系统上的一个或多个公用数据库,它极大地提高了数据库的性能、容错和可伸缩性。多对多的架构也可用较低的价格扩展数据库规模。
8.Linux启动过程
poweron --BIOS自检--LILO/GRUB调用---KERNEL 调用--INIT 调用---MIGGETTY--LOGIN
9.Linux决定开机后是否进入GUI界面的配置文件名
在UNIX/Linux中一般将运行级别分为7级(一说九级,但实际应用为六级,保留一级):
0 系统停机
1 单用户模式
2 多用户模式
3 网络多用户模式
4 保留
5 X11模式(即进入图形界面模式)
6 重起
系统将其设置在/etc/inittab配置文件中:
id:3:initdefault:
10.oracle调整工具
1.STATSPACK:通过Statspack我们可以很容易的确定Oracle数据库的瓶颈所在,记录数据库性能状态。
2.SQL Tuning:SQL Tuning Advisor用一个调整工具集作为输入,检查其中的语句并为它们提出优化建议。
11.Date Guard
Oracle9i Data Guard 通过使用称为standby database的数据库来防止出现数据的灾难。它通过将primary database数据库的重做日志传到并应用到standby database数据库来使standby database数据库与primary database数据库同步。
OracleStandby Database 是最经常使用的最有效的灾难解决方案。在过去版本的基础上,Oracle9i 又进行了许多改进,使其功能远远超过了基本的灾难恢复要求。通过将复杂的工作自动化,并对监控、警告、以及控制机制的大规模改进,Standby Database 和一些新的模块可以帮助DBA从错误操作、瘫痪、以及其它的灾难中恢复(这些灾难都可能毁掉数据库)。另外,通过使用Oracle9i Standby Database,由于硬件和软件升级造成的宕机时间也可以极度缩短。
Oracle9i 将改进过的8版本的Standby Database功能,与几个新增加的防止用户错误和瘫痪的模块合起来称为Oracle9i Data Guard。
oracle 存储过程的基本语法
oracle 存储过程的基本语法
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...
3.IF 判断
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4.while 循环
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5.变量赋值
V_TEST := 123;
6.用for in 使用cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;
7.带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(变量值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
8.用pl/sql developer debug
连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
关于oracle存储过程的若干问题备忘
1.在oracle中,数据表别名不能加as,如:
select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧
2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译
select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation
Error: PLS-00428: an INTO clause is expected in this SELECT statement
3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...
4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行
select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 运行阶段报错,提示
ORA-01422:exact fetch returns more than requested number of rows
5.在存储过程中,关于出现null的问题
假设有一个表A,定义如下:
create table A(
id varchar2(50) primary key not null,
vcount number(8) not null,
bid varchar2(50) not null -- 外键
);
如果在存储过程中,使用如下语句:
select sum(vcount) into fcount from A where bid=''xxxxxx'';
如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
if fcount is null then
fcount:=0;
end if;
这样就一切ok了。
6.Hibernate调用oracle存储过程
this.pnumberManager.getHibernateTemplate().execute(
new HibernateCallback() ...{
public Object doInHibernate(Session session)
throws HibernateException, SQLException ...{
CallableStatement cs = session
.connection()
.prepareCall("{call modifyapppnumber_remain(?)}");
cs.setString(1, foundationid);
cs.execute();
return null;
}
});
ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多。
一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。
select ... from ... for update; 是2的锁。
当对话使用for update子串打开一个游标时,
所有返回集中的数据行都将处于行级(Row-X)独占式锁定,
其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。
insert / update / delete ... ; 是3的锁。
没有commit之前插入同样的一条记录会没有反应,
因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
创建索引的时候也会产生3,4级别的锁。
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作,
但DDL(alter,drop等)操作会提示ora-00054错误。
有主外键约束时 update / delete ... ; 可能会产生4,5的锁。
DDL语句时是6的锁。
以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:
select object_id,session_id,locked_mode from v$locked_object;
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
如果有长期出现的一列,可能是没有释放的锁。
我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
alter system kill session 'sid,serial#';
如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
当你采用的是直接连接数据库的方式,
也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,
因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。
记得在数据库级别用alter system kill session 'sid,serial#';杀掉不正常的锁。
Oracle DBA有关回滚段管理试题精选
Q. 1 : What system privilege is required to create a rollback segment ?
1. Create database
2. Create rollback segment
3. Alter database
4. Create segment
KEY:2
Q. 2 : Oracle recommends this number of minimum extents in a rollback segment
1. 0
2. 1
3. 2
4. 3
KEY:3
Q. 3 : Oracle recommends that the following segment size when creating a rollback segment
1. INITIAL > NEXT
2. INITIAL = NEXT
3. INITIAL < NEXT
4. NONE OF THE ABOVE
KEY:2
Q. 4 : The OPTIMAL parameter for a rollback segment should be set
1. large for long-frequently running transactions, small for short transactions.
2. small for long-frequently running transactions, large for small transactions.
3. small for all transactions
4. large for all transactions
KEY:1
Q. 5 : In case of system failure, This type of segment is used to undo the changes
1. Data Segment
2. Temp Segment
3. Redo Segment
4. Rollback Segment
KEY:4 : Rollback Segments are used to rollback information that has already been applied to database. During recovery, the database is rolled forward and then backwards to a consistent state.
Q. 6 : This is a valid storage parameter when creating a rollback segment
1. FREELISTS
2. OPTIMAL
3. PARTITION
4. NONE OF THE ABOVE
KEY:2
Q. 7 : Madhu created a couple of private rollback segments. What should he do now to make them online automatically during startup
1. Grant online during startup to the segments
2. Add rollback_segments=(rbs1,rbs2) in parameter file
3. Drop segments and recreate them as protected
4. None of the above
KEY:2
Q. 8 : Which is true regarding rollback segments
1. System Rollback Segment Cannot be put in an offline mode
2. Tablespaces containing rollback segments with active transactions can be put in offline mode
3. All of the above
4. None of the above
KEY:1
Q. 9 : A rollback segment ____
1. writes to the redo logs
2. requires one for each tablespace
3. records changes only after they are committed
4. provides for read consistency
KEY:4
Q. 10 : Which type of segment can record changes for multiple transactions
1. DATA SEGMENT
2. TEMP SEGMENT
3. ROLLBACK
4. NONE OF THE ABOVE
KEY:3
Q. 11 : The type of rollback segment that is created when a tablespace goes offline is
1. PRIVATE
2. PUBLIC
3. DEFFERED
4. PROTECTED
KEY:3
如何快速的成为一个合格的Oracle DBA?
作者:eygle
链接:http://www.eygle.com/archives/2008/11/become_dba_quickly.html
在这样一个清晨写下这样一个题目,是因为最近有越来越多的人问起我这个问题,我想还是试着把我的想法写下来。
1.快速有多快?
很多人都喜欢寻找捷径,所以经常问起快速,但是我经常反复告诉大家的是,没有捷径,或者说没有轻而易举的捷径可循。
当然快速两个字也是有意义的,这是这个快速的社会对于年轻人的要求,在《深入解析Oracle》一书的序言中,我写过这样一段话:随着技术以及时代的不断进步,社会留给DBA的成长时间越来越短,一个DBA从入门到成长为资深的时间不会超过2年。。。。张爱玲说过,成名要趁早。做技术的也是如此,成长越早越好,越快越好。
理解快速两个字的涵义,推荐仔细阅读我的《深入解析Oracle》一书序言,这里总结了很多我的学习经验和学习历程:
http://www.eygle.com/archives/2008/11/oracle_internals_preface.html
2.该读什么书?
Oracle方面的书籍无疑已经是汗牛充栋了,那么在杂陈的书籍中,我们该读什么书来入门?该读什么书来深入进阶呢?
我曾经推荐了几本书,并且我的观点是:书不在多,精读则灵。所以,认真细致的阅读对于学习是必不可少的。
等你进入了Oracle的大门,然后怎么阅读,读什么,就完全可以自己把握了。
推荐阅读:书不在多,精读则灵 - Oracle入门书籍推荐
http://www.eygle.com/archives/2006/08/oracle_fundbook_recommand.html
3.如何获得成功?
无疑每个人都热切的期待成功,那么如何才能获得成功?
我曾经总结了一个简单的公式,罗列了我认为及其重要的成功因素:兴趣 + 勤奋 + 坚持 + 方法 ≈ 成功
如果你对数据库感兴趣,由兴趣推动学习,再加上勤奋的努力,坚持不懈的探索,找到合适的方法,那么这就是你的快速学习之路,快速成功之路。
推荐阅读:
http://www.eygle.com/archives/2005/12/what_kind_of_dba_we_need.html
4.三种境界
关于境界,我在多篇文章中都谈到过,最早在《Oracle数据库性能优化》一书的序言中我引用了王国维的三种境界:
古今之成大事业、大学问者,罔不经过三种之境界。
"昨夜西风凋碧树。独上高楼,望尽天涯路。"此第一境界也。
"衣带渐宽终不悔,为伊消得人憔悴。"此第二境界也。
"众里寻他千百度,蓦然回首,那人却在灯火阑珊处。"此第三境界也。
这三种境界分别代表了,打下坚实的基础,不懈的坚持,峰回路转的提升,你在学习过程中,一定会面对这样的阶段和情形,所以要有一定的思想准备,坚持不懈。
推荐阅读:
http://www.eygle.com/archives/2005/08/ecinieoracleouo.html
5.由点及面、深入浅出
在学习方法上,我主张由点及面、深入浅出,在《深入浅出Oracle》一书的序言中,我这样写道:
书中贯彻的也是我一直主张的"由点到线再及面"的学习方法。特别是对于初学者,如果没有经过专门的培训和系统学习,那么自己通过实践的学习和思考就应当深入,在知识上,从某个角度来说,是"不患寡,而患不精深"。在我们遇到问题时,就应该不断深入研究,直至问题的核心本质,这样通过一个案例或实际问题的诊断学习和研究,我们就可以带动很多连带知识的学习,这样从一个点深入下去就形成一条线,再横向扩展就可以形成一个知识网,解决和研究的问题多了,就可以逐渐覆盖一个面,形成一个知识体系,这样慢慢的你就会觉得学习不再困难,而是一件得心应手的事情。
推荐阅读:
http://www.eygle.com/archives/2008/10/sbsoracle_preface.html
6.工作机会
在工作选择上,如果能够快速进入Oracle的领域可能是幸运的,但是如果第一份工作没有找到理想的位置,那么接下来的职业道路可能就会稍微曲折一些。
很多朋友在进行了一段时间的学习之后,对转型迫不及待甚至焦虑不堪,这是不对的,在工作中应当切忌浮躁,我们每个人从毕业到工作、再到找到适合自己的位置,这通常都要经过一个较长的时期,学习、思考、进步、再次出发,所以要知道有时候等待是过程的必须。
如果你手上已经有了一份工作,那你需要做的是,做好它,哪怕那不是你喜欢的!
你必须证明给别人看你有做好一件事情的能力,别人才会给你下一个机会,如果你从来没能很好的完成一项任务,那你应该冷静的反省一下。
对于处在这样境地的朋友们,我有16个字可供借鉴:去除浮躁,认真学习,不断积累,寻找机遇
推荐阅读:
http://www.eygle.com/archives/2008/06/oracle_and_dba.html
7.如何在有限的环境中学习?
很多朋友的工作环境、条件有限,可能没有小型机、可能没有UNIX,那么如何学习和提高呢?
我想说的是不一定要在多大的生产环境里才能锻炼出高手。据我所知很多高手都是从个人的简单环境中学习成长起来的,最重要的是自己学习一定要深入,多思考,多试验。
有朋友说:小库一样练水平。这句话是很有道理的。也有朋友在ITPUB上不断试验和重复别人有价值的试验或测试,说:不是自己的,通过试验动手,变成自己的。也说得非常好。
oracle笔记(DBA管理)
1、通常oracle需要启动OracleServiceORCL,OracleStartORCL,OracleTNSListener 任务
在NT上至少要启动两个服务
oraclestartID和oracleserverID
每个数据库都有一个系统标识符(SID),典型安装的数据库使用的系统标识符是ORCL
2、启动关闭数据库
关闭:
svrmgr>connect internal/oracle
>shutdown --正常关闭数据库
svrmgr>shutdown immediate --立即关闭数据库
svrmgr>shutdown abort --一种最直接的关闭数据库的方式,执行之后,重新启动需要花6-8小时
启动:
svrmgr>startup --正常启动
--等价于:startup nomount;
alter database mount;
alter database open;
svrmgr>startup mount; --安装启动:用于改变数据库的归档或执行恢复状态
svrmgr>startup nomount; --用于重建控制文件或重建数据库
svrmgr>startup restrict; --约束启动,能启动数据库,但只允许具有一定特权的用户访问
如果希望改变这种状态,连接成功后
alter system disable restricted session;
svrmgr>startup force;当不能关闭数据库时,可采用强制启动数据库来完成数据库的关闭操作。
svrmgr>startup pfile=d:\orant\database\initorcl.ora --带初始化参数文件的启动
3、缺省用户和密码
<1>. Oracle安装完成后的初始口令?
internal/oracle
sys/change_on_install
system/manager
scott/tiger
sysman/oem_temp
<2>. ORACLE9IAS WEB CACHE的初始默认用户和密码?
administrator/administrator
4、让定义自己的回滚段生效
在initorcl.ora中加入rollback_segments=(rb0,rb1,...)
其中rb0,rb1为自己定义的回滚段,可使这些回滚段在启动时生效
5、查看修改数据库的字符集
<1>数据库服务器字符集
在表props$中
update props$ set value$='ZHS16CGB231280'
where name ='NLS_CHARACTERSET'
然后重新启动数据库,而不需要重新安装
8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误。
Startup nomount;
Alter database mount exclusive;
Alter system enable restricted session;
Alter system set job_queue_process=0;
Alter database open;
Alter database character set zhs16gbk;
sql> show parameter NLS
查看数据库字符集:
SELECT * FROM NLS_DATABASE_PARAMETERS;
SELECT * FROM V$NLS_PARAMETERS;
<2>
客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
<3> 有时候用crontab发起的时候,由于执行的shell脚本的不同,导致很多的环境变量不同。常常看到插入到数据库中的汉字变成乱码。
比如shell脚本cai.sh如下内容。
#!/bin/ksh
export ORACLE_BASE=/u01/oracle/app/oracle
export ORACLE_HOME=${ORACLE_BASE}/product/9.2.0
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:$LD_LIBRARY_PATH
export SHLIB_PATH=$ORACLE_HOME/lib32:$ORACLE_HOME/rdbms/lib32:/app/prepay/lib
/u01/oracle/app/oracle/product/9.2.0/bin/sqlplus aicbs/aicbs@busi_cs commit; quit ! 在crontab中定时每天20:19执行一次 19 20 * * * /bin/sh /app/prepay/cai.sh >/dev/null 2>&1 & 则可以看到数据库中数据变成了: 2LQSJY 当前数据库的字符集是 SELECT * FROM NLS_DATABASE_PARAMETERS AMERICAN.ZHS16GBK 为了正常,必须保持客户端和数据库一致的字符集 改脚本如下即可 #!/bin/ksh export ORACLE_BASE=/u01/oracle/app/oracle export ORACLE_HOME=${ORACLE_BASE}/product/9.2.0 export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:$LD_LIBRARY_PATH export SHLIB_PATH=$ORACLE_HOME/lib32:$ORACLE_HOME/rdbms/lib32:/app/prepay/lib ####下面就是增加的 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK /u01/oracle/app/oracle/product/9.2.0/bin/sqlplus aicbs/aicbs@busi_cs commit; quit ! 6、svgmgr>show sga 7、查询锁的原因 如果进程被死锁,可以按下面方式查询 <1> 从v$session或者v$locked_object找到此session <2> 如果有lockwait,查询v$lock, select * from v$lock where kaddr = 'C00000024AB87210' 如果没有,根据sid select * from v$lock where sid = 438 <3> 查看v$lock lmode > 0,表示已经得到此锁 request > 0 表示正在请求此锁 根据id1和id2的值可以判断请求哪个锁的释放。 select * from v$lock where id1=134132 and id2 = 31431 8. 查询锁的状况的对象 V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ; 查询锁的表的方法: SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')', S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2 FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ; 9. 怎样查得数据库的SID ? select name from v$database; 也可以直接查看 init.ora文件 10、管理回滚段: 存放事务的恢复信息 建立回滚段 create public rollback segment SEG_NAME tabelspace TABLESPACE_NAME; alter rollback segment SEG_NAME online; 删除回滚段 首先改变为offline状态 直接使用回滚段 sql>set transaction use rollback segment SEG_NAME; 11. 计算一个表占用的空间的大小 select owner,table_name, NUM_ROWS, BLOCKS*AAA/1024/1024 "Size M", EMPTY_BLOCKS, LAST_ANALYZED from dba_tables where table_name='XXX'; Here: AAA is the value of db_block_size ; XXX is the table name you want to check 12. 表在表空间中的存储情况 select segment_name,sum(bytes),count(*) ext_quan from dba_extents where tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name; 13. 索引在表空间中的存储情况 select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&owner' group by segment_name; 14.查看某表/索引的大小 表 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&table_name'); 索引 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&index_name'); 15、确定可用空间 select tablespace_name,sum(blocks),sum(bytes) from sys.dba_free_space group by tablespace_name; 16、程序中报错:maxinum cursor exceed! <1> 查看当前的open cursor参数 sql> show parameter open_cursors <2> 如果确实很小,应该调整数据库初始化文件 加如一项 open_cursors=200 <3> 如果很大,则 select sid,sql_text,count(*) from v$open_cursor group by sid,sql_text having count(*) > 200 其中200是随便写一个比较大的值。查询得到打开太多的cursor. 17、查看数据库的版本信息 SQL> select * from v$version; 包含版本信息,核心版本信息,位数信息(32位或64位)等 至于位数信息,在linux/unix平台上,可以通过file查看,如 file $ORACLE_HOME/bin/oracle 18. 查看最大会话数 SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%'; SQL> SQL> show parameter processes NAME TYPE VALUE ------------------------------------ ------- ------------------------------ aq_tm_processes integer 1 db_writer_processes integer 1 job_queue_processes integer 4 log_archive_max_processes integer 1 processes integer 200 这里为200个用户。 select * from v$license; 其中sessions_highwater纪录曾经到达的最大会话数 19. 以archivelog的方式运行oracle。 init.ora log_archive_start = true RESTART DATABASE 20. unix 下调整数据库的时间 su -root date -u 08010000 21.P4电脑的安装方法 将SYMCJIT.DLL改为SYSMCJIT.OLD 22. 如何查询SERVER是不是OPS? SELECT * FROM V$OPTION; 如果PARALLEL SERVER=TRUE则有OPS能 23. 查询每个用户的权限 SELECT * FROM DBA_SYS_PRIVS; 24.将表/索引移动表空间 ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME; ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME; 25.在LINUX,UNIX下启动DBA STUDIO? OEMAPP DBASTUDIO 26.LINUX下查询磁盘竞争状况命令? Sar -d 27.LINUX下查询磁盘CPU竞争状况命令? sar -r 28. 查询表空间信息? SELECT * FROM DBA_DATA_FILES; 29. 看各个表空间占用磁盘情况: SQL> col tablespace format a20 SQL> select b.file_id 文件ID号, b.tablespace_name 表空间名, b.bytes 字节数, (b.bytes-sum(nvl(a.bytes,0))) 已使用, sum(nvl(a.bytes,0)) 剩余空间, sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比 from dba_free_space a,dba_data_files b where a.file_id=b.file_id group by b.tablespace_name,b.file_id,b.bytes order by b.file_id 30. 如把ORACLE设置为MTS或专用模式? #dispatchers="(PROTOCOL=TCP) (SERVICE=SIDXDB)" 加上就是MTS,注释就是专用模式,SID是指你的实例名。 31. 如何才能得知系统当前的SCN号 ? select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe; 32. 修改oracel数据库的默认日期 alter session set nls_date_format='yyyymmddhh24miss'; OR 可以在init.ora中加上一行 nls_date_format='yyyymmddhh24miss' 33. 将小表放入keep池中 alter table xxx storage(buffer_pool keep); 34. 如何检查是否安装了某个patch? check that oraInventory 35. 如何修改oracle数据库的用户连接数? 修改initSID.ora,将process加大,重启数据库. 36. 如何创建SPFILE? SQL> connect / as sysdba SQL> select * from v$version; SQL> create pfile from spfile; SQL> CREATE SPFILE FROM PFILE='E:\ora9i\admin\eygle\pfile\init.ora'; 文件已创建。 SQL> CREATE SPFILE='E:\ora9i\database\SPFILEEYGLE.ORA' FROM PFILE='E:\ora9i\admin\eygle\pfile\init.ora'; 文件已创建。 37. 内核参数的应用 shmmax 含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。 设置方法:0.5*物理内存 例子:Set shmsys:shminfo_shmmax=10485760 shmmin 含义:共享内存的最小大小。 设置方法:一般都设置成为1。 例子:Set shmsys:shminfo_shmmin=1: shmmni 含义:系统中共享内存段的最大个数。 例子:Set shmsys:shminfo_shmmni=100 shmseg 含义:每个用户进程可以使用的最多的共享内存段的数目。 例子:Set shmsys:shminfo_shmseg=20: semmni 含义:系统中semaphore identifierer的最大个数。 设置方法:把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最大的那个processes的那个值加10。 例子:Set semsys:seminfo_semmni=100 semmns 含义:系统中emaphores的最大个数。 设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的processes的值的总和(除去最大的Processes参数)+最大的那个Processes×2+10×Oracle实例的个数。 例子:Set semsys:seminfo_semmns=200 semmsl: 含义:一个set中semaphore的最大个数。 设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。 例子:Set semsys:seminfo_semmsl=-200 38. 怎样查看哪些用户拥有SYSDBA、SYSOPER权限? SQL>conn sys/change_on_install SQL>select * from V_$PWFILE_USERS; 39. 如何查看数据文件放置的路径 ? col file_name format a50 SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id; 40. 如何查看现有回滚段及其状态 ? SQL> col segment format a30 SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS 41. Oracle常用系统文件有哪些? 通过以下视图显示这些文件信息:v$database,v$datafile,v$logfile v$controlfile v$parameter; 42.查看数据库实例 SQL>SELECT * FROM V$INSTANCE; 43. 怎样估算SQL执行的I/O数 ? SQL>SET AUTOTRACE ON ; SQL>SELECT * FROM TABLE; OR SQL>SELECT * FROM v$filestat ; 可以查看IO数 44. 怎样扩大REDO LOG的大小? 建立一个临时的redolog组,然后切换日志,删除以前的日志,建立新的日志。 45. 查询做比较大的排序的进程? <1> SELECT b.tablespace, b.segfile#, b.segblk#, b.blocks, a.sid, a.serial#, a.username, a.osuser, a.status FROM v$session a,v$sort_usage b WHERE a.saddr = b.session_addr ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks ; <2>. 查询做比较大的排序的进程的SQL语句 select /*+ ORDERED */ sql_text from v$sqltext a where a.hash_value = ( select sql_hash_value from v$session b where b.sid = &sid and b.serial# = &serial) order by piece asc ; 46. ORA-01555 SNAPSHOT TOO OLD的解决办法 增加MINEXTENTS的值,增加区的大小,设置一个高的OPTIMAL值。 如果是执行大的事务,报此错误,说明oracle给此事务随机分配的回滚段太小了,这时可以为它指定一个足够大的回滚段,以确保这个事务的成功执行.例如 set transaction use rollback segment roll_abc; delete from table_name where ... commit; 回滚段roll_abc被指定给这个delete事务,commit命令则在事务结束之后取消了回滚段的指定. 47. 事务要求的回滚段空间不够,表现为表空间用满(ORA-01560错误),回滚段扩展到达参数 MAXEXTENTS的值(ORA-01628)的解决办法. 向回滚段表空间添加文件或使已有的文件变大;增加MAXEXTENTS的值。 48. 监控事例的等待 select event,sum(decode(wait_Time,0,0,1)) "Prev", sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot" from v$session_Wait group by event order by 4; 49. 回滚段的争用情况 select name, waits, gets, waits/gets "Ratio" from v$rollstat C, v$rollname D where C.usn = D.usn; 50 监控表空间的 I/O 比例 select B.tablespace_name name,B.file_name "file",A.phyrds pyr, A.phyblkrd pbr,A.phywrts pyw, A.phyblkwrt pbw from v$filestat A, dba_data_files B where A.file# = B.file_id order by B.tablespace_name; 51、监控文件系统的 I/O 比例 select substr(C.file#,1,2) "#", substr(C.name,1,30) "Name", C.status, C.bytes, D.phyrds, D.phywrts from v$datafile C, v$filestat D where C.file# = D.file#; 52、监控 SGA 的命中率 select a.value + b.value "logical_reads", c.value "phys_reads", round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO" from v$sysstat a, v$sysstat b, v$sysstat c where a.statistic# = 38 and b.statistic# = 39 and c.statistic# = 40; 53、监控 SGA 中字典缓冲区的命中率 select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio", (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" from v$rowcache where gets+getmisses <>0 group by parameter, gets, getmisses; 54、监控 SGA 中共享缓存区的命中率,应该小于1% select sum(pins) "Total Pins", sum(reloads) "Total Reloads", sum(reloads)/sum(pins) *100 libcache from v$librarycache; select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent" from v$librarycache; 55、显示所有数据库对象的类别和大小 select count(name) num_instances ,type ,sum(source_size) source_size , sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size, sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required from dba_object_size group by type order by 2; 56、监控 SGA 中重做日志缓存区的命中率,应该小于1% SELECT name, gets, misses, immediate_gets, immediate_misses, Decode(gets,0,0,misses/gets*100) ratio1, Decode(immediate_gets+immediate_misses,0,0, immediate_misses/(immediate_gets+immediate_misses)*100) ratio2 FROM v$latch WHERE name IN ('redo allocation', 'redo copy'); 57、监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)'); 58、监控当前数据库谁在运行什么SQL语句? SELECT osuser, username, sql_text from v$session a, v$sqltext b where a.sql_address =b.address order by address, piece; 59、监控字典缓冲区? SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE; SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE; SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE; 后者除以前者,此比率小于1%,接近0%为好。 SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES" FROM V$ROWCACHE 60、监控 MTS select busy/(busy+idle) "shared servers busy" from v$dispatcher; 此值大于0.5时,参数需加大 select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher'; select count(*) from v$dispatcher; select servers_highwater from v$mts; servers_highwater接近mts_max_servers时,参数需加大 61、查看碎片程度高的表? SELECT segment_name table_name , COUNT(*) extents FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name); 62、如何知道使用CPU多的用户session? 11是cpu used by this session select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc; 63.如何检查操作系统是否存在IO的问题 使用的工具有sar,这是一个比较通用的工具。 #sar -u 2 10 即每隔2秒检察一次,共执行20次,当然这些都由你决定了。 示例返回: HP-UX hpn2 B.11.00 U 9000/800 08/05/03 18:26:32 %usr %sys %wio %idle 18:26:34 80 9 12 0 18:26:36 78 11 11 0 18:26:38 78 9 13 1 18:26:40 81 10 9 1 18:26:42 75 10 14 0 18:26:44 76 8 15 0 18:26:46 80 9 10 1 18:26:48 78 11 11 0 18:26:50 79 10 10 0 18:26:52 81 10 9 0 Average 79 10 11 0 其中的%usr指的是用户进程使用的cpu资源的百分比, %sys指的是系统资源使用cpu资源的百分比, %wio指的是等待io完成的百分比,这是值得我们观注的一项, %idle即空闲的百分比。如果wio列的值很大,如在35%以上,说明你的系统的IO存在瓶颈,你的CPU花费了很大的时间去等待IO的完成。 Idle很小说明系统CPU很忙。像我的这个示例,可以看到wio平均值为11说明io没什么特别的问题,而我的idle值为零,说明我的cpu已经满负荷运行了。 64.关注一下内存。 常用的工具便是vmstat,对于hp-unix来说可以用glance,Aix来说可以用topas,当你发现vmstat中pi列非零,memory 中的free列的值很小,glance,topas中内存的利用率多于80%时,这时说明你的内存方面应该调节一下了,方法大体有以下几项。 a.划给Oracle使用的内存不要超过系统内存的1/2,一般保在系统内存的40%为益。 b.为系统增加内存 c.如果你的连接特别多,可以使用MTS的方式 d.打全补丁,防止内存漏洞。 65、查找前十条性能差的sql. SELECT * FROM ( SELECT PARSING_USER_ID EXECUTIONS, SORTS, COMMAND_TYPE, DISK_READS, sql_text FROM v$sqlarea ORDER BY disk_reads DESC ) WHERE ROWNUM<10 ; 66、查看占io较大的正在运行的session SELECT se.sid, se.serial#, pr.SPID, se.username, se.status, se.terminal, se.program, se.MODULE, se.sql_address, st.event, st.p1text, si.physical_reads, si.block_changes FROM v$session se, v$session_wait st, v$sess_io si, v$process pr WHERE st.sid=se.sid AND st.sid=si.sid AND se.PADDR=pr.ADDR AND se.sid>6 AND st.wait_time=0 AND st.event NOT LIKE '%SQL%' ORDER BY physical_reads DESC 对检索出的结果的几点说明: <1> 我是按每个正在等待的session已经发生的物理读排的序,因为它与实际的IO相关。 <2> 你可以看一下这些等待的进程都在忙什么,语句是否合理? Select sql_address from v$session where sid=; Select * from v$sqltext where address=; 执行以上两个语句便可以得到这个session的语句。 你也以用alter system kill session 'sid,serial#';把这个session杀掉。 <3> 应观注一下event这列,这是我们调优的关键一列,下面对常出现的event做以简要的说明: a、buffer busy waits,free buffer waits这两个参数所标识是dbwr是否够用的问题,与IO很大相关的,当v$session_wait中的free buffer wait的条目很小或没有的时侯,说明你的系统的dbwr进程决对够用,不用调整;free buffer wait的条目很多,你的系统感觉起来一定很慢,这时说明你的dbwr已经不够用了,它产生的wio已经成为你的数据库性能的瓶颈,这时的解决办法如下: a.1增加写进程,同时要调整db_block_lru_latches参数 示例:修改或添加如下两个参数 db_writer_processes=4 db_block_lru_latches=8 a.2开异步IO,IBM这方面简单得多,hp则麻烦一些,可以与Hp工程师联系。 b、db file sequential read,指的是顺序读,即全表扫描,这也是我们应该尽量减少的部分,解决方法就是使用索引、sql调优,同时可以增大db_file_multiblock_read_count这个参数。 c、db file scattered read,这个参数指的是通过索引来读取,同样可以通过增加db_file_multiblock_read_count这个参数来提高性能。 d、latch free,与栓相关的了,需要专门调节。 e、其他参数可以不特别观注。 67. 文件说明 <1>监听器日志文件 以8I为例 $ORACLE_HOME/NETWORK/LOG/LISTENER.LOG <2>. 监听器参数文件 以8I为例 $ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA <3>. TNS 连接文件 以8I为例 $ORACLE_HOME/NETWORK/ADMIN/TNSNAMES.ORA <4>. Sql*Net 环境文件 以8I为例 $ORACLE_HOME/NETWORK/ADMIN/SQLNET.ORA <5>. 警告日志文件 以8I为例 $ORACLE_HOME/ADMIN/SID/BDUMP/SIDALRT.LOG <6>. 基本结构 以8I为例 $ORACLE_HOME/RDBMS/ADMIN/STANDARD.SQL <7>. 建立数据字典视图 以8I为例 $ORACLE_HOME/RDBMS/ADMIN/CATALOG.SQL <8>.建立审计用数据字典视图 以8I为例 $ORACLE_HOME/RDBMS/ADMIN/CATAUDIT.SQL <9>. 建立快照用数据字典视图 以8I为例 $ORACLE_HOME/RDBMS/ADMIN/CATSNAP.SQL Oracle DBA笔试题参考答案 一:SQL tuning 类 1、列举几种表连接方式 答:hash join/merge join/nest loop(cluster join)/index join 解析:Hash join的主要资源消耗在于CPU(在内存中创建临时的hash表,并进行hash计算),而merge join的资源消耗主要在于此盘IO(扫描表或索引)。在并行系统中,hash join对CPU的消耗更加明显。所以在CPU紧张时,最好限制使用hash join。 在绝大多数情况下,hash join效率比其他join方式效率更高: 在Sort-Merge Join(SMJ),两张表的数据都需要先做排序,然后做merge。因此效率相对最差; Nested-Loop Join(NL)效率比SMJ更高。特别是当驱动表的数据量很大(集的势高)时。这样可以并行扫描内表。 Hash join效率最高,因为只要对两张表扫描一次。 2、不借助第三方工具,怎样查看sql的执行计划 程序代码 set autot on explain plan set statement_id = &item_id for &sql; select * from table(dbms_xplan.display); 3、如何使用CBO,CBO与RULE的区别 在optimizer_mode=choose时,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBO。RBO遵循简单的分级方法学,使用 15种级别要点,当接收到查询,优化器将评估使用到的要点数目, 然后选择最佳级别(最少的数量)的执行路径来运行查询。 CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同 的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。 4、如何定位重要(消耗资源多)的SQL 答:根据v$sqlarea 中的逻辑读/disk_read。以及寻找CPU使用过量的session,查出当前session的当前SQL语句,或者:监控WIN平台Oracle的运行 程序代码 select sql_text from v$sql where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 30000); 5、如何跟踪某个session的SQL 程序代码 exec dbms_system.set_sql_trace_in_session(sid,serial#,&sql_trace); select sid,serial# from v$session where sid = (select sid from v$mystat where rownum = 1); exec dbms_system.set_ev(&sid,&serial#,&event_10046,&level_12,''); 6、SQL调整最关注的是什么 答:逻辑读,IO量;查看该SQL的response time(db block gets/consistent gets/physical reads/sorts (disk)) 7、说说你对索引的认识(索引的结构、对dml影响、为什么提高查询性能) 答:默认的索引是b-tree. 对insert的影响.(分裂,要保证tree的平衡) 对delete的影响.(删除行的时候要标记改节点为删除). 对update的影响,如果更新表中的索引字段,则要相应的更新索引中的键值。 查询中包含索引字段的键值和行的物理地址 b-tree index/bitmap index/function index/patitional index(local/global) 索引通常能提高select/update/delete的性能,会降低insert的速度。 8、使用索引查询一定能提高查询的性能吗?为什么 索引就是为了提高查询性能而存在的, 如果在查询中索引没有提高性能, 只能说是用错了索引,或者讲是场合不同 9、绑定变量是什么?绑定变量有什么优缺点? 答:通俗的说,绑定变量就是变量的一个占位符,使用绑定变量可以减少只有变量值不同的语句的解析。绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bind value在运行时传递,然后绑定执行。优点是减少硬解析,降低CPU的争用,节省shared_pool ;缺点是不能使用histogram,sql优化比较困难 10、如何稳定(固定)执行计划 答:使用stored outline。 程序代码 query_rewrite_enabled = true star_transformation_enabled = true optimizer_features_enable = 9.2.0 创建并使用stored outline oracle can automatically create outlines for all SQL statements, or you can create them for specific SQL statements. In either case, the outlines derive their input from the optimizer.oracle creates stored outlines automatically when you set the initialization parameter Create_STORED_OUTLINES to true. When activated, oracle creates outlines for all compiled SQL statements. You can create stored outlines for specific statements using the Create OUTLINE statement. 11:和排序相关的内存在8i和9i分别怎样调整,临时表空间的作用是什么 Oracle 8i中sort_area_size/sort_area_retained_size决定了排序所需要的内存 如果排序操作不能在 sort_area_size中完成,就会用到temp表空间 Oracle 9i中如果workarea_size_policy=auto时, 排序在pga内进行,通常pga_aggregate_target的1/20可以用来进行disk sort; 如果workarea_size_policy=manual时,排序需要的内存由sort_area_size决定 在执行order by/group by/distinct/union/create index/index rebuild/minus等操作时, 如果在pga或sort_area_size中不能完成,排序将在临时表空间进行(disk sort), 临时表空间主要作用就是完成系统中的disk sort. 12:存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql 程序代码 create table t(a number(,b number(,c number(,d number(); / begin for i in 1 .. 300 loop insert into t values(mod(i,2),i/2,dbms_random.value(1,300),i/4); end loop; end; / select * from (select c.*,rownum as rn from (select * from t order by c desc) c) where rn between 21 and 30; / select * from (select * from test order by c desc) x where rownum < 30 minus select * from (select * from test order by c desc) y where rownum < 20 order by 3 desc 相比之 minus性能较差 11、和排序相关的内存在8i和9i分别怎样调整,临时表空间的作用是什么? 答:8i:使用sort_area_size,hash_area_size,每个session分配相同的值,不管有无使用。 9i: 使用pga_aggregate来统一管理。 临时表空间的作用: 在sort_area_size中不能完成的部分在临时表空间完成,临时表空间在重建索引,创建临时表等都要用到。还有hash join不能完成的也在临时表空间中做。 12、存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql select a,b,c,d from (select a,b,c,d from T order by c) where rownum<=30 minus select a,b,c,d from (select a,b,c,d from T order by c) where rownum <=20; 或者: select * from (select rownum rn,a.* from (select a,b,c,d from T order by c) a )where rn between 21 and 30; 二:数据库基本概念类 1、pctused and pctfree 表示什么含义有什么作用 答:表示数据块什么时候移入和移出freelist。 pctused:如果数据块的使用率小于pctused的值,则该数据块重新加入到fresslist中。 pctfree:如果数据块的使用率高于pctfree的值,则该数据块从freelist中移出。 2、简单描述table / segment / extent / block之间的关系 答:一个table至少是一个segment,如果分区表,则每个分区是一个segment,table可以看成是一个逻辑上的概念,segment可以看成是这个逻辑概念的物理实现; segment由一个或多个extents组成,segment不可以跨表空间但可以跨数据文件; extent由多个连续的blocks组成,不可以跨数据文件; block由1-多个os块组成,是oracle i/o的最小存储单位。 3、描述tablespace和datafile之间的关系 答:tablespace是逻辑上的概念,datafile是物理上的概念。 一个tablespace可以由多个datafile组成,一个datafile不能跨越多个tablespace。 4、本地管理表空间和字典管理表空间的特点,ASSM有什么特点 答:一个使用freelist管理,一个使用位图管理。 5、回滚段的作用是什么 答:保存数据的前像,保证数据读取的时间点一致性。Oracle里数据的多版本特性就是通过回滚段来实现的,正因为此,Oracle数据库实现了读写不竞争的性能优势! 6、日志的作用是什么 答:纪录对数据库的操作,便与恢复。 7、SGA主要有那些部分,主要作用是什么 答:db_cache(缓存数据块),shared_pool(缓存sql,执行计划,数据字典信息等),large_pool(MTS模式、parallel 、rman等要用到),java pool(java程序如SQLJ存储过程运行时要用到) 8、racle系统进程主要有哪些,作用是什么 答:smon(合并空间,实例恢复),pmon(清理失败的进程),归档进程(负责在日志切换的时候归档日志文件),lgmr(日志书写器进程,负责写日志),ckpt(检查点进程,触发检查点),dbwr(数据库写入器,负责把数据写入导datafile) 三:备份恢复类 1、备份如何分类 答:逻辑备份(exp)与物理备份。 或者冷备份与热备份。 2、归档是什么含义 答:把日志文件放到另一个地方。 3、如果一个表在2004-08-04 10:30:00 被drop,在有完善的归档和备份的情况下,如何恢复 答:拷贝备份, recover database until time 2004-08-04 10:30:00 alter database open resetlogs; 4、rman是什么,有何特点 答:rman叫恢复管理器. 特点很多。可以在线备份,到少目标数据库是mount状态。 1:热备份。 2:可以存储脚本。 3:可以增量备份。 4:自动管理备份集。 5、standby的特点 答:利用传输重做日志来达到同步的目的。可以设定多个保护级别,9i后支持逻辑standbyDB。 6、对于一个要求恢复时间比较短的系统(数据库50G,每天归档5G),你如何设计备份策略 答:每天一个全备份。 四:系统管理类 1、对于一个存在系统性能的系统,说出你的诊断处理思路 答:做一个statspack,根据top 5,system load,top sql等来做相应的调整。 2、列举几种诊断IO、CPU、性能状况的方法 答:hp-unix:iostat -x 1 5; top/vmstat/glance 3、对statspack有何认识 答:一个性能诊断工具而已,其本质就是在两个时间点采样两个系统数据。(动态性能视图),然后根据两个snapshot,产生一个报告。 4、如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响 答:1:增大sort_area_size(8i)/pga_aggregate_target(9i)值。 2:如果表有分区(一般大表都要用到分区的),按分区逐个建索引,如果是本地索引的话; 3:系统空闲的时候建。 5、对raid10 和raid5有何认识 答:raid10是先镜像后条带,适合对写入速度要求较高的数据库系统,特别是online redolog文件,raid5适合大部分的数据库系统和数据仓库系统,读性能优于写性能。 五:综合随意类 1、你最擅长的是oracle哪部分? 答:性能/sql 调优、备份恢复。 2、喜欢oracle吗?喜欢上论坛吗?或者偏好oracle的哪一部分? 答:http://www.itpub.net/,Oracle的SQL 优化。 3、随意说说你觉得oracle最有意思的部分或者最困难的部分 答:SQL调优,最困难的是Oracle的网络管理,Oracle的Connect Manager没用过。 4、为何要选择做DBA呢? 答:爱好加职业历史积累。 5、如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响 答: 1.增大sort_area_size(8i)/pga_aggregate_target(9i)值。 2.用并行的方式来建。 3.系统空闲的时候建。 六:其他 什么是聚集索引,什么是非聚集索引,什么又是主键? 聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。 非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。 能够唯一表示数据表中的每个记录的字段或者字段的组合就称为主键,通过它可强制表的实体完整性。 1、事务是什么? 答:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。 2、oracle中truncate和delete命令有何区别? 答: (1)delete将在回滚段中产生回滚信息,truncate不产生,因此无论表中的记录多少,truncate执行都很快。 (2)truncate 是 DDL,执行隐含的commit,truncate不能回滚。任何没有提交的 DML 改变也将会和truncate一起提交。 (3)truncate 重置表及其索引高水位标志。全表扫描和索引快速全扫描读高水位标志下的所有数据块,因此在delete后全扫描性能没有提高,但truncate后将会变快。 (4)truncate 不触发 delete 触发器。 (5)没有对象权限允许一个用户 truncate 另一个用户的表。这样做需要 DROP ANY TABLE 系统权限。 (6)当一个表被 truncate,表及其索引的存储将被重置回初始大小。而 delete 不收缩表及其索引的大小。 (7)当父表有一个可用的引用完整性约束时不能被 truncate。必须先disable引用父表的外键约束,再truncate。 3、Oracle中char和varchar2数据类型有什么区别?有数据”test”分别存放到char(10)和varchar2(10)类型的字段中,其存储长度及类型有何区别? 答:char是定长字符类型,varchar2是变长字符类型。“test”在char(10)中被补齐空格,存储长度是10字节,在varchar2(10)中存储长度是4字节。 数据技术求职点评:Oracle DBA面试题 IT工作市场是如此的紧张,每个可获得的职位都有一堆人在申请。Naveen Nahata为Oracle E-Business Suite的数据库管理员申请者提供了以下一些面试时的技术问题,它可以帮助申请者们快速脱颖而出。如果你的面试官有类似的问题问你,发个邮件给我,我将会把它添加在列表中。――编者按 问题 1如果信息采集管理系统(ICM)崩溃了怎么办? 2你如何加速打补丁的过程? 3打补丁的过程中出错了,你怎么办? 4请提供克隆过程和克隆之后采取的手工操作的大概步骤。 5介绍一下AutoConfig。AutoConfig是如何知道XML文件中的哪个树脂需要被放入哪一个文件的? 6你能告诉我,你对一个发生故障的自服务登录问题做哪些测试吗?你要检查哪个配置文件操作选项和文件? 7如果你不能看到并发管理日志和输出文件,是哪里出错了? 8你是如何更改并发管理日志和输出文件的位置的? 9如果用户正遇到性能方面的问题,你如何找到问题的原因? 10你如何更改应用程序的密码? 11请写出DBC文件的位置,并且解释它的重要性和应用程序如何知道DBC文件名? 答案 1所有其他的管理器都会继续工作。ICM只会处理队列控制请求,意思是开启和关闭其他并发的管理器。 2 2.1你可以合并多个补丁。 2.2你可以为一个非交互的补丁创建一个响应文件。 2.3你可以通过选项(nocompiledb, nomaintainmrc, nocompilejsp)来应用补丁,并且在应用了所有的补丁之后,一次运行它们。 3 查看失败工作的日志,找到并且纠正错误,用adctrl 工具重新开启工作。 4在源文件上(所有层)运行pre-clone,使用RMAN复制数据库(或者从热或者冷备份中重新存储数据库),拷贝文件系统,然后在目标文件(所有层)上运行post-clone 。 手工步骤(可能会更多): 4.1改变所有的非网站配置选项数值(快速克隆的话,只改变网站级别的配置文件选项)。 4.2 修改工作流和并发管理器表。 ?.3更改打印机。 5 AutoConfig 使用了一个上下文文件来维护关键的配置文件。一个上下文文件就是一个XML文件,在$APPL_TOP/admin 目录下,进行集中式的存储。 当你运行AutoConfig 的时候,它读取XML文件,并且创建所有的AutoConfig 管理配置文件。 对于AutoConfig维护的每个配置文件,都存在一个临时文件来判断哪个数值是从哪个XML文件中得来的。 6 6.1检查DBC文件中的guest的用户名和密码,配置选项guest的用户名和密码、数据库。 6.2查看apache/jserv是否启动了。 6.3运行IsItWorking, FND_WEB.PING, aoljtest等。 7很有可能是FNDFS监听器停止了。看看FND_CONCURRENT_REQUESTS 表中的OUTFILE_NODE_NAME 和 LOGFILE_NODE_NAME 的数值。看看FND_NODES 表。看看tnsnames.ora 中的FNDFS_ entry 。 8日志问卷爱女的位置是由$APPLCSF/$APPLLOG 参数来决定的,输出文件的位置是由$APPLCSF/$APPLOUT 决定的。 9 9.1追踪这个会话(用等待)并且使用tkprof 来分析追踪文件。 9.2生成statspack 报告并进行分析。 9.3使用top/iostat/sar/vmstat 监控O/s 。 9.4通过ping这类基本的测试结果来判断网络的瓶颈。 10 10.1 使用FNDCPASS 来更改APPS密码。 10.2 手工修改wdbsvr.app/cgiCMD.dat 文件。 10.3 更改所有从其他环境指过来的数据库链接。 11 11.1位置:$FND_TOP/secure Directory 11.2 重要性:在其他事务中指向数据库服务器。 11.3 应用程序通过使用“Applications Database Id.”来了解DBC文件的名字。 oracle dba 面试题 数据库切换日志的时候,为什么一定要发生检查点?这个检查点有什么意义? 表空间管理方式有哪几种,各有什么优劣。 本地索引与全局索引的差别与适用情况。 一个表a varchar2(1),b number(1),c char(2),有100000条记录,创建B-Tree索引在字段a上,那么表与索引谁大?为什么? 9i的data guard有几种模式,各有什么差别。 执行计划是什么,查看执行计划一般有哪几种方式。 简单描述一下nest loop与hash join的差别。 db file sequential read与db file scattered read等待的差别,如果以上等待比较多,证明了什么问题? library cache pin与library cache lock是什么地方的等待事件,一般说明什么问题? 在一个24*7的应用上,需要把一个访问量很大的1000万以上数据级别的表的普通索引(a,b)修改成唯一约束(a,b,c),你一般会选择怎么做,请说出具体的操作步骤与语句。 如果一个linux上的oracle数据库系统突然变慢,你一般从哪里去查找原因。 说明一下对raid5与raid01/10的认识。 列举5个10g的新特性 ORACLE DBA面试题集 一:SQL tuning 类 1 列举几种表连接方式 等连接、非等连接、自连接、外连接(左、右、全) 2 不借助第三方工具,怎样查看sql的执行计划 I) 使用Explain Plan,查询PLAN_TABLE; EXPLAIN PLAN SET STATEMENT_ID='QUERY1' FOR SELECT * FROM a WHERE aa=1; SELECT operation, options, object_name, object_type, ID, parent_id FROM plan_table WHERE STATEMENT_ID = 'QUERY1' ORDER BY ID; II)SQLPLUS中的SET TRACE 即可看到Execution Plan Statistics SET AUTOTRACE ON; 3:如何使用CBO,CBO与RULE的区别 IF 初始化参数 OPTIMIZER_MODE = CHOOSE THEN --(8I DEFAULT) IF 做过表分析 THEN 优化器 Optimizer=CBO(COST); /*高效*/ ELSE 优化器 Optimizer=RBO(RULE); /*高效*/ END IF; END IF; 区别: RBO根据规则选择最佳执行路径来运行查询。 CBO根据表统计找到最低成本的访问数据的方法确定执行计划。 使用CBO需要注意: I) 需要经常对表进行ANALYZE命令进行分析统计; II) 需要稳定执行计划; III)需要使用提示(Hint); 使用RULE需要注意: I) 选择最有效率的表名顺序 II) 优化SQL的写法; 4 如何定位重要(消耗资源多)的SQL 使用CPU多的用户session SELECT a.SID, spid, status, SUBSTR (a.program, 1, 40) prog, a.terminal,a.SQL_TEXT, osuser, VALUE / 60 / 100 VALUE FROM v$session a, v$process b, v$sesstat c WHERE c.statistic# = 12 AND c.SID = a.SID AND a.paddr = b.addr ORDER BY VALUE DESC; 5 如何跟踪某个session的SQL 利用TRACE 跟踪 ALTER SESSION SET SQLTRACE ON; COLUMN SQL format a200; SELECT machine, sql_text SQL FROM v$sqltext a, v$session b WHERE address = sql_address AND machine = '&A' ORDER BY hash_value, piece; 6 SQL调整最关注的是什么 检查系统的I/O问题 sar-d能检查整个系统的iostat(IO statistics) 7 说说你对索引的认识(索引的结构、对dml影响、对查询影响、为什么提高查询性能) l 索引有B-TREE、BIT、CLUSTER等类型。ORACLE使用了一个复杂的自平衡B-tree结构; l 通常来说,在表上建立恰当的索引,查询时会改进查询性能。但在进行插入、删除、修改时,同时会进行索引的修改,在性能上有一定的影响。 l 有索引且查询条件能使用索引时,数据库会先度取索引,根据索引内容和查询条件,查询出ROWID,再根据ROWID取出需要的数据。由于索引内容通常比全表内容要少很多,因此通过先读索引,能减少I/O,提高查询性能。 8 使用索引查询一定能提高查询的性能吗?为什么 l 通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价. n 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, n 索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢. l 使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况: n 基于一个范围的检索,一般查询返回结果集小于表中记录数的30%宜采用; n 基于非唯一性索引的检索 9 绑定变量是什么?绑定变量有什么优缺点? l 绑定变量是指在SQL语句中使用变量,改变变量的值来改变SQL语句的执行结果。 l 优点:使用绑定变量,可以减少SQL语句的解析,能减少数据库引擎消耗在SQL语句解析上的资源。提高了编程效率和可靠性。减少访问数据库的次数, 就能实际上减少ORACLE的工作量。 l 缺点:经常需要使用动态SQL的写法,由于参数的不同,可能SQL的执行效率不同; 10 如何稳定(固定)执行计划 可以在SQL语句中指定执行计划。使用HINTS; 11 和排序相关的内存在8i和9i分别怎样调整,临时表空间的作用是什么 SORT_AREA_SIZE 在进行排序操作时,如果排序的内容太多,内存里不能全部放下,则需要进行外部排序, 此时需要利用临时表空间来存放排序的中间结果。 12 存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql SELECT * FROM (SELECT ROWNUM AS row_num, tmp_tab.* FROM (SELECT a, b, c, d FROM T ORDER BY c) tmp_tab WHERE ROWNUM <= 30) WHERE row_num >= 20 ORDER BY row_num; 二:数据库基本概念类 1 Pctused and pctfree 表示什么含义有什么作用 pctused与pctfree控制数据块是否出现在freelist中, pctfree控制数据块中保留用于update的空间,当数据块中的free space小于pctfree设置的空间时, 该数据块从freelist中去掉,当块由于dml操作free space大于pct_used设置的空间时,该数据库块将 被添加在freelist链表中。 2 简单描述tablespace / segment / extent / block之间的关系 n tablespace : 一个数据库划分为一个或多个逻辑单位,该逻辑单位成为表空间;每一个表空间可能包含一个或多个 Segment; n Segments : Segment指在tablespace中为特定逻辑存储结构分配的空间。每一个段是由一个或多个extent组成。包括数据段、索引段、回滚段和临时段。 n Extents : 一个 extent 由一系列连续的 Oracle blocks组成.ORACLE为通过extent 来给segment分配空间。 n Data Blocks :Oracle 数据库最小的I/O存储单位,一个data block对应一个或多个分配给data file的操作系统块。 3 描述tablespace和datafile之间的关系 ◎ 一个表空间可包含一个或多个数据文件。 ◎ 表空间利用增加或扩展数据文件扩大表空间,表空间的大小为组成该表空间的数据文件大小的和。 ◎ 一个datafile只能属于一个表空间; 4 本地管理表空间和字典管理表空间的特点,ASSM有什么特点 n 本地管理表空间:(9i默认) n 空闲块列表存储在表空间的数据文件头。 n 特点:减少数据字典表的竞争,当分配和收缩空间时会产生回滚,不需要合并 n 字典管理的表空间:(8i默认) n 空闲块列表存储在数据库中的字典表里. n 特点:片由数据字典管理,可能造成字典表的争用。存储在表空间的每一个段都会有不同的存储字句,需要合并相邻的块; 5 回滚段的作用是什么 回滚段用于保存数据修改前的映象,这些信息用于生成读一致性数据库信息、在数据库恢复和Rollback时使用。一个事务只能使用一个回滚段。 6 日志的作用是什么 日志文件(Log File)记录所有对数据库数据的修改,主要是保护数据库以防止故障,以及恢复数据时使用。其特点如下: a)每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员。 b)日志文件组以循环方式进行写操作。 c)每一个日志文件成员对应一个物理文件。 7 SGA主要有那些部分,主要作用是什么 系统全局区(SGA):是ORACLE为实例分配的一组共享缓冲存储区,用于存放数据库数据和控制信息,以实现对数据库数据的管理和操作。 SGA主要包括: u a)共享池(shared pool) :用来存储最近执行的SQL语句和最近使用的数据字典的数据。 u b)数据缓冲区 (database buffer cache):用来存储最近从数据文件中读写过的数据。 u c)重作日志缓冲区(redo log buffer):用来记录服务或后台进程对数据库的操作。 另外在SGA中还有两个可选的内存结构: u d)Java pool: 用来存储Java代码。 u e)Large pool: 用来存储不与SQL直接相关的大型内存结构。备份、恢复使用。 8 Oracle系统进程主要有哪些,作用是什么 u 数据写进程(DBWR):负责将更改的数据从数据库缓冲区高速缓存写入数据文件 u 日志写进程(LGWR):将重做日志缓冲区中的更改写入在线重做日志文件 u 系统监控 (SMON): 检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复 u 进程监控 (PMON): 负责在一个Oracle 进程失败时清理资源 u 检查点进程(CKPT):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。 u 归档进程 (ARCH):在每次日志切换时把已满的日志组进行备份或归档 u 恢复进程 (RECO): 保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback; u 作业调度器(CJQ ): 负责将调度与执行系统中已定义好的job,完成一些预定义的工作. 三:备份恢复类 1 备份如何分类 n 物理备份 u 物理备份是最主要的备份方式。用于保证数据库在最小的数据库丢失或没有数据丢失的情况下得到恢复。 n 冷物理 u 冷物理备份提供了最简单和最直接的方法保护数据库因物理损坏丢失。建议在以下几种情况中使用。 u 对一个已经存在大最数据量的数据库,在晚间数据库可以关闭,此时应用冷物理备份。 u 对需对数据库服务器进行升级,(如更换硬盘),此时需要备份数据库信息,并在新的硬盘中恢复这些数据信息,建议采用冷物理备份。 n 热物理 u 主要是指备份过程在数据库打开并且用户可以使用的情况下进行。需要执行热物理备份的情况有: u 由于数据库性质要求不间断工作,因而此时只能采用热物理备份。 u 由于备份的要求的时间过长,而数据库只能短时间关闭时。 n 逻辑备份 (EXP/IMP) u 逻辑备份用于实现数据库对象的恢复。但不是基于时间点可完全恢复的备份策略。只能作为联机备份和脱机备份的一种补充。 n 完全逻辑备份 u 完全逻辑备份是将整个数据库导出到一个数据库的格式文件中,该文件可以在不同的数据库版本、操作系统和硬件平台之间进行移植。 n 指定表的逻辑备份 u 通过备份工具,可以将指定的数据库表备份出来,这可以避免完全逻辑备份所带来的时间和财力上的浪费。 2 归档是什么含义 n 归档是归档当前的联机redo日志文件。 n SVRMGR> alter system archive log current; n 数据库只有运行在ARCHIVELOG模式下,并且能够进行自动归档,才可以进行联机备份。有了联机备份才有可能进行完全恢复。 3 如果一个表在2004-08-04 10:30:00 被drop,在有完善的归档和备份的情况下,如何恢复 I) 9i 新增的FLASH BACK 应该可以; II) Logminer应该可以找出DML。 III)有完善的归档和备份,先归档当前数据,然后可以先恢复到删除的时间点之前,把DROP 的表导出来,然后再恢复到最后归档时间; 不过,我没试过,都是理论的说!! 4 rman是什么,有何特点 n RMAN可以用来备份和还原数据库文件、归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。 n RMAN启动数据库上的Oracle服务器进程来进行备份或还原。备份、还原、恢复是由这些进程驱动的。 n 注意:RMAN不能用于备份初始化参数文件和口令文件。 具有如下特点: n 功能类似物理备份,但比物理备份强大N倍; n 可以压缩空块; n 可以在块水平上实现增量; n 可以把备份的输出打包成备份集,也可以按固定大小分割备份集; n 备份与恢复的过程可以自动管理; n 可以使用脚本(存在Recovery catalog 中) n 可以做坏块监测 5 standby的特点 备用数据库(standby database):ORACLE推出的一种高可用性(HIGH AVAILABLE)数据库方案, 在主节点与备用节点间通过日志同步来保证数据的同步,备用节点作为主节点的备份 可以实现快速切换与灾难性恢复,从920开始,还开始支持物理与逻辑备用服务器。 9i中的三种数据保护模式分别是: n MAXIMIZE PROTECTION :最大数据保护与无数据分歧,LGWR将同时传送到备用节点, u 在主节点事务确认之前,备用节点也必须完全收到日志数据。如果网络不好,引起LGWR不能传送数据,将引起严重的性能问题,导致主节点DOWN机。 n MAXIMIZE AVAILABILITY :无数据丢失模式,允许数据分歧,允许异步传送。 u 正常情况下运行在最大保护模式,在主节点与备用节点的网络断开或连接不正常时,自动切换到最大性能模式, u 主节点的操作还是可以继续的。在网络不好的情况下有较大的性能影响。 n MAXIMIZE PERFORMANCE:这种模式应当可以说是从8i继承过来的备用服务器模式,异步传送, u 无数据同步检查,可能丢失数据,但是能获得主节点的最大性能。9i在配置DATA GUARD的时候默认就是MAXIMIZE PERFORMANCE 没实践过,只是把答案列出来。 6 对于一个要求恢复时间比较短的系统(数据库50G,每天归档5G),你如何设计备份策略 数据库比较大逻辑备份没什么必要,每天归档5G,每周三/周六自动归档10G,每月RMAN归档全库。 应该有standby。 我对备份和恢复缺少实践机会,JUST PAPER。 四:系统管理类 1 对于一个存在系统性能的系统,说出你的诊断处理思路 I) 做statspack收集系统相关信息 了解系统大致情况/确定是否存在参数设置不合适的地方/查看top 5 event/查看top sql等 II) 查v$system_event/v$session_event/v$session_wait 从v$system_event开始,确定需要什么资源(db file sequential read)等 深入研究v$session_event,确定等待事件涉及的会话 III)从v$session_wait确定详细的资源争用情况 通过v$sql/v$sqltext/v$sqlarea表确定disk_reads、(buffer_gets/executions)值较大的SQL 2 列举几种诊断IO、CPU、性能状况的方法 top uptime vmstat iostat statspack sql_trace/tkprof 查v$system_event/v$session_event/v$session_wait 查v$sqlarea(disk_reads或buffer_gets/executions较大的SQL) 或者第三方的监视工具,TOAD就不错。 3 对statspack有何认识 认识不深。仅限了解。StapSpack是Oracle公司提供的一个收集数据库运行性能指标的软件包。 可以做数据库健康检查报告。 4 如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响 可以先表分析一下,然后测试创建索引前后对应用的性能影响; 需要考虑的是该索引列不经常更新,不是有很多重复值的情况时, 在大表中使用索引特别有效. 创建的索引可以跟数据表分不同表空间存储。 5 对raid10 和raid5有何认识 几乎不懂。没配过磁盘阵列 五:综合随意类 1 你最擅长的是oracle哪部分? pl/sql及sql优化 2 喜欢oracle吗?喜欢上论坛吗?或者偏好oracle的哪一部分? 喜欢。PL/SQL比较得心应手。 3 随意说说你觉得oracle最有意思的部分或者最困难的部分 我对数据库的备份/恢复和性能调优经验明显不足,自然觉得有些困难。 基于ORACLE的研究应该是个宽广的领域,所以我觉得还是有意思的。 4 为何要选择做DBA呢? 我对数据库的备份/恢复和性能调优经验明显不足,主要是缺乏环境和交流。 因此,算不上什么DBA。不过因此我更需要这样的机会。 不过就整个ORACLE 来说,一直从事与它相关的工作,感情还是颇深的。放弃可惜。而且就技术本身而言我觉得自己还是有学习和创新的能力,它的诸如数据仓库,数据挖掘之类的领域也很广。 一份DBA的面试题 ORACLE 笔试 选择题 (在正确的答案前打勾) 1, 下面哪一个选项不属于调优目标的 A,共享应用代码 B,减少用户对资源的等待 C,为没有剩余空间的表空间添加数据文件 D,减少IO操作 2, 数据库报警日志文件的位置 A, user_dump_dest参数指定的位置 B, alert_dump_dest参数指定的位置 C, archive_log_dest 参数指定的位置 D, background_dump_dest 参数指定的位置 3, 下列哪两种方法可以用来设置会话跟踪 A, 使用dbms_system.set_sql_trace_in_session 过程 B, 通过alter session set sql_trace=true C, 使用 dbms_session.set_sql_trace_in_session 过程 D, 通过alter session set log_checkpoints_to_alert=true 4, 下列哪些视图是数据字典视图 A, v$sysstat B, dba_objects C, dba_tables D, dba_indexes 5, 下列哪个视图可以获取数据库的启动时间 A, v$database B, v$sesstat C, v$lock D, v$instance 6, 对于v$session 视图叙述正确的是 A, 可以通过此视图查询出一个会话的sid、serial# B, 可以直接通过此视图查询出此会话的机器的IP地址 C, 可以通过此视图查询出一个会话的登陆数据库的时间 D, 可以通过此视图查询出用户通过什么程序连接数据库 7, 关于statspack,下列哪个说法是错误的 A, statspack是一个数据库性能诊断工具 B, 使用statspack时需要将参数timed_statistics设置为true C, statspack在使用时最少需要执行2次statspack..snap D, statspack在建库时,自动被创建。 8, 下列哪些语句属于DML语句 A, select count(*) from dba_tables; B, create table test (a number); C, alter table test nologging; D, delete from test; 9, 在sql的执行过程中,哪一步进行共享池的分配 A, Create a Cursor 创建游标 B, Parse the Statement 分析语句 C, Bind Any Variables 绑定变量 D, Parallelize the Statement 并行执行语句 10, 在sql的书写过程中,使用绑定变量的主要作用 A, 共享SQL B, 增加sql的执行速度 C, 改变执行计划 D, 增加sql的可读性 11, 关于优化器的说法正确的是 A, oracle主要提供了2种优化器:基于规则的优化器(rule)和基于花费的优化器(cost) B, 基于规则的优化器通过访问路径的优先等级,来决定执行计划 C, 基于花费的优化器,通过IO,CPU, 网络情况,来选择资源消耗最少的执行计划 D, oracle9i中,基于花费的优化器不需要统计信息 12, 下列哪种数据访问路径最快 A, Table Access by ROWID B, index unique scan C, index range scan D, index full scan E, index fast full scan 13, 下列哪种连接方式是需要连接的两个行源是有序的 A, 合并连接 B, 嵌套循环 C, 哈希连接 D, 笛卡儿积 14, 下列关于索引描述正确的是 A, 所有的索引都不包含null值 B, b*tree 索引的高度越高越好 C, 只要是取值范围都不好的列,就可以建立bitmap索引 D, 索引可以在线rebuild,而不影响对于表的dml操作 15, 关于索引不能被使用,可能的原因有 A, where子句没有包含被索引的列 B, 表或索引的统计信息错误 C, where子句的索引列上存在隐含数据类型转换 D, 返回的行源很多 E, 使用了 like ’%???%’ 16, 关于函数索引说法错误的是 A, 使用函数索引需要QUERY REWRITE权限 B, 使用函数索引需要GLOBAL QUERY REWRITE 权限 C, 可用通过函数索引来实现只索引某些行数据的目的 D, 函数索引很适合oltp系统 17, view this SELECT statement: 1. SELECT department, MAX(salary) 2. FROM employee 3. WHERE department IN(200, 300, 400) and 4. MAX(salary)>60000 5. GROUP BY department; Which line in the statement causes error? A. 1 B. 3 C. 4 D. 5 18, Which three commands cause a transaction to end? A. ALTER B. GRANT C. DELETE D. INSERT E. UPDATE F. ROLLBACK 简答题 1,ORACLE的静态结构包含哪些类型的文件? 2,TRACE文件有哪些种类?一般存放在什么地方? 3,ORACLE的主要内存结构有哪些? 软件代码区:用于存储正在执行的或可以执行的程序代码 系统全局区(SGA):一组由ORACLE分配的共享的内存结构,可包含一个数据库实例的数据或控制信息 程序全局区(PGA):一个内存区,包含单个进程的数据和控制信息 排序区:ORACLE利用该内存排序数据 4,REDO LOG的作用是什么,如果REDO LOG故障如何修复? 重做日志(Redo Log)也称作事务日志( Transaction Log),Oracle在这些特殊的操作系统文件中记录针对数据库进行的修改操作或事务,数据库系统可以使用这些事务记录进行恢复操作。 检查v$session_wait视图,我们可以从中看到很多session处于log file switch (checkpoint incomplete) 的等待; 检查DBWR进程。 5,回滚段的主要作用是什么,如何优化回滚段?如何增加回滚段的大小?回滚段是线状结构还是环状结构? 当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。 增加回滚段可以加大回滚段所适应的表空间: alter database datafile ‘..\*.dbf’resize xxM 6,共享池的主要作用是什么?设置共享池要注意些什么?共享池过大有什么不好? 7,UPDATE较多的表,设置存储参数的时候应该注意什么? 8,PGA的工作区域如何配置? 9,如何进行SQL优化? 10, 表之间的关联方法有哪些? 11、How would you edit your CRONTAB to schedule the running of /test/test.sh to run every other day at 2PM? 12、How do you increase the OS limitation for open files (LINUX and/or Solaris)? 13. Explain how you would restore a database using RMAN to Point in Time? 14.What view(s) do you use to associate a user's SQLPLUS session with his o/s process? 15 What are the commands you'd issue to show the explain plan for "select * from dual"? 16. In which dictionary table or view would you look to determine at which time a snapshot or MVIEW last successfully refreshed? 17. How would you best determine why your MVIEW couldn't FAST REFRESH? 18. How does propagation differ between Advanced Replication and Snapshot Replication (readonly)? 19. Which dictionary view(s) would you first look at to understand or get a high-level idea of a given Advanced Replication environment? 20. Database crashes. Corruption is found scattered among the file system neither of your doing nor of Oracle's. What database recovery options are available? Database is in archive log mode. DBA面试题 Changed job recently. Interviewed two DBA positions. Here are some questions. Very basic. 1)Describe the procedure of a "update" statement. e.g UPDATE emp SET sal = 40000 Where empno= 12345; What will happen internally? 2)What's difference between Sort-merge join, nested-loop and hash join? Write down some statements and compare their efficiency 3)What's difference between Differential backup level 0 and level 1? 4)Describe a procedure that you recovered a crashed database. What command did you use? What's difference between restore and recovery? 5)Show the strategy when you tune a performance problem. Give us an example. 6)Describe the difference between data guard physical standby and logical standby. 7)Describe the procedure to set up a ASM disk 8)Do you know RAC? Tell us sth about RAC. and some basic questions e.g 1)List some types of segment 2)compare bitmap and B-tree index? 3)ORA-01555 That's all I can remember. Hope it is helpful to all.