广州微创软件科技有限公司面试总结

刚踏入该公司时,感觉很不爽,因为里面的环境让人感觉不到轻松,规模也很小,刚成立的公司吧!但是后面给人的感觉确实不错,无论是笔试还是面试涉及到的问题都是比较专业的问题,而且面试官和接待都是比较随和的人,所以无意间让人轻松不少!总之,这家公司给人的感觉还是不错的!挺有发展潜力的。

由于oracle方面在开发方向比较薄弱,所以今天的一些问题还是答不出来!

(1)数据库在什么状态下,进程在但是客户端连接不上?

》》》oracle实例启动过程中一共有四种状态,按时间先后,分别为:close、nomount、mount、open

close:数据库处于完全关闭状态,没有分配SGA,没有后台进程,完全无法使用!

nomount:startup nomount命令的作用就是读取参数文件,分配SGA、启动后台进程等来创建一个数据库实例,但是此时数据库本身是关闭的,也就是说客户端是连接不上的!

mount:由nomount到mount会读取控制文件,控制文件记载了数据库名称、数据文件名称和位置、重做日志文件名称和位置、表空间名称、SCN、检查点信息、日志历史信息等!此时可以读取到数据文件日志文件等物理文件的位置,从而使得下一步open时可以真正打开数据库,此步骤称之为数据库的装载。此时数据库仍然是关闭的,只有DBA用户可以访问进行维护操作

open:打开数据库,此时实例将打开数据库的数据文件和日志文件!供用户访问!

》》》数据库的关闭,一个open的数据库到shutdown的过程:

<1>数据库close:此时数据库由open到mount状态,即关闭了数据库,也就是关闭了数据文件和日志文件,关闭之前数据库会将SGA中的数据写入对应的数据文件或日志文件。任何的offline的表空间或者数据文件都已经被关闭了,这些在closed前offline的表空间或者数据文件,在下次启动数据库的时候会被忽略,还是保持offline的状态。

<2>开启的时候要装载数据库(mount),所以关闭的时候当然要先卸载数据库啊,即使数据库到unmount状态:此时实例还在,但是数据库控制文件已经被关闭了,此时的实例没有和任何的数据库相关联!但是此时后台进程还是在的,因为实例在!

<3>既然数据库都被卸载了,实例保存着有什么意义呢!因此最后的关闭就是关闭实例!此时所有的oracle进程也被干掉了!

当然以上的步骤都是数据库正常的启动和关闭的情况下!

如果一个实例被shutdown abort或者oracle系统崩溃,服务器掉电等,不会完全经历这些过程。这时候数据库与实例的关闭是立即的。

(2)客户端是32位的系统,服务器是64位的现在如何处理客户端连接问题

这个问题!确实没思路,网上也找了,但是总是找不到心里所要的答案!求解!

(3)oracle9i和oracle10g的主要区别(即改进)

<1>9i是面向对象的,10g是支持网格计算的:即多台节点服务器利用高速网络组成1个虚拟的高性能服务器,负载在整个网格中均衡,按需增删节点避免单点故障。

<2>10g安装容易,工作量比9i安装少一半

<3>10g新增了EM(基于浏览器的企业管理器Enterprise  Manager)

<4>10g中支持ASM:自动存储管理!===》增删硬盘不再需要系统管理员设置的镜像、负载均衡、物理卷、逻辑卷、分区、文件系统,只要一条oracle命令,ASM自动管理增加或删除的硬盘

<5>10g支持内存的自动化管理:10g新增了参数SGA_TARGET,若SGA_TARGET=0则表示没有启用ASMM(自动共享内存管理:automatic shared memory management);若SGA_TARGET!=0则表示启用了ASMM,ASMM具体是由mman(memory manager)后台进程动态管理SGA中的各项缓存。

<6> SQL性能调整自动化

<7>闪回,10g新增了快速纠正人为错误的闪回操作,用来恢复数据库、表、甚至具体的记录

<8>数据泵高速导入导出数据,比传统导出速度快2倍以上,比传统导入速度快15倍以上

<9>精细审计(10g):记录一切对敏感数据的操作

(4)序列的作用

sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操 作。没有sequence,顺序的值只能靠编写程序来生成。先找出最近产生的值然后自增长。这种方法要求一个事务级别的锁,这将导致在多用户并发操作的环 境下,必须有人等待下一个主键值的产生。而且此方法很容易产生主键冲突的错误,如下图:
time a......trans1 begin.........................................................
                       |
              取max value=5
                        |
