Oracle 面试题汇总
1,delete 与Truncate区别?
1)Truncate 是DDL 语句,DELETE 是DML语句。
2) Truncate 的速度远快于DELETE;
原因是: 当执行DELETE操作时所有表数据先被COPY到回滚表空间,数据量不同花费时间长短不一。而TRUNCATE 是直接删除数据不进回滚表空间。
3) delete 数据可以运行Rollback 进行数据回滚。而Truncate 则是永久删除不能回滚。
4) Truncate 操作不会触发表上的delete触发器,而delete 会正常触发。
5) Truncate 语句不能带where 条件意味着只能全部数据删除,而DELETE可带where 条件进行删除数据。
6) Truncate 操作会重置表的高水位线(High Water Mark),而delete 不会。
delete 删除并不能释放空间,虽然delete将很多块的记录删除了,但是空块依然保留,Oracle在查询时依然会去查询这些空块。而truncate是一种释放高水平位的动作,这些空块被回收,空间也被释放了。
不过truncate显然不能替代delete,因为truncate是一种DDL操作而非DML操作,truncate后面是不能带条件的,即truncate table t where…是不允许的。但是如果表中这些where条件能形成有效的分区,Oracle是支持在分区表中做truncate分区的,命令大致为 alter table t truncate partition '分区名',如果where 条件就是分区条件,那等同于换个角度实现了 truncate table t where…的功能。
2,集合操作符
Union : 不包含重复值,默认按第一个查询的第一列升序排列。
Union All : 完全并集包含重复值。不排序。
Minus 不包含重复值,不排序。
3,什么是第一、二、三、BC范式?
越高的范式冗余越小。应用数据库范式的目的:为了消除重复数据减少数据冗余。
1) 第一范式(1NF):原子件,要求每一列的值不能再拆分了。(属性不可分)
2) 第二范式(2NF): 一张表只描述一个实体(若列中有冗余数据,则不满足)(要求数据库表中的每个实体或记录必须可以被唯一区分,选取一个能区分每个实体的属性或属性组,作为实体的唯一标识)
3)第三范式(3NF): 所有列与主键值直接相关。(消除了冗余,更新异常、插入异常和删除异常)
(学号)——>(姓名,年龄,所在学院,学院地点,学院电话)
4) 巴斯-科德范式(BCNF):在第三范式的基础上,数据库表如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BCNF.
4 事务的特性(ACID)是指什么?
1)原子性(Atomic): 事务中的各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败。
2) 一致性(Consistent): 事务结束后系统状态是一样的。
3)隔离性(Isolated): 并发执行的事务彼此无法看到对方的中间状态。
4) 持久性(Durable):事务完成后,即使发生灾难性故障,通过日志和同步备份可以在故障发生后重建数据。
5 Mysql数据库与Oracle 数据库有什么区别?
1,应用方面,Mysql 是中小型应用的数据库。一般用于个人和中小型企业。Oracle 属于大型数据库,一般用于具有相当规模的企业应用。
2, 自动增长的数据类型方面: MySQL有自动增长的数据类型。Oracle 没有自动增长的数据类型。需要建立一个自增序列。
3,group by 用法: Mysql 中group by 在SELECT 语句中可以随意使用,但在ORACLE 中如果查询语句中有组函数,那么其他列必须是组函数处理过的或者是group by子句中的列,否则会报错。
4,引导方面: MySQL中可以用单引号、双引号包起字符串,Oracle 中只可以用单引号包起字符串
6 Oracle跟SQL Server 2005的区别?
宏观上:
1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性
2). oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-SQL
微观上: 从数据类型,数据库的结构等等回答
7 . 如何使用Oracle的游标?
1). oracle中的游标分为显示游标和隐式游标
2). 显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;隐式游标是在执行插入 (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。
3). 显式游标的操作:打开游标、操作游标、关闭游标;PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它
8 Oracle中function和procedure的区别?
1). 可以理解函数是存储过程的一种
2). 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值
3). 函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程
4). 在sql数据操纵语句中只能调用函数而不能调用存储过程
9 Oracle的导入导出有几种方式,有何区别?
1). 使用oracle工具 exp/imp
2). 使用plsql相关工具
方法1. 导入/导出的是二进制的数据, 2.plsql导入/导出的是sql语句的文本文件
3) sqlloader
4) dblink
10 . 解释冷备份和热备份的不同点以及各自的优点?
冷备份发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法
热备份是在数据库运行的情况下,采用归档方式备份数据的方法
冷备的优缺点:
1).是非常快速的备份方法(只需拷贝文件)
2).容易归档(简单拷贝即可)
3).容易恢复到某个时间点上(只需将文件再拷贝回去)
4).能与归档方法相结合,作数据库“最新状态”的恢复。
5).低度维护,高度安全。
冷备份不足:
1).单独使用时,只能提供到“某一时间点上”的恢复。
2).在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
3).若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
4).不能按表或按用户恢复。
热备的优缺点
1).可在表空间或数据文件级备份,备份时间短。
2).备份时数据库仍可使用。
3).可达到秒级恢复(恢复到某一时间点上)。
4).可对几乎所有数据库实体作恢复。
5).恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的不足是:
1).不能出错,否则后果严重。
2).若热备份不成功,所得结果不可用于时间点的恢复。
3).因难于维护,所以要特别仔细小心,不允许“以失败而告终”。
11 解释data block , extent 和 segment的区别?
data block 数据块,是oracle最小的逻辑单位,通常oracle从磁盘读写的就是块
extent 区,是由若干个相邻的block组成
segment段,是有一组区组成
tablespace表空间,数据库中数据逻辑存储的地方,一个tablespace可以包含多个数据文件
12. 解释什么是死锁,如何解决Oracle中的死锁?
死锁是当程序中两个或多个进程发生永久阻塞(等待)时,而每个进程都在等待被其他进程占用并阻塞了的资源的一种数据库状态。
产生死锁的原因:
1)系统资源不足。
2)进程运行推进的顺序不合适。
3)资源分配不当
4)占用资源的程序崩溃
产生条件:
1)互斥条件:一个资源每次只能被一个进程使用。
2)请求与保持条件:当一个进程因请求资源而被阻塞时,对已获得的资源不会释放。
3)不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行被剥夺。
4)循环等待条件:若干进程之间形成一种首尾相接的循环等待资源关系。
简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行
解决办法:
1). 查找出被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
2). 杀进程中的会话
alter system kill session "sid,serial#";
13 简述oracle中 dml、ddl、dcl的使用
Dml 数据操纵语言,如select、update、delete,insert
Ddl 数据定义语言,如create table 、drop table 等等
Dcl 数据控制语言, 如 commit、 rollback、grant、 invoke等
14 怎样创建一个一个索引,索引使用的原则,有什么优点和缺点
创建标准索引:
CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建组合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名;
创建反向键索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;
索引使用原则:
索引字段建议建立NOT NULL约束
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;
可选择性高的关键字 ,应该建立索引;
可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的第一个字段,一般是选择性较好的且在where子句中常用的字段上;
B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
频繁DML的表,不要建立太多的索引;
不要将那些频繁修改的列作为索引列;
索引的优缺点:
有点:
1. 创建唯一性索引,保证数据库表中每一行数据的唯一性
2. 大大加快数据的检索速度,这也是创建索引的最主要的原因
3. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
缺点:
1. 索引创建在表上,不能创建在视图上
2. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
3. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
4. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
索引的使用原则如下:
- 在大表上建立索引才有意义
- 在WHERE子句或是连接条件经常引用的列上建立索引。
- 索引的层次不要超过4层。
- 如果某属性常作为最大值和最小值等聚集函数的参数,那么考虑为该属性建立索引、
- 表的主键、外键必须有索引。
- 创建了主键和唯一约束后会自动创建唯一索引。
- 经常与其他表进行连接的表,在连接字段上应该建立索引。
- 要索引的列经常被查询,并只返回表中的行的总数的一小部分。
- 对于那些查询中很少涉及的列、重复值比较多的列尽量不要建立索引。
- 经常出现在关键字ORDER BY,GROUP BY,DISTINCT后面的字段,最好建立索引。
- 索引应该建立在选择性高的字段上
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不适合建索引。对于定义为CLOB、TEXT、IMAGE和BIT的数据类型的列不适合建立索引。
- 复合索引的建立需要仔细分析。正确选择复合索引中前导列字段,一般是选择性比较好的字段。
- 如果单子段查询很少甚至没有,那么可以建立复合索引,否则考虑单子段索引。
- 如果复合索引中包含的字段经常单独出现在where子句中,那么分解为多个单字段索引。
- 如果复合索引包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段。
- 如果既有单字段索引,又有这几个字段上的复合索引,那么一般可以删除复合索引。
- 频繁进行DML操作的表,避免对执行计划造成负面的影响。
15 oracle的锁又几种,定义分别是什么;
1. 行共享锁 (ROW SHARE)
2. 行排他锁(ROW EXCLUSIVE)
3 . 共享锁(SHARE)
4. 共享行排他锁(SHARE ROW EXCLUSIVE)
5. 排他锁(EXCLUSIVE)
使用方法:
SELECT * FROM order_master WHERE vencode="V002"
FOR UPDATE WAIT 5;
LOCK TABLE order_master IN SHARE MODE;
LOCK TABLE itemfile IN EXCLUSIVE MODE NOWAIT;
ORACLE锁具体分为以下几类:
1.按用户与系统划分,可以分为自动锁与显示锁
自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。
显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。
2 . 按锁级别划分,可分为共享锁与排它锁
共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。
排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
3.按操作划分,可分为DML锁、DDL锁
DML锁又可以分为,行锁、表锁、死锁
行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。
表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档)。
死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。
如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务; 1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。死锁一般是因拙劣的事务设计而产生。死锁只能使用SQL下:alter system kill session "sid,serial#";或者使用相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者使用其它工具杀掉死锁进程。
DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁
排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。如使用alter table语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。
共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。
如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。
分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,ORACLE重新分析编译此语句。
4.内部闩锁
内部闩锁:这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。
16.什么是存储过程?它有什么优点?
存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种数据类型的值并且不涉及特定用户表。
存储过程用于执行特定的操作,可以接受输入参数、输出参数、返回参数、返回单个或多个结果集。在创建存储过程时,既可以指定输入参数(IN),也可以指定输出参数(OUT),通过在存储过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数,可以将执行结果传递到应用环境。存储过程可以使对数据库的管理、显示数据库及用户信息的工作更加容易。
存储过程存储在数据库内,可以由应用程序调用执行。存储过程允许用户声明变量并且可包含程序流、逻辑以及对数据库的查询。
存储过程的优点:
1)存储过程增强了SQL语言的功能和灵活性。存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判定和运算。
2)存储过程可以保证数据的安全性。通过存储过程可以使没有权限的用户在权限控制之下间接地存取数据库中的数据,从而保证数据的安全。
3)通过存储过程可以使相关的动作在一起发生,从而维护数据库的完整性。
4)在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作完成,所以存储过程能以极快的速度执行。
5)可以降低网络的通信量,因为不需要通过网络来传送很多SQL语句到数据库服务器。
6)把体现企业规则的运算程序放入数据库服务器中,以便集中控制。当企业规则发生变化时,在数据库中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,那么当企业规则发生变化时,就需要修改应用程序,工作量非常大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,那么当企业规划发生变化时,只要修改存储过程即可。应用程序无须任何变化。
17.存储过程和存储函数的区别是什么?各自的作用是什么?
相同点:存储过程和存储函数都是存储在数据库中的程序,可由用户直接或间接调用,它们都可以有输出参数,都是由一系列的SQL语句组成。
异同点:
1)标识符不同。
Function Procedure
2)Function必须有返回值,且只能返回一个值。Procedure 可以有多个返回值。
3)存储过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,在调用函数时,除了用在SELECT语句中,在其他情况下必须将函数的返回值赋给一个变量。
4)函数可以在SELECT语句中直接使用,而存储过程不能。
18.触发器的作用、优缺点有哪些?
触发器(TRIGGER)是数据库提供给程序员和DBA用来保证数据完整性的一种方法。它是与表事件相关的特殊的存储过程。是用户定义在表上的一类由事件驱动的特殊过程。触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发的,其中,事件是指用户对表的增(INSERT)、删(DELETE)、改(UPDATE)等操作。触发器经常被用于加强数据的完整性约束和业务规则。
触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来触发运行的。即触发器是当某个事件发生时自动地隐式运行。
触发器的作用:
1)可维护数据库的安全、一致性和完整性。
2) 可在写入数据库表前,强制检验或转换数据。
3)当触发器发生错误时,异常的结果会被撤销。
4)部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器,还可以针对视图定义替代触发器(INSTEAD OF )
触发器的优点:
触发器可通过数据库中的相关表实现级联更改。触发器可以定义比CHECK 更为复杂的约束。与check约束不同的是,触发器可以引用其他表中的列。
触发器的缺点:
触发器的乱用会造成数据库及应用程序的维护困难。在数据库操作中,可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时,规则、约束、默认值也是保证数据完整性的重要保障。如果对触发器过度依赖,那么势必会影响到数据库的结构。同时增加了维护的复杂性。
对于触发器,需要特别注意以下几点:
1)触发器在数据库里以独立的对象存储。
2)存储过程通过其他程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时,自动地隐式运行。
3)触发器被事件触发。运行触发器称为触发或点火(Firing),用户不能直接调用触发器。
4)触发器不能接受参数。
19.什么是游标?如何知道游标已经执行到了最后?
游标是提供了一种机制以便每次处理一行或一部分行。是对结果集的一种扩展。
游标的特点:
1)允许定位在结果集的特定行。
2)从结果集的当前位置检索一行或一部分行。
3)支持对结果集中当前位置的行进行数据修改。
4)为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。
5)提供脚本、存储过程和触发器中用于访问结果集中的数据的SQL语句。
6)使用游标可以执行多个不相关的操作。
7)使用游标可以提供脚本的可读性。
8)使用游标可以建立命令字符串,可传送表名,或者把变量传送到参数中,以便建立可以执行的命令字符串。
20、数据库视图的作用?
1)隐藏了数据的复杂性,可以作为外模式,提供了一定程度的逻辑独立性。
2)有利于控制用户对表中某些列或某些机密数据的访问。提高了数据的安全性。
3)能够简化结构,执行复杂查询操作。
4)使用户能以多种角度、更灵活地观察和共享同一数据。
21、在什么情况下可以对视图执行增、删、改操作?
视图对于DML操作应遵循的原则如下:
1)简单视图可以执行DML操作。
2)当视图包含GROUP BY子句、DISTINCT关键字时,不能执行DELETE操作。
3)当视图出现下列情况时,不能通过视图修改基表或插入数据到基表。
- 视图中包含GROUP BY 子句、DISTINCT关键字关键字。
- 视图中包含了由表达式定义的列。
- 视图中包含了ROWNUM伪列。
- 基表中未在视图中选择的其他列定义为非空且无默认值。
DROP VIEW VIEW_NAME语句来删除视图,删除视图只是删除了视图的定义而不影响基表中的数据。
22、笛卡尔积是什么?
笛卡尔积是把表中所有的记录做乘积,产生大量的结果集,而通常结果中可用的值有限。
笛卡尔积出现的原因多种多样,通常是由于条件的缺失造成的
对笛卡尔积的使用,需要注意以下几点:
1)笛卡尔积会在下面条件下产生:
- 省略连接条件或连接条件缺失
- 连接条件无效
- 统计信息不准确。
2)由于笛卡尔积中的所有表中的所有行互相连接,所以,形成笛卡尔积的结果集的记录数是组成它的各个子集的乘积。
3)为了避免笛卡尔积,需要在WHERE 子句中加入有效连接条件。
4)默认情况下,查询会返回全部行,包括重复行。
23、TOP-N分析(查询)
获取某一数据集合(表或查询结果集)中的前N条记录。例如考试成绩前三名的学生信息、销售前十名的畅销书信息。实际应用中Top-N分析经常会用到。以下几点是TOP-N的性质。
1)Top-N分析就是查询前几名的意思。
2) 在Oracle数据库中,Top-N分析通过ROWNUM实现。
3)Top-N分析中使用ORDER BY 排序子句。
4)TOP-N分析中通常会有内建视图,一般的方法是先对内建视图的某一列或某些列排序,那么很容易做到的。
例如,要求按照工资降序排序查询10号和20号部门工资最高前五名员工的信息,则SQL语句为:
SELECT ROWNUM 序号,RN 原始行号,EMPNO 员工编号,ENAME 姓名,SAL 工资
FROM (SELECT ROWNUM RN, EMPNO,ENAME,SAL FROM SCOTT.EMP WHERE DEPTNO IN(10,20) ORDER BY SAL DESC)WHERE ROWNUM <= 5;
24、WITH语法
WITH用于一个语句中某些中间结果放在临时表空间的SQL语句。可以理解为定义一些SQL的结果集为变量,然后直接引用。
使用WITH语句可以为一个子查询语句定义一个名称,使用这个子查询名称可以在查询语句的很多地方引用这个子查询。
WITH子句中不能嵌套定义,也就是WITH子查询取个有意义的名字。
WITH子句的优点如下:
1)SQL可读性增强
2)WITH子查询只执行一次,并将结果存储在用户临时表空间中,可以多次引用。它提高了执行的性能。(避免多次查询,减少I/O读,提高查询效率)
3)使用WITH子句,可以避免在SELECT 语句中重复书写相同的语句块。
25.什么是SQL注入?
通过把SQL注入(SQL Injection)就是通过把SQL命令插入到WEB表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令的目的。
作为DBA,永远不要信任用户的输入,相反,必须认定用户输入的数据永远都是不安全的,对用户输入的数据必须都进行过滤处理。
为了防止SQL注入,需要注意以下几个要点?
1)永远不要相信用户的输入,可以通过正则表达式或限制长度的方式对用户的输入进行校验,单引号进行转换等。
2)永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询、存取。
3) 永远不要使用管理员权限的数据库连接,建议为每个应用赋予单独的权限。
4)不要把机密信息直接存放,建议对密码或敏感信息进行加密或HASH处理。
5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
26、接触过哪些OS系统?常用的命令有哪些?
对于Oracle数据库而言,常用的系统是Linux,AIX,Windows,HP-UX
对于MySQL, 常用的系统是Linux系统。
对于SQL SERVER 常用的系统是Windows系统。重点学习的是Windows下的服务和注册表。
Win键+ R键可以打开运行框,输入service.msc 即打开windows服务。
命令描述 | Linux | AIX |
查看CPU利用率 | top | topas/nmon |
查看内存的使用率 | vmstat/free | vmstat |
查看磁盘的使用率 | df-h | df-g |
查看进程 | ps-ef | ps-ef |
27.PL/SQL中的%ROWTYPE 和%TYPE 的区别是什么?
%TYPE是定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同。
1)关于%ROWTYPE返回的是一个记录类型,其数据类型和数据库表的数据结构一致。
2)声明的变量对应于数据库表或视图中列的集合。
3)在%ROWTYPE之前加上数据库表名。
4)记录内字段名和数据类型与参照表或视图中的列相同。
%ROWTYPE的优点:
可以不必知道数据库中的数量和类型
在运行期间,数据库中列的数量和类型可能发生变化,但是却不用修改代码。
在SELECT语句中使用该属性可以有效地检索表中的行。
28、如何定义序列(Sequence)?其作用是什么?
在很多数据库系统中,都存在一个自动增长的序列,如果想要在Oracle中实现自动增长的功能,那么只能依靠序列完成。
序列通常具有如下的特性:
- 自动提供唯一的数值。
- 共享对象。
- 主要用于提供主键值。
- 代替应用代码。
- 将序列值装入可以提高访问效率。
CREATE SEQUENCE SEQUENCE_NAME
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
29.作为一名DBA,该如何进行性能优化?请给出详细的步骤?
通常会采用的性能优化步骤:
1.监控数据库性能指标:
首先,我们需要对数据库的性能进行监控,包括CPU、内存、磁盘、网络等方面的指标,以及查询响应时间,锁定情况等关键指标。这可以通过数据库性能监控工具、操作系统监控工具和自定义脚本等方式进行。
2.识别性能瓶颈:
通过监控指标,我们可以快速识别出数据库中的性能瓶颈,例如频繁锁定、长时间查询、磁盘I/O瓶颈等。
3.优化查询语句:
对于频繁查询和耗时查询,我们可以通过优化查询语句来提高查询效率,例如使用索引、避免全表扫描、合理使用JOIN等方式。
4.优化数据模型:
优化数据模型也是提高数据库性能的重要手段。通过优化表结构、拆分大表、使用分区表等方式来提高查询效率。
5.调整服务器参数:
调整服务器参数也是提高数据库性能的重要手段。例如调整数据库缓存区大小、设置服务器缓存、调整服务器硬件配置等方式来提高数据库的性能。
6.优化数据存储:
通过使用压缩、分片等方式来优化数据存储结构,从而提高数据库的性能。
7.升级数据库版本:
升级数据库版本可以使用最新的数据库特性和性能优化手段,从而提高数据库性能。
8.重新设计应用程序:
如果以上方法都无法解决性能问题,那么我们可能需要重新设计应用程序,采用更合理的数据模型和查询语句来提高数据库性能。
总之,进行性能优化需要全面分析和针对性的措施,需要综合运用多种技术手段和工具,从而提高数据库的性能和可用性。
具体步骤和操作如下:
-
监控数据库性能指标:使用性能监控工具,例如Oracle的AWR、Statspack和SQL Trace等,来监控数据库的性能指标,如CPU、内存、磁盘、网络等方面的指标,以及查询响应时间、锁定情况等关键指标。通过分析监控数据,我们可以了解数据库的性能状况,并快速识别出性能瓶颈。
-
识别性能瓶颈:根据监控数据和查询分析结果,快速识别出数据库中的性能瓶颈,例如频繁锁定、长时间查询、磁盘 I/O 瓶颈等。可以使用Oracle的AWR、Statspack等工具来识别性能瓶颈。
-
优化查询语句:对于频繁查询和耗时查询,我们可以通过优化查询语句来提高查询效率。可以通过分析查询计划、使用索引、避免全表扫描、合理使用 JOIN 等方式来优化查询语句。可以使用Oracle的SQL Tuning Advisor等工具来优化查询语句。
-
优化数据模型:优化数据模型也是提高数据库性能的重要手段。可以通过优化表结构、拆分大表、使用分区表等方式来提高查询效率。可以使用Oracle的Schema Analyzer、SQL Access Advisor等工具来优化数据模型。
-
调整服务器参数:调整服务器参数也是提高数据库性能的重要手段。例如调整数据库缓存区大小、设置服务器缓存、调整服务器硬件配置等方式来提高数据库的性能。可以使用Oracle的Automatic Memory Management、Automatic Storage Management等工具来调整服务器参数。
-
优化数据存储:通过使用压缩、分片等方式来优化数据存储结构,从而提高数据库的性能。可以使用Oracle的Advanced Compression、Partitioning等工具来优化数据存储。
-
升级数据库版本:升级数据库版本可以使用最新的数据库特性和性能优化手段,从而提高数据库性能。可以使用Oracle的Database Upgrade Assistant等工具来升级数据库版本。
-
重新设计应用程序:如果以上方法都无法解决性能问题,那么我们可能需要重新设计应用程序,采用更合理的数据模型和查询语句来提高数据库性能。可以与应用程序开发人员合作,对应用程序进行重新设计和开发。
更多推荐
所有评论(0)