简答题1. Oracle中锁的兼容性是什么样的?
常见SQL语句的锁兼容情况见下表。
SQL语句
|
行级锁模式
|
表级锁模式
|
是否允许锁操作?
|
RS(2)
|
RX(3)
|
S(4)
|
SRX(5)
|
X(6)
|
SELECT...FROM table...
|
|
NULL
|
Y
|
Y
|
Y
|
Y
|
Y
|
INSERT INTO table...
|
X
|
RX
|
Y
|
Y
|
N
|
N
|
N
|
INSERT/*+APPEND*/INTO table...
|
X
|
X
|
N
|
N
|
N
|
N
|
N
|
UPDATE table...
|
X
|
RX
|
Y*
|
Y*
|
N
|
N
|
N
|
DELETE FROM table...
|
X
|
RX
|
Y*
|
Y*
|
N
|
N
|
N
|
SELECT...FROM table FOR UPDATE(OF)...
|
X
|
RX(Oracle 9i是RS)
|
Y*
|
Y*
|
Y*
|
Y*
|
N
|
LOCK TABLE table IN ROW SHARE MODE
|
|
RS
|
Y
|
Y
|
Y
|
Y
|
N
|
LOCK TABLE table IN SHARE UPDATE MODE
|
|
RS
|
Y
|
Y
|
Y
|
Y
|
N
|
LOCK TABLE table IN ROW EXCLUSIVE MODE
|
|
RX
|
Y
|
Y
|
N
|
N
|
N
|
LOCK TABLE table IN SHARE MODE
|
|
S
|
Y
|
N
|
Y
|
N
|
N
|
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE
|
|
SRX
|
Y
|
N
|
N
|
N
|
N
|
LOCK TABLE table IN EXCLUSIVE MODE
|
|
X
|
N
|
N
|
N
|
N
|
N
|
注:Y*表示当不与其他事务的行级锁冲突时才允许,否则将产生等待。
|
锁之间的兼容模式见下表。
|
Held/Get
|
Null(1)
|
RS(2)
|
RX(3)
|
S(4)
|
SSX(5)
|
X(6)
|
0、1
|
none、Null
|
√
|
√
|
√
|
√
|
√
|
√
|
2
|
RS
|
√
|
√
|
√
|
√
|
√
|
|
3
|
RX
|
√
|
√
|
√
|
|
|
|
4
|
S
|
√
|
√
|
|
√
|
|
|
5
|
SSX
|
√
|
√
|
|
|
|
|
6
|
X
|
√
|
|
|
|
|
|
[考点] 锁
2. tnsnames.ora文件的作用是什么?
这个文件类似于Linux系统的hosts文件,提供tnsname到主机名或者IP的对应关系。只有当sqlnet.ora中有类似“NAMES.DIRECTORY_PATH=(TNSNAMES)”的配置,客户端解析连接字符串时,数据库才会尝试使用这个文件。
下面给出一个配置的例子:
ORCL=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=lhr)(PORT=1521))
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=orcl)
)
)
其中,每个部分的解释如下:
1)PROTOCOL:客户端与服务器端通信的协议,一般为TCP,该内容一般不用改。
2)HOST:数据库所在的机器的主机名或IP地址。不管用主机名还是IP地址,在客户端一定要用ping命令ping通数据库所在的机器,否则需要在hosts文件中加入数据库所在的机器的主机名和IP地址的对应关系。
3)PORT:数据库监听器的端口,可以查看服务器端的listener.ora文件或在数据库服务器中通过lsnrctl status [listener name]命令来查看。一般为1521端口。
4)SERVICE_NAME:在数据库中使用“SHOW PARAMETER SERVICE_NAME”命令查看,一般情况下和DBNAME相同。
[考点] 网络
3. 什么是分区索引?
分区索引就是简单地把一个索引分成多个片断。通过把一个索引分成多个片断,可以访问更小的片断(也更快),并且可以把这些片断分别存放在不同的磁盘上,从而避免I/O问题。B-Tree和位图索引都可以被分区,而HASH索引不可以被分区。可以有好几种分区方法:表被分区而索引未被分区;表未被分区而索引被分区;表和索引都被分区。不管采用哪种方法,都必须使用基于成本的优化器。有两种类型的分区索引:本地分区索引和全局分区索引。每个类型都有两个子类型,有前缀索引和无前缀索引。表各列上的索引可以有各种类型索引的组合。如果使用了位图索引,那么就必须是本地索引。索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。在使用分区后的表和索引时,Oracle还支持并行查询和并行DML,这样就可以同时执行多个进程,从而加快处理SQL语句。
[考点] 分类
4. 区块链和云计算云存储有什么关系?
云计算通常定义为通过互联网来提供动态易扩展且经常是虚拟化的资源,但是提供云计算平台的往往是一个中心化机构。而区块链组成的网络一般是没有特定的机构,所以区块链更接近分布式计算系统的定义,属于分布式计算的一种。
[考点] NewSQL和区块链
5. 在登记日志文件时为什么必须先写日志文件,后写数据库?
把对数据的修改写到数据库中和把表示这个修改的日志记录写到日志文件中是两个不同的操作。有可能在这两个操作之间发生故障,即这两个写操作只完成了一个。如果先写了数据库修改,而在运行记录中没有登记这个修改,那么以后就无法恢复这个修改了;如果先写日志,但没有修改数据库,那么在恢复时只不过是多执行一次Undo操作,并不会影响数据库的正确性。所以一定要先写日志文件,即首先把日志记录写到日志文件中,然后写数据库的修改。
[考点] 数据库系统的组成与结构
6. 在Oracle中,如何查询视图的所有列?
使用DBA_TAB_COLUMNS视图可以查询到所有的表、视图和簇表的列的详细内容,但是这个视图不包括系统产生的隐藏列和不可见列,而视图DBA_TAB_COLs可以查询到系统产生的隐藏列和不可见列。
[考点] 视图
7. 请回答以下关于进程、线程以及程序的有关问题:
1)进程和线程的区别是什么?
2)多线程程序有什么优点与缺点?
3)多进程程序有什么优点与缺点?与多线程相比,有什么区别?
1)进程和线程的关系如下:
①一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
②资源分配给进程,同一进程的所有线程共享该进程的资源。
③处理机分给线程,即真正在处理机上运行的是线程。
④线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程指的是进程内的一个执行单元,也是进程内的可调度实体。
进程和线程的相同点如下:
①二者都具有ID、一组寄存器、状态、优先级以及所要遵循的调度策略。
②每个进程都有一个进程控制块,线程也拥有一个线程控制块。
③线程和子进程共享父进程中的资源;线程和子进程独立于它们的父进程,竞争使用处理器资源;线程和子进程的创建者可以在线程和子进程上实行某些控制,例如,创建者可以取消、挂起、继续和修改线程和子进程的优先级;线程和子进程可以改变其属性并创建新的资源。
进程和线程的不同点如下:
①线程是进程的一部分,一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
②启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
③系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),同一个进程内的线程可以共享进程的资源。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。而一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。
④与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
⑤进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
2)多线程的优点如下:
无须跨进程边界;程序逻辑和控制方式简单;所有线程可以直接共享内存和变量等;线程方式消耗的总资源比进程方式少。
多线程的缺点如下:
每个线程与主程序共用地址空间,受限于2GB地址空间;线程之间的同步和加锁控制比较麻烦;一个线程的崩溃可能影响到整个程序的稳定性;到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约1500个线程数就快到极限了(线程堆栈设定为1MB),如果设定线程堆栈为2MB,还达不到1500个线程总数;线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也很烦琐,需要消耗较多的CPU。
3)多进程的优点如下:
每个进程互相独立,不影响主程序的稳定性,子进程崩溃也没关系;通过增加CPU,就可以容易扩充性能;可以尽量减少线程加锁/解锁的影响,即使线程运行的模块算法效率低,也可极大提高性能;每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。
多线程的缺点如下:
逻辑控制复杂,需要和主程序交互;需要跨进程边界,如果有大数据量传送,就不太适用,适合于小数据量传送、密集运算、多进程调度开销比较大;最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然,也可以利用多线程+多CPU+轮询方式来解决问题。
方法和手段是多样的,关键是自己看起来实现方便又能够满足要求,代价也合适。
8. 什么是反向键索引(Reverse Key Indexes)?
反向键索引也称为反转索引,是一种B-Tree索引,它在物理上反转每个索引键的字节,但保持列顺序不变。例如,如果索引键是20,并且在一个标准的B-Tree索引中此键被存为十六进制的两个字节C1、15,那么反向键索引会将其存为15、C1。
SYS@orciasm>SELECT DUMP(20,'16') FROM DUAL;
DUMP(20,'16')
---------------
Typ=2 Len=2:c1,15
反向键索引解决了在B-Tree索引右侧的叶块争用问题。在Oracle RAC数据库中的多个实例重复不断地修改同一数据块时,这个问题尤为严重。在一个反向键索引中,对字节顺序反转,会将插入分散到索引中的所有叶块。例如键20和21,本来在一个标准键索引中会相邻,现在存储在相隔很远的独立的块中。这样,顺序插入产生的I/O被更均匀地分布了。
使用反向键索引的最大的优点莫过于降低索引叶子块的争用,减少热点块,提高系统性能。由于反向键索引自身的特点,如果系统中经常使用范围扫描进行读取数据(例如在WHERE子句中使用“BETWEEN AND”语句或比较运算符“>”“<”“>=”“<=”等),那么反向键索引将不会被使用,因为此时会选择全表扫描,反而会降低系统的性能。只有对反向键索引列进行“=”操作时,其反向键索引才会使用。
创建索引时使用REVERSE关键字,如下:
CREATEINDEX REV_INDEX_LHRONXT_REVI_LHR(OBJECT_ID)REVERSE;
ALTER INDEX REV_INDEX REBUID NOREVERSE;
ALTER INDEX NAME_INX REBUILD ONLINE NOREVERSE;
ALTER INDEX ID_INX REBUILD REVERSE ONLINE;
ALTER INDEX ID_INX REBUILD ONLINE REVERSE;
[考点] 分类
9. 在创建索引时有哪些原则?
索引的使用原则如下:
1)在大表上建立索引才有意义。
2)在WHERE子句或者连接条件经常引用的列上建立索引。
3)索引的层次不要超过4层。
4)如果某属性常作为最大值和最小值等聚集函数的参数,那么考虑为该属性建立索引。
5)表的主键、外键必须有索引。
6)创建了主键和唯一约束后会自动创建唯一索引。
7)经常与其他表进行连接的表,在连接字段上应该建立索引。
8)经常出现在WHERE子句中的字段,特别是大表的字段,应该建立索引。
9)要索引的列经常被查询,并只返回表中的行的总数的一小部分。
10)对于那些查询中很少涉及的列、重复值比较多的列尽量不要建立索引。
11)经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段,最好建立索引。
12)索引应该建在选择性高的字段上。
13)索引应该建在小字段上,对于大的文本字段甚至超长字段,不适合建索引。对于定义为CLOB、TEXT、IMAGE和BIT的数据类型的列不适合建立索引。
14)复合索引的建立需要进行仔细分析。正确选择复合索引中的前导列字段,一般是选择性较好的字段。
15)如果单字段查询很少甚至没有,那么可以建立复合索引;否则考虑单字段索引。
16)如果复合索引中包含的字段经常单独出现在WHERE子句中,那么分解为多个单字段索引。
17)如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段。
18)如果既有单字段索引,又有这几个字段上的复合索引,那么一般可以删除复合索引。
19)频繁进行DML操作的表,不要建立太多的索引。
20)删除无用的索引,避免对执行计划造成负面影响。
索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。不要认为索引可以解决一切性能问题,否则就大错特错了。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。要建立一个“适当”的索引体系,特别是对聚合索引的创建,更应精益求精,这样才能使数据库得到高性能的发挥。所以,提高查询效率是以消耗一定的系统资源为代价的,索引不能盲目地建立,这是考验一个DBA是否优秀的一个很重要的指标。
[考点] 基本概念
10. 普通表转换为分区表有哪些办法?
将普通表转换成分区表有以下4种方法:
1)导出/导入方法(Export/Import Method)。
2)子查询插入方法(Insert with a Subquery Method)。
3)分区交换方法(Partition Exchange Method)。
4)在线重定义方法(DBMS_REDEFINITION Method)。
关于这几种方法的优缺点及适用情景见下表。
方 法
|
主要过程
|
优点
|
缺点
|
适用情况
|
导出/导入方法
|
采用逻辑导出/导 入,首先在源库建立 分区表,然后将数据 导出,导入新建的分 区表即可
|
操作简单
|
整个实施过程中,目标表将 不能进行DML操作
|
该方法适用于业务 量较小的表
|
子查询插入方 法
|
采用CTAS的方式 创建分区表,然后执 行RENAME操作即 可
|
方法简单易用,由于采用DDL 语句,不会产生Undo日志,且 只会产生少量Redo日志,效率 相对较高,而且建表完成后数据 已经分布到各个分区中了
|
对于数据的一致性方面需要 做额外的考虑。在执行CREATE TABLE语句和RENAME T_NEW TO T(T_NEW为中间 表)语句时,T表不能进行DML 操作。如果要保证一致性,那 么需要在执行完语句后对数据 进行检查,而这个代价是比较 大的。另外,在执行RENAME 语句时,其他会话将不能访问 T表
|
该方法适用于修改 不频繁的表,在闲时 进行操作,表的数据 量不宜太大
|
分区交换方法
|
执行分区交换命 令“ALTER TABLE T_NEW EXCHANGE PARTITION T1 WITH TABLE T;”交换普通 表和分区表的某个特 定分区。
|
只对数据字典中分区和表的 定义进行了修改,没有数据的 修改或复制,效率最高。如果 对数据在分区中的分布没有进 一步要求,那么实现比较简单。 在执行完RENAME操作后,可 以检查T_OLD(T_OLD为中 间表)中是否存在数据,如果 存在,那么直接将这些数据插 入T中,可以保证对T插入的 操作不会丢失
|
存在一致性问题,在交换分 区之后到RENAME T_NEW TOT(T_NEW为中间表)之前, 查询、更新和删除会出现错误或 访问不到数据。如果要求数据分 布到多个分区中,那么需要进行 分区的SPLIT操作,会增加操 作的复杂度,效率也会降低
|
该方法适用于包含 大数据量的表转到分 区表中的一个分区的 操作,应尽量在系统 空闲时进行操作
|
在线重定义方 法
|
使用DBMS_RED- EFINITION包进行在 线转换
|
保证数据的一致性,在大部分 时间内,表T都可以正常执行 DML操作,只在切换的瞬间锁 表,具有很高的可用性。这种方 法具有很强的灵活性,对各利,不 同的需求都能满足。而且,可以 在切换前进行相应的授权并建立 各种约束,可以做到切换完成后 不再需要任何额外的管理操作
|
在实现上比其他几种方法略 显复杂
|
该方法适用于 7*24系统环境
|
[考点] 分区表
11. 什么是活锁?什么是死锁?
如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T2的清求,T3仍然等待。然后T1又请求封锁R,当T2释放了R上的封锁之后系统又批准了T3的请求……T1有可能永远等待,这就是活锁的情形。活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放。R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。
[考点] 基本概念
12. SCN与时间戳如何相互转换?
一个SCN值总是发生在某一个特定的时刻,只不过由于粒度的不一样,通常会存在多个SCN对应同一个时间戳的情况。Oracle 10g提供了两个新函数用于SCN和时间戳进行相互转换,这两个函数分别是SCN_TO_TIMESTAMP和TIMESTAMP_TO_SCN,通过对SCN和时间戳进行转换,极大方便了Oracle的很多备份和恢复过程。
1)SCN_TO_TIMESTAMP(scn_number):将SCN转换成时间戳。
2)TIMESTAMP_TO_SCN(timestamp):将时间戳转换成SCN。
通过以上这两个函数,最终Oracle将SCN和时间的关系建立起来。在Oracle 10g之前,是没有办法通过函数转换得到SCN和时间的对应关系的,一般可以通过LogMiner分析日志获得。但是这两种函数转换要依赖于数据库内部表SMON_SCN_TIME,对于久远的SCN则不能转换。
[考点] RMAN
13. 直方图(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执行的分析阶段评估每个结果集的集合基数。在偏差的列上拥有直方图将会极大地帮助优化器做出正确的决策。如优化器对中间结果集的大小做出不正确的判断,则它可能会选择一种未达到最优化的表连接方法。因此向该列添加直方图经常会向优化器提供使用最佳连接方法所需的信息。
[考点] 统计信息
14. 时间序列数据库有哪些代表数据库?
因为时间序列数据自身的特点,传统的数据库有些显得力不从心,所以近年来涌现了很多优秀的时间序列数据库,例如InfluxDB、RRDtool、Graphite、OpenTSDB、Druid、Prometheus和Kdb+等,其中Kdb+也是关系型数据库。TSDB其实在自动化、石油、化工等其他行业早已经普及使用。对于大部分DBA而言,TSDB使用在监控上,将监控数据存放到TSDB中,便于分析和报警。
[考点] 时间序列数据库
15. 如何查询某服务是静态注册还是动态注册?
可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。实例状态为UNKNOWN时表明此服务是静态注册。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(动态监听在NOMOUNT状态下为BLOCKED)来指明。不管何时关闭数据库,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。所以,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退和负载平衡。
[考点] 网络
16. Oracle的异常可以分为哪几类?
Oracle将异常分为预定义异常、非预定义异常和自定义异常三种。
1.预定义异常(Predefined)
当PL/SQL应用程序违反了Oracle规定的限制时,就会隐含地触发一个内部异常,这就是预定义异常。预定义异常用于处理常见的Oracle错误,对这种异常情况的处理,无须在程序中定义,由Oracle自动将其触发。它们全部放在PL/SQL自带的标准包中,这样程序员就无须再次定义了。预定义异常大约有20多个,下表是一些常见的预定义异常。
错误号
|
异常错误信息名称
|
说明
|
ORA-01403
|
NO_DATA_FOUND
|
SELECT INTO没有找到数据
|
ORA-01422
|
TOO_MANY_ROWS
|
SELECT INTO返回多行
|
ORA-06501
|
PROGRAM_ERROR
|
内部错误,需重新安装数据字典视图和PL/SQL包
|
ORA-06511
|
CURSOR_ALREADY_OPEN
|
试图打开一个已存在的游标
|
ORA-06530
|
ACCESS_INTO_NULL
|
试图为NULL对象的属性赋值
|
ORA-01012
|
NOT_LOGGED_ON
|
没有连接到Oracle
|
ORA-01001
|
INVALID_CURSOR
|
试图使用一个无效的游标
|
ORA-00061
|
TRANSACTION_BACKED_OUT
|
由于发生死锁事务被撤销
|
ORA-00051
|
TIMEOUT_ON_RESOURCE
|
在等待资源时发生超时
|
ORA-00001
|
DUP_VAL_ON_INDEX
|
试图破坏一个唯一性限制
|
ORA-01017
|
LOGIN_DENIED
|
无效的用户名/口令
|
ORA-01476
|
ZERO_DIVIDE
|
试图被零除
|
ORA-01722
|
INVALID_NUMBER
|
转换一个数字失败
|
ORA-06500
|
STORAGE_ERROR
|
内存不够或内存被破坏触发的内部错误
|
ORA-06502
|
VALUE_ERROR
|
赋值操作,变量长度不足,触发该异常
|
ORA-06504
|
ROWTYPE_MISMATCH
|
宿主游标变量与PL/SQL变量有不兼容行类型
|
ORA-06531
|
COLLECTION_IS_NULL
|
试图给没有初始化的嵌套表变量或者VARRY变量赋值
|
ORA-06532
|
SUBSCRIP_OUTSIDE_LIMIT
|
对嵌套或VARRAY索引使用了负数
|
ORA-06533
|
SUBSCRIPT_BEYOND_COUNT
|
对嵌套或VARRAY索引的引用大于集合中元素的个数
|
2.非预定义异常(Non Predefined)
非预定义异常用于处理预定义异常不能处理的异常,即其他标准的Oracle错误。使用预定义异常只能处理系统预定义的20多个Oracle错误,而当使用PL/SQL开发应用程序时,可能会遇到其他的一些Oracle错误。例如,在PL/SQL块中执行DML语句时违反了约束规定等。在这样的情况下,就可以使用非预定义异常来处理。
Oracle提供了2个函数SQLCODE和SQLERRM用于返回错误信息。
1)SQLCODE:返回错误代码。
2)SQLERRM:返回与错误代码关联的消息。
这样就可以在错误日志表中记录程序在执行过程中发生的错误信息了。
3.自定义异常(User_define)
自定义异常用于处理与Oracle错误无关的其他情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其触发。
预定义异常和自定义异常都是与Oracle错误相关的,并且出现的Oracle错误会隐含地触发相应的异常;而自定义异常与Oracle错误没有任何关联,它是由开发人员为特定情况所定义的异常。当与一个异常相关的错误出现时,就会隐含触发该异常。用户定义异常是通过显式使用RAISE语句来触发。当触发一个异常时,控制程序就转到异常块部分,执行错误处理代码。
[考点] 程序处理
17. 集群安装过程中的$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 --最后一个节点可以保留磁盘组
dd if=/dev/zero of=/dev/rhdiskN bs=1024k count=1024 --清理磁盘头
$DRID_HOME/root.sh -重新执行
另外,deconfig执行完后可以考虑删除以下文件:
ls -1 $GRID_BASE/Clusterware/ckptGridHA*
fred SGRID_HOME/gpnp/* -type f
find $GRID_HOMF/gpnp/* -type f -exec rm -rf {} \;
集群的配置信息包含在文件$GRID_HOME/crs/install/crsconfig_params中,root.sh脚本根据该文件的配置信息设置OCR的内容。在执行root.sh脚本的过程中产生的日志在目录$GRID_HOME/cfgtoollogs/crsconfig/下。
[考点] RAC
18. 如何查看MySQL的位数?
有如下几种办法:
1)mysql -V
2)mysql>show variables like '%version_%';
3)which mysql|xargs file(Linux/Unix系统)
4)echo STATUS|mysql-uroot -ppassword|grep Ver
19. 分布式数据库有哪些优点?
分布式数据库的优点如下:
1)增强了可用性。当某个数据库服务器出现故障后,可以继续使用分布式数据库中其他数据库提供的服务。
2)数据的分布访问。企业数据可以分布于若干城市,分析时可能需要访问不同场地的数据,但通常在访问模式中得到数据存储的局部性(例如银行经理通常是查询本地支行的顾客账户),这种局部性可用来分布数据。
3)分布数据的分析。企业需要分析所有可用的数据,即使这些数据存储在不同场地、不同的数据库系统中。
[考点] 分布式数据库与并行数据库
20. 游标分为哪几类?父游标和子游标的区别是什么?
游标(Cursor)是Oracle数据库中SQL解析和执行的载体,它可以分为共享游标(Shared Cursor)和会话游标(Session Cursor)。共享游标是指缓存在库缓存(Library Cache)里的一种库缓存对象,其实就是指缓存在库缓存里的SQL语句和匿名PL/SQL块所对应的库缓存对象。共享游标是Oracle缓存在库缓存中的几十种库缓存对象之一,它所对应的库缓存对象句柄的Namespace属性的值是CRSR(也就是Cursor的缩写)。共享游标会存储目标SQL的SQL文本、解析树、该SQL所涉及的对象定义、该SQL所使用的绑定变量类型和长度,以及该SQL的执行计划等信息。共享游标可以细分为父游标(Parent Cursor)和子游标(Child Cursor),可以通过视图V$SQLAREA来查看当前缓存在库缓存(Library Cache)中的父游标,而通过V$SQL来查看缓存在库缓存中的子游标。Oracle设计这种嵌套的Parent Cursor和Child Cursor并存的结构是为了能尽量减少对应的Hash Bucket中库缓存对象句柄链表的长度。
Oracle中游标的分类如下图所示。
父游标和子游标的对比见下表。
|
父游标
|
子游标
|
查询视图
|
V$SQLAREA
|
V$SQL
|
存储内容
|
父游标存储SQL文本(库缓存对象句柄的属性 NAME中);父游标的heap 0中存储着子游标的句柄 地址
|
子游标存储解析树(Parse Tlree)及执行计划(Execution Plan,实际上存储在库缓存对象句柄的heap 6中),以及该 SQL所使用的绑定变量的类型和长度
|
库缓存对象句柄的属 性NAME存储内容
|
存储SQL文本
|
空
|
联系
|
1)父游标和子游标的结构是一样的,它们都是以库缓存对象句柄的方式缓存在厍缓存中,Namespace属性的值 均为CRSR 2)由于子游标所对应的库缓存对象句柄的NAME属性值为空,所以,只能通过父游标才能找到相应的子游标 3)任意一个经过解析的目标SQL一定会同时对应两个共享游标,一个是父游标,另一个则是子游标
|
[考点] 游标