time b...... max value+1=6........trans2 begin.....................
                        |                         |
               other action               max value=5
                        |                         |
time c..... commit; ...................max value+1=6................
                                                  |
                                              commt(ora-00001)


如上图,事务2会报主键冲突的错误,而再刷新一下页面(再执行一边程序),可能就正常了。
还有一个问题,那就是完成生成主键的程序(一般情况包含plsql块)本身对于并发调用也是一个瓶颈,因为这样的程序段往往是提供给好多程序去调用,如果 代码端写的不够优化(比如没有使用邦定变量等等),或者此代码段存在问题,那么它所影响的是系统的全局。我们应该提倡开发人员使用sequence。 sequence消除了序列化问题,而且改善了应用的并发能力。

创建sequence

sequence的命名最重要的是要统一,命名规则是次要的。
CREATE SEQUENCE emp_sequence
      INCREMENT BY 1
      START WITH 1
      NOMAXVALUE
      NOCYCLE
      CACHE 10;
这里需要重点说明的是cache参数,它是为了应对并发访问的。cache参数告诉oracle预先分配一个sequence numbers的集合,并且保留在内存中,以便sequence number能够被快速的访问。这个内存的大小就是cache所指定的大小,当多个用户同时访问一个sequence的时候,是在oracle SGA中读取sequence当前的合理数值,如果并发访问太大,cache的大小不够,那么就会产生sequence cache相关的等待(enq: SQ - contention),影响系统性能。
既然cache涉及到了内存,那么就会想到oracle实例恢复的问题。如果数据库shutdown abort,sequence会如何呢?当然会有问题,sequence number保存在内存里的但是没有被应用到表中的会丢失!

修改sequence

除了修改sequence的starting number,你什么都能改,如果想改starting number,只能先drop然后create。
ALTER SEQUENCE emp_sequence
    INCREMENT BY 10
    MAXVALUE 10000
    CYCLE
    CACHE 20;
修改很有用,最典型的情况是“需要把sequence 的current value改大一点,避免程序报错!”。你就可以看看current value是多少,然后修改increment by 足够大的值,然后执行.nextval,最后别忘了再将increnent by改成原来的值,还要注意做这些工作的前提是当前没有人用此sequence。

使用 sequence

CURRVAL 和 NEXTVAL 能够在以下情况使用:
insert的values字句、select中的select列表、update中的set字句

CURRVAL 和 NEXTVAL 不能够在以下情况使用:
子查询、视图和实体化视图的查询、带distinct的select语句、带group by和order by的select语句、带union或intersect或minus的select语句、select中的where字句、create table与alter table中的default值、check约束条件。

删除sequence

drop sequence seq_a;
当删除sequence后,对应它的同义词会被保留,但是引用时会报错。

oracle rac环境中的sequence

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。
row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;
SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。
SV锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。
cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。

rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequence值cache到内 存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)"sql> create sequence seq_b cache 100 order"。如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁 的情况相同,就是将cache 值进行适当调整。

在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的 cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。

(5)建表时,方案的作用

Oracle方案  PK  SQL Server 数据库
一般在实现一个软件工程项目时,用户习惯于把数据存储在一个集中的对象中。
比如:在SQL Server中,针对一个项目,我们一般创建一个数据库
但是在Oracle中一般只有一个数据库,那么在一个数据库中实现不同的项目就
非常不方便。Oracle在组织不同项目中的数据库对象时,使用方案进行区分。
也就是说,创建一个软件项目,在Oracle中不是针对这个项目,创建独立的数据库,
而是为此项目创建一个方案。

什么是方案:某用户拥有的所有的数据库对象的逻辑集合,就叫方案。
方案在名称上和用户名是相同的。

比如有一个Oracle“用户”叫scott,那么,我们一般称Scott用户所拥有的所有数据库
对象的集合叫“方案”

比如表emp,它的所有者是scott,我们引用的方法是:scott.emp
scott.emp:可以称之为:
    scott方案中的emp表
也可以称之为
    scott用户所拥有的emp表
以上两种说法是等价的,一般不进行区分。   

比如数据库DB中有三个方案:a、b、c,每一个方案中都有一个表emp
格式:[[数据库名.]方案名.]对象名
db.a.emp   
db.b.emp
db.c.emp

在SQL Server中引用方式:因为在SQL Server中有不同的数据库名a,b,c,
每一个数据库中都有emp表
格式:[[数据库名.]所有者的用户名.]对象名 == [[数据库名.]方案名.]对象名
a.dbo.emp
b.dbo.emp
c.dbo.emp

Oracle中创建方案的方法就是创建用户

Oracle中如何实现方案:
1、(可选)创建表空间
2、创建用户
2、给用户授予合适的权限
3、创建数据库对象(表、视图、索引等)
4、创建数据库应用程序(PL/SQL编程)

===============表空间===========
空间是什么?
用于存储数据库对象的存储空间

SQL Server中数据存储在一个逻辑对象中——文件组
文件组是数据库中的逻辑对象,实现把不同的物理数据文件
组织在一个对象中,方便引用。
可以把整个表的数据的存储定义到不同的文件组
create table abc.dbo.test
(id int primary key)
on ‘mygroup’
指定到文件组,实际上是定位到文件组所对应的多个物理文件

Oracle中,组织不同的物理文件的逻辑对象不叫文件组,叫表空间
表空间是用于在Oracle中组织不同的数据文件的逻辑数据库对象

表空间是有物理数据文件构成的。

创建具有一个数据文件的表空间
create tablespace tp_name
datafile
‘路径和文件名’ size 大小(文件不能乱删—如果直接删了需重装Oracle)

创建具有一个数据文件的表空间
create tablespace tp_name
datafile
‘路径和文件名’ size 大小,
‘路径和文件名’ size 大小,
‘路径和文件名’ size 大小,…

create tablespace test1
datafile
‘c:\test1′ size 5m,
‘c:\test2.ora’ size 5m

在实现项目方案时,表空间是可选的对象,如果用户不创建表空间
那么,系统会给新创建的用户分配系统默认表空间(system)
但是,为了保证项目数据能够高效存储、方便的备份,推荐创建表空间
删除表空间
Drop tablespace tablespace_name [including contents [and datafiles]];

===============方案(用户)===================
如果有可以使用的表空间了,那么就意味着,可以有空间存储用户数据了
下面创建用户:(创建方案)
语法:
create user 用户名 identified by 密码
[default tablespace 表空间名]
[quota 大小 on 表空间名]
[password expire](密码过期)


    如果[default tablespace 表空间名]不定义,就使用系统默认表空间
    quota 大小 on 表空间名:在指定在”表空间名”所指定的表空间上,用户可以用多少空间
    [password expire]:用户在第一次登录时,可以自己更改密码
   
创建用户:hy密码是password,表空间默认
create user hy identified by password;

创建用户:hy密码是password,表空间为test
create user hy identified by password
default tablespace test

创建用户:hy密码是password,表空间为test
在test上可以用5M空间,密码立即过期
create user hy identified by password
default tablespace test
quota 5m on test
password expire

=================权限===========
Oracle中新创建的用户,是没有任何权限的,即使是登陆也不行
需要给Oracle用户明确授权才能使用
Oracle权限的分类:
    系统权限:执行特定的SQL语句的权利
    对象权限:访问其他方案对象的权利
   
        系统权限:(由特权用户管理)
        create table        权限代表用户可以在自己的方案中创建表(create table)
        create any table 权限代表用户可以在任意方案中创建表(create any table)

        对象权限:(自己拥有的对象的对象权限不需要授权)(对象的所有者管理)
        select :对象的拥有者把对自己的对象的select权限授予其他用户

权限的授予和撤销(grant和revoke):
1、系统权限的授予和撤销:
    GRANT 权限1,权限2,… TO
    user | role | public [,user | role | public] …[with admin option]
        user:用户名
        public:是一个Oracle组,代表所有的Oracle用户 (Windows中的everyone)不推荐使用
    –1、授予用户在自己的方案中建立表、视图、过程和函数的权限
        GRANT create table,create view,create procedure
        TO hy
    –2、授予用户scott、hy、hr在任意的方案中建立表、视图、过程和函数的权限
        GRANT create any table,
        create any view,
        create any procedure
        TO scott,hy,hr
     with admin option:委派授权选项:
        如果在授权时使用此选项,说明此用户可以管理此权限,
        也就是此用户在自己得到此权限的同时,也可以把此权限授权其他用户
    –3、授予用户在自己的方案中建立表、视图、过程和函数的权限,并且可以将权限授予别的用户
        GRANT create table,create view,create procedure
        TO hy with admin option
    如果授权者权限撤销了,那么不会影响其授与的其他用户的权限   
    A——>B——>C——>D
    A权限撤销,B、C、D不会受到影响
Revoke sys_priv [, sys_priv]…
from {user | role | public},[, {user | role | public}]…


2、对象权限的授予和撤销:
    GRANT 对象权限1,…,对象权限n
    ON 对象名1,…,对象名n
    TO user | role | public [,user | role | public] …
    with grant option
   
    对象权限1,…,对象权限n ON 对象名1,…,对象名n
    对象权限:根据对象类型不同权限名也不一样
        grant select on emp to hy
        grant select on proc_name to hy –错误的,因为过程是不能够select操作
        grant execute on proc_name to hy –正确的,过程可以具有”执行”权限
给用户hr,在SCOTT方案中对emp表执行select的能力
grant select on scott.emp to hr;
    with grant option:对象权限的委派
    委派后,权限是级联收回的
    A——>B——>C
    如果A的权限被撤销,则B、C都会被撤销
    Revoke {obj_priv [(column_list)] [,obj_priv [(column_list)] ] … | all [privileges]}
on [schema.]object
from {user | role | public} [, {user | role | public} ]…


Oracle角色:
    ——权限的集合就是角色
    ——类似于Windows的组
一般情况,Oracle新的用户没有任何权限(系统、对象),
要给新用户授予系统权限、对象权限,且授权的个数不定
–创建新用户
create user test identified by password
default tablespace hy
quota 10m on hy
–授予登录系统
grant create session to test
–授予表、视图、索引、序列生成器等创建、修改、删除等权限
grant create table,create view,create sequence to test;
。。。
过多的权限设置,增加了新用户设置的复杂性
——使用角色:
——Oracle内置的3个角色:
    1、connect:针对Oracle一般用户,诸如登录、创建表等基本权限
    2、resource:针对Oracle开发用户,诸如编程、对表空间的无限制使用
    3、dba:数据库管理员,对数据库具有最高的管理权限(sysdba)
    一般一个新建立用户,只需要授予connect+resource角色即可   
Oracle用户自定义角色:
        1、公共角色:重点
            create role role_name not identified;
        2、私有角色:可选的
        如果一个私有角色不是用户的默认角色,则用户获得此角色的权限
        必须通过输入密码验证后获得。
角色的使用方法:
            1、建立角色
            create role myrole not identified;
            2、给角色授权(向权限的集合中添加权限)
            grant create session,create table to myrole;
            3、通过角色给用户授权
            grant myrole to hr;
——角色的主要作用:简化授权
角色的嵌套:
create role a not identified;
create role b not identified;
create role c not identified;

grant create session to a;
grant create table to b;
grant a,b to c;

grant c to scott;

在Oracle中新建用户最简单的方法:
1、建立用户
2、授予角色(connect,resource)

例:1.create user test identified by password
       2.grant connect,resource,create view to test ;

(6)概要文件的作用

Oracle系统为了合理分配和使用系统的资源提出了概要文件的概念。所谓概要文件,就是一份描述如何使用系统的资源(主要是CPU资源)的配置文件。将概要文件赋予某个数据库用户,在用户连接并访问数据库服务器时,系统就按照概要文件给他分配资源。在有的书中将其翻译为配置文件,其作用包括:
1、管理数据库系统资源。
利用Profile来分配资源限额,必须把初始化参数resource_limit设置为true
ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;
2、管理数据库口令及验证方式。
默认给用户分配的是DEFAULT概要文件,将该文件赋予了每个创建的用户。但该文件对资源没有任何限制,因此管理员常常需要根据自己数据库系统的环境自行建立概要文件

 

通过数据字典查看缺省资源配置内容:
select * from dba_profiles order by profile;

范例:当一个用户连接到数据库上以后,如果在某一段时间内没有任何动作的话,该进程就会自己中断,这样在应用程序就会因为进程超时自动断开而不能正常执行。
分析原因,应该是该进程的用户的概要文件(profile)配置问题。发现用户所在的profile的IDLE_TIME为30。即30秒该进程没有任何操作,就会自动断开。

 

PROFILE的管理(资源文件)当需要设置资源限制时,必须设置数据库系统启动参数RESOURCE_LIMIT,此参数默认值为FALSE
      可以使用如下命令来启动当前资源限制:
      alter system set RESOURCE_LIMIT=true;
      当需要以后启动时也启动限制,必须在init.ora中设置
      RESOURCE_LIMIT=true

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26823568/viewspace-721050/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26823568/viewspace-721050/

你可能感兴趣的:(广州微创软件科技有限公司面试总结)