发布新日志

  • ORACLE删除正在连接的用户

    2009-09-29 17:41:19

    1、select sid,serial#,username from v$session where user='USERNAME';
    2、alter system kill session 'sid,serial#';
    3、drop user username cascade;
  • 【转】解析:学习Oracle架构应当掌握哪些知识

    2009-09-03 09:39:32

    1、物理结构

      (由控制文件、数据文件、重做日志文件、参数文件、归档文件、口令文件组成)

      一个数据库中的数据存储在磁盘上物理文件,被使用时,调入内存。

      其中控制文件、数据文件、重做日志文件、跟踪文件及警告日志(trace files,alert files)属于数据库文件;

      参数文件(parameter file)口令文件(password file)是非数据库文件

      1.1数据文件:

      存储数据的文件。数据文件典型地代表了根据他们使用的磁盘空间和数量所决定的一个Oracle数据库的容积。

      由于性能原因,每一种类型的数据放在相应的一个或一系列文件中,将这些文件放在不同的磁盘中。

      types:

      .data dictionary .data

      .redo data .index

      .temporary data

      1.2控制文件:

      包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件。

      控制文件内容

    • 数据库名
    • 表空间信息
    • 所有数据文件的名字和位置
    • 所有redo日志文件的名字和位置
    • 当前的日志序列号
    • 检查点信息
    • 关于redo日志和归档的当前状态信息

      控制文件的使用过程

      控制文件把Oracle引导到数据库文件的其它部分。启动一个实例时,Oracle 从参数文件中读取控制文件的名字和位置。安装数据库时,Oracle 打开控制文件。最终打开数据库时,Oracle 从控制文件中读取数据文件的列表并打开其中的每个文件。

      1.3重做日志文件:

      含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件.

      1.4 跟踪文件及警告日志(Trace Files and Alert Files)

      在instance 中运行的每一个后台进程都有一个跟踪文件(trace file)与之相连。Trace file 记载后台进程所遇到的重大事件的信息。

      警告日志( Alert Log)是一种特殊的跟踪文件,每个数据库都有一个跟踪文件,同步记载数据库的消息和错误。

      1.5参数文件:

      包括大量影响Oracle数据库实例功能的设定,如以下设定:

    • 数据库控制文件的定位
    • Oracle用来缓存从磁盘上读取的数据的内存数量
    • 默认的优化程序的选择。

      和数据库文件相关,执行两个重要的功能

      (1)为数据库指出控制文件

      (2)为数据库指出归档日志的目标

      1.6归档文件:

      是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。

      1.7口令文件:

      认证哪些用户有权限启动和关闭Oracle例程。

    2、逻辑结构(表空间、段、区、块)

      表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。

      段:是对象在数据库中占用的空间。

      区:是为数据一次性预留的一个较大的存储空间。

      块:ORACLE最基本的存储单位,在建立数据库的时候指定。

      3、内存分配(SGA和PGA)

      SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

      PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反,PGA 是只被一个进程使用的区域,PGA 在创建进程时分配,在终止进程时回收。

      4、后台进程

      包括数据写进程(Database Writer,DBWR)、日志写进程(Log Writer,LGWR)、系统监控(System Monitor,SMON)、进程监控(Process Monitor,PMON)、检查点进程(Checkpoint Process,CKPT)、归档进程、服务进程、用户进程)

      数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件

      日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件

      系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复

      进程监控:负责在一个Oracle 进程失败时清理资源

      检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。在通常的情况下,该任务由LGWR执行。然而,如果检查点明显地降低系统性能时,可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现。对于许多应用情况,CKPT进程是不必要的。只有当数据库有许多数据文件,LGWR在检查点时明显地降低性能才使CKPT运行。CKPT进程不将块写入磁盘,该工作是由DBWR完成的。init.ora文件中 CHECKPOINT_PROCESS 参数控制CKPT进程的使能或使不能。缺省时为FALSE,即为使不能。

      归档进程:在每次日志切换时把已满的日志组进行备份或归档

      服务进程:用户进程服务。

      用户进程:在客户端,负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。

      5、SCN(System ChangeNumber):

      系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。

  • ORA-01652(临时表空间无法扩展)解决方法

    2009-09-01 18:20:40

    ORA-01652:unable to extend temp segment by num in tablespace name

    产生原因:ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象。

    解决方法:我们知道由于ORACLE将表空间作为逻辑结构-单元,而表空间的物理结构是数据文件,数据文件在磁盘上物理地创建,表空间的所有对象也存在于磁盘上,为了给表空间增加空间,就必须增加数据文件。先查看一下指定表空间的可用空间,使用视图SYS.DBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小:

    SQL>Select file_id,block_id,blocks,bytes from sys.dba_free_space where tablespace_name=’’;

    返回的信息可初步确定可用空间的最大块,看一下它是否小于错误信息中提到的尺寸,再查看一下缺省的表空间参数:

    SQL>SELECT INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASE FROM SYS.DBA_TABLESPACES WHERE TABLESPACE_NAME=name;

    通过下面的SQL命令修改临时段表空间的缺省存储值:

    SQL>ALTER TABLESPACE name DEFAULT STORAGE (INITIAL XXX NEXT YYY);

    适当增大缺省值的大小有可能解决出现的错误问题,也可以通过修改用户的临时表空间大小来解决这个问题:

    SQL>ALTER USER username TEMPORARY TABLESPACE new_tablespace_name;

    使用ALTER TABLESPACE命令,一但完成,所增加的空间就可使用,无需退出数据库或使表空间脱机,但要注意,一旦添加了数据文件,就不能再删除它,若要删除,就要删除表空间。

    一个报错例子如下:

    ORA-1652:unable to extend temp segment by 207381 in tablespace TEMPSPACE

    相应的英文如下:

    Cause: Failed to allocate extent for temp segment in tablespace

    Action:Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace or create the object in another tablespace.

     

    补充:

    重建Temp表空间 

    1. startup --启动数据库      
    2.      
    3. create temporary tablespace TEMP2 TEMPFILE '/home2/oracle/oradata/sysmon/temp02.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --创建中转临时表空间      
    4.      
    5. alter database default temporary tablespace temp2; --改变缺省临时表空间 为刚刚创建的新临时表空间temp2      
    6.      
    7. drop tablespace temp including contents and datafiles;--删除原来临时表空间      
    8.      
    9. create temporary tablespace TEMP TEMPFILE '/home2/oracle/oradata/sysmon/temp01.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --重新创建临时表空间      
    10.      
    11. alter database default temporary tablespace temp--重置缺省临时表空间为新建的temp表空间      
    12.      
    13. drop tablespace temp2 including contents and datafiles;--删除中转用临时表空间      

     

  • 【转】数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名

    2009-09-01 12:14:18

    详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
    ----------------------------------------------------

    数据库名、实例名、数据库域名、全局数据库名、服务名,
    这是几个令很多初学者容易混淆的概念。相信很多初学者都与我一样被标题上这些个概念搞得一头雾水。我们现在就来把它们弄个明白。

    一、数据库名
    什么是数据库名?

    数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下:
    DB_NAME=myorcl
    ...
    在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。

    数据库名的作用
    数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。
    有很多Oracle安装文件目录是与数据库名相关的,如:
    winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\...
    Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/...
    pfile:
    winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora
    Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora
    跟踪文件目录:
    winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
    另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。
    同样,修改数据库结构的语句alter database,当然也要指出要修改的数据库的名称。
    如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。
    还有在备份或恢复数据库时,都需要用到数据库名。
    总之,数据库名很重要,要准确理解它的作用。

    查询当前数据名
    方法一:select name from v$database;
    方法二:show parameter db
    方法三:查看参数文件。

    修改数据库名
    前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
    1.关闭数据库。
    2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
    3.以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)

    二、数据库实例名
    什么是数据库实例名
    数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。
    数据库名和实例名可以相同也可以不同。
    在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。

    查询当前数据库实例名
    方法一:select instance_name from v$instance;
    方法二:show parameter instance
    方法三:在参数文件中查询。

    数据库实例名ORACLE_SID
    虽然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变量。ORACLD_SID用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过ORACLE_SID。在winnt不台,ORACLE_SID还需存在于注册表中。
    ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。

    数据库实例名与网络连接
    数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来说明。

    三、数据库域名
    什么是数据库域名?

    在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如:
    全国交通运政系统的分布式数据库,其中:
    福建节点: fj.jtyz
    福建厦门节点: xm.fj.jtyz
    江西: jx.jtyz
    江西上饶:sr.jx.jtyz
    这就是数据库域名。
    数据库域名在存在于参数文件中,他的参数是db_domain.

    查询数据库域名
    方法一:select value from v$parameter where name = 'db_domain';
    方法二:show parameter domain
    方法三:在参数文件中查询。

    全局数据库名
    全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz

    四、数据库服务名
    什么是数据库服务名?
    oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。
    如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。

    查询数据库服务名
    方法一:select value from v$parameter where name = 'service_name';
    方法二:show parameter service_name
    方法三:在参数文件中查询。

    数据库服务名与网络连接
    oracle8i开如的oracle网络组件,数据库与客户端的连接主机串使用数据库服务名。之前用的是ORACLE_SID,即数据库实例名

  • 【转】ORACLE学习相关

    2009-08-20 15:41:26

    转自:

    http://www.51testing.com/?uid-202848-action-viewspace-itemid-134034

    concepts的英文还是比较简单的,tom写的《oracle编程艺术》还是不错的,建议3个月后再看,稍微有点深度的,没读一次都有不同的体会 呵呵

    浅谈Oracle学习。
    http://itspace.javaeye.com/blog/420550

    上个星期一直在出差,好久没来这个自留地啦,呵呵。现在闲来无事,就谈谈Oracle的学习方法吧。
    1.初接触Oracle,肯定会被其复杂的体系结构,众多的概念给搞混,如process和sessions,restore和recover等等,接触Oracle前3个月肯定会觉得这些概念非常抽象,又觉得无重下手,到处是重点,处处又把握不住,朋友,坚持吧,学习Oracle毅力很重要。
    2.通读Oracle官方文档的concepts章节,至少需要通读2次,英文能力一般的朋友第一次阅读时可适当参考中文文档,因为很多术语英文很难理解。网上有很多关于concepts的中文翻译,其中翻译的比较出色当属于zw1840。第二次阅读时必须抛弃中文资料,英语阅读再困难,也要将其啃下来,因为阅读英文资料,一:会有自己的想法,二:好多好的Oracle资料都是英文的。
    3.学习Oracle初级阶段切忌上一些中文论坛,如itpub,因为那里水平参差不齐,再加上自己水平有限,判断能力有限,他们给出的答案很多都是错误的,很容易形成误导。
    4.遇到问题,先静下来想想,自己先尝试解决问题。
    5.学习Oracle讲究一个“悟”字,即不要浅尝辄止,遇到问题,不是解决就好了,多想想为什么会产生这样的问题,怎么样才能避免,这个问题的背后是什么,牵扯到的知识点有哪些,等等。假如你是Oracle的设计者,你会怎么样设计Oracle?当自己的理念和Oracle的理念产生冲突时,99%是自己错了,多想想这个模块Oracle为什么要这样实现,这样实现会带来什么好处。
    6.实践永远重要于理论,书看的再多,而不会用sqlplus "/as sysdba"操作一系列命令,也是徒然。
    7.不要迷信市面上的Oracle书籍,除了tomas kyte,eygle,piner的书可以读之外,说实在其他的书真的是浪费时间,还不如自己再通读一边concepts。
    8.互联网的神奇之一是产生了google这样的好工具,查阅资料比baidu好多啦
    9.自己研究Oracle的alert日志会给自己带来意想不到的成果,尤其是研究启动过程部分
    10.千言万语,兴趣是第一位的,Oracle好像是一杯醇酒,越品越有味,不知不觉醉心于此。

     

    Oracle书籍推荐
    http://chenjianjx.javaeye.com/blog/295563

     

    Oracle推荐书籍2008-12-06 12:46很多朋友要我帮忙推荐一下Oracle的入门书籍,能够了解Oracle的基本概念、基本知识的那种。
    我就免为其难,推荐几本。

    首先我想强调的一点是,任何一本系统的Oracle书籍只要认真读下来,都会有不错的收获,读书最忌讳的是虎头蛇尾,浅尝则止。

    1.第一本要推荐给大家的是Oracle的概念手册,这本手册是无数DBA学习的起点:Database Concepts
    这是Oracle的官方文档,详尽的介绍了Oracle的基本概念,是DBA经常需要翻阅的参考书,也是最好的入门学习资料,如果大家阅读英文不存在问题,请先阅读本书,这本书可以在Oracle的官方文档站点Tahiti找到:
    http://www.oracle.com/pls/db102/homepage?remark=tahiti

    Oracle10gR2的下载地址为:
    http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14220.pdf

    下载之前你可能需要注册一个OTN的免费帐号。如果你无法从官方站点下载,也可以通过本站下载这本手册:http://www.eygle.com/orabk/OraDoc/b14220.pdf

    当然我建议大家都从英文版开始你的阅读,即便你的英文不够好,但是如果你觉得还是有障碍,网络上已经有很多朋友将这本手册翻译成了中文,我打包了两个版本(如果CHM格式无法打开,请在右键属性页里选择解除锁定),提供下载:

    http://www.eygle.com/orabk/OraDoc/Oracle.Concepts.zip

    原出处链接请参考:ITPUB链接 ITPUB链接2 网友译本


    2.第二本要推荐的是Thomas Kyte的《Expert One on One: Oracle》,这本书的中译本,被称为《Oracle专家高级编程》。
    毋庸多说,这本书是Oracle界的经典之作,最初是基于Oracle8i进行写作的,现在Tom已经出版了基于Oracle9i/Oracle10g的升级版,书名为《Oracle Database Architecture 9i and 10g Programming Techniques and Solutions》,现在中文译本也已经快要出版了。

    这本书的前几章以介绍Oracle的基础知识为主,后几章则以介绍开发相关的内容为主,侧重于管理DBA的朋友可以着重阅读一下该书的前几章。

    Expert One on One: Oracle 这本书中文版大家可以参考:
    http://www.itpub.net/showthread.php?threadid=224536
    其英文版本参考:
    http://www.itpub.net/showthread.php?threadid=316444

    Oracle Database Architecture 9i and 10g Programming Techniques and Solutions 这本书的英文版参考:
    http://www.itpub.net/showthread.php?threadid=486715

    中文版参考:

    http://www.itpub.net/thread-969575-1-3.html

    我强烈推荐大家仔细阅读本书。

    3.另外要推荐给大家的一个系列图书是,Oracle OCP官方培训教材

    这套官方教材无论从结构还是体系上来说都是非常不错的入门及学习参考资料,虽然其中也存在一些错误和含混之处,但是仍然不失为经典,每个考过OCP认证的人都曾经深入阅读过该系列教材。

    我可以负责任的说:每个全面深入阅读和理解该系列教材的人,都无愧于OCP认证,虽然现在的Paper OCP是那么的多。

    另外一个值得推荐之处是,该系列教材拥有不同版本Oracle8i/Oracle9i/Oracle10g,而且大部分都有中文版本,大家可以对照学习。

    这些教材大都可以从ITPUB上找到,恕我不能一一查出其具体链接:)


    4.此外推荐大家可以看看《ITPUB技术丛书》


    ITPUB的技术书籍来源于实践,对于解决实际问题非常有帮助。
    目前已经出版了四本书《Oracle 数据库DBA专题技术精粹》、《Oracle 数据库性能优化》、《深入浅出Oracle-DBA入门、进阶与诊断案例》、《循序渐进Oracle》。
    其中部分图书的章节可以参考以下链接:
    http://www.eygle.com/archives/2008/08/stepbs_oracle_info.html

    书不在多,精读则灵,希望大家能够静下心来认真阅读,然后一定会有所收获的。
    最后要提醒大家的是,Oracle的英文资料众多,要想真正深入学习Oracle,必须克服英文阅读的障碍。

    开发必看的..
    Oracle 9i & 10g编程艺术,书的内容好..翻译的也很好
    http://www.douban.com/subject/1864527/
    再随便找本PLSQL的书好了..
    这本:http://www.china-pub.com/28201
    或者这本:http://www.china-pub.com/16882

    一直认为,Oracle开发的话,不必废话,唯一的书籍选择标准就是tom的作品。上amazon搜他的最新作品就完了
    上面那本《Oracle 9&10g 编程艺术》在目前来说是最好的
    真的没见有人能够同时在技术水平、写作技巧和事业这3个方面都能达到Tom那个高度的。

     

     

    java太苦了,如何成为一名高薪的DBA呢?
    http://www.javaeye.com/topic/167626

     

    我做php和java已经很久了,真的是太苦了,而且人太多,我想凭我的资质在java里是混不出什么名堂的了,想转dba了。老师说过在IT里面有一黄金行业:DBA,有一个可以干一辈子的IT职位:DBA,因为它是吃经验的,干的时间越久越好。我不想浪费我的时间了,希望从今天开始进入DBA的行列。
    我做了一个简单的计划:想找到第一份DBA的工作要有两个基本的东西:你英语好,有一个精通的数据库oracle9i。
    所以时间是这样安排的:晚上的所有时间放在成为DBA的计划中。
    晚上:
          6:00 --  6:30     学新东方的英语语音(英语的基本功学多久也要练的)

    http://www.youku.com/playlist_show/id_336535_orderby_9_page_1.html
    or
    http://video.xuezhishi.com/play.asp?id=494&m=60&n=1&u=1&v=1

         6:30 --  7:00     学新东方新概念英语2
    http://so.56.com/index?type=video&key=%D0%C2%B6%AB%B7%BD+%D0%C2%B8%C5%C4%EE%D3%A2%D3%EF+%B5%DA%B6%FE%B2%E1&op=or&sortby=3
          7:00 --  8:00     看动感英语2005有文本
    http://www.zaban.cn/forum-74-1.html
          8:00 --  11:00    边看oracle学习视频边写代码(我有俩部视频:oracle内部教学视频,ITlab教学视频)够了
          11:00 --  12:00   边看hibernate学习视频边写代码
    以上的原则:在于熟能生巧,不在多。计划的有效时间是2008年3月4日到2008年12月31日
    因为我想在简历上写精通oracle9i,精通hibernate,英语很棒。有经验。


    当然还有很多的相干知识要学的:
    java的基本知识,struts,spring.数据结构,基本算法,设计模式,离散数学,线形代数,高数,概率统计,但这些不是现在的重点,是以后的事。我也要活下去的:白天不管一切只要能挣到钱就行。什么都干。白天的任务是挣钱。

    做java太苦了,而且也对我来说真的是没有什么上升的空间了,如何成为一名高薪的DBA呢? 一切都在摸索中,希望有高人能指点一下。以上都是自己的感言。下面转些东西吧。谢谢!
    我转一篇很精彩DBA经验文章吧,供自己以后学习借鉴。







    成就DBA职业生涯介绍
    许多年来,我在不同的新闻组上花费了很多时间与那些想知道如何得到数据库管理员(DBA)的工作或者如何成长为一名DBA的IT人进行交谈,现在他们有了工作。这些年来许多人针对如何达到这个目标提出了不同意见。本文即是那些意见的综合并且能够在如何才能出色的完成DBA的工作方面给出好的建议。这篇文章同样对于如何让一名DBA变得对老板更有价值。假如你已经是一名DBA,那么也许你会希望跳过文章的前几段。

    我应该成为一名DBA么?

    我曾问过的一个问题是一个人应该从事DBA这样的职业么。这个问题并不容易回答,因为它因人而异。有的人有成为一名好DBA所需要的天赋。而其他人并不认为能够很容易掌握成为DBA的秘诀。DBA职业需要掌握一定的技能。而且还需要其他IT职业所不必需的要求。因此,为了回答这个问题,我通常给将要成为DBA的人描述DBA职业所必需的要求。下面的段落中,我都将以问题结尾。在继续下一段以前请花一些时间考虑并且回答这些问题。

    许多人因为许多原因而立志要成为DBA。其中一个主要原因是薪水。DBA是IT业中薪水最高的职业之一。其他人想成为DBA是因为喜欢赞扬DBA是受到的荣誉,或者因为他看上去很酷!我个人认为,成为DBA是很值得的。它是一个很有意思,令人兴奋的职业。那么,你把DBA作为一个可能的职业选择的原因是什么呢?

    除非你已经提前准备好了,否则你可能会发现从事DBA职业充满了挫折和令人头痛。一个数据库存在于操作系统和最终用户应用程序之间。同样地,DBA必须非常精通他的数据库所在的操作系统。DBA并不一定需要知道所有有关操作系统的知识,但是他知道得越多越好。数据库与操作系统联系非常紧密。理解这种关联是十分必要的。DBA还需要知道服务器硬件以及它如何影响与帮助数据库。同时,DBA必须理解应用软件。DBA可能会被要求帮助开发人员创建可靠,健全的数据库应用程序。还有,最重要的也是最明显的,DBA必须十分彻底的理解数据库引擎,它是如何工作的,所有的引擎是如何组合在一起的,以及如何影响数据库引擎向最终用户和应用程序传送数据的能力。我见过的最好的DBA有非常深刻的理解而且不仅仅在数据库本身。他们知道一些系统管理与应用开发。好多时候他们在成为DBA之前有其中一个或两个背景。无论如何,成为一名合格的而不是出色的DBA也需要许多背景知识。你是否已经做好准备开始学习直到你感到已经无法再学下去了?

    许多和我交谈过的,在开始DBA职业时遇到困难的人,在尝试着吸收大量DBA所需了解的信息时实际上都会有一些问题。毕竟系统管理员是全职学习操作系统的细节。应用程序开发人员全职学习如何编写好的程序。DBA不仅要非常了解这两种不同的工作,而且还需要花费更多的时间去理解数据库的体系结构,以及理解每一样东西的每一块是如何组合在一起的!听起来是不是很让人畏缩?有许多人失败后这样想,并且把DBA工作看作一项非常困难的事情。也有那些传播和理解所有这些信息,并且使用这些信息做出好的,听起来具有技术性的决定的人。正如我以前是一名DBA时喜欢说的,所有这些对我来说看上去像一个大谜团。把这些所有的很好的组合在一起就是挑战。你是哪一种人?

    许多DBA是随时侯命的。他们会在白天或晚上的所有时间接到呼叫去解决他们的数据库出现的致命问题。数据库是商业信息技术基础组织的必不可少的组成部分。没有数据,就没有必要拥有一个计算机系统。数据推动商业。假如amazon.com的网站不能在数据库中搜索产品并且假如没有人能够为他们的产品下订单,那么它会变成什么样?它就不会在商业中存在很久。当数据库down掉,即使只是很短的时间,公司也会损失重大。基于这个原因,DBA到达现场后必须尽可能迅速的解决问题。许多公司有自己的DBA团队以便可以轮流待命。这些DBA 24×7小时的维持数据库应用程序。假如工作需要的话,你准备好随时候命了么?

    一些DBA的职责包括为软件打补丁或者对数据库做些改变。通常,这些操作不能在公司职员工作的时候做,因为此时数据库必须运行以便他们能够工作。这意味着DBA经常不得不在很早或者深夜甚至周末,总之,在正常工作时间以外来完成工作。你准备好在非正常时间工作,或者你在找一个朝九晚五的工作?

    对DBA而言,需要掌握的一个重要内容就是通常被称为“软技术”的东西。DBA需要在团队中很好的工作,通常团队是在变化的,如系统管理员,网络管理员,应用程序开发人员,项目经理和其他人。DBA要能够用流利的英语解释复杂的技术概念,让团队中其他人明白。DBA还要能够在数据库相关问题上指挥团队队员。你的软技术怎么样?

    下面不是全部列表,但是包括了DBA的典型职责:
    •把监视数据库实例当作每日必做工作以保证其可用性。解决不可用的问题。
    •收集系统统计和性能信息以便定向和配置分析。
    •配置和调整数据库实例以便在应用程序特定要求下达到最佳性能。
    •分析和管理数据库安全性。控制和监视用户对数据库的访问。必要时审计数据库的使用。
    •监视备份程序。必要时提供恢复。测试备份与恢复程序。
    •升级RDBMS软件并且在必要时使用补丁。必要时升级或者迁移数据库实例。
    •通过数据库相关动作来支持应用程序开发人员。
    •跟随数据库趋向和技术。当可应用时使用新技术。安装,测试和评估Oracle新的相关产品。
    •执行存储和物理设计。均衡设计问题以完成性能优化。
    •创建,配置和设计信的数据库实例。
    •诊断,故障检测和解决任何数据库相关问题。必要时联系Oracle支持人员以便使问题得到较好的解决。
    •确保Oracle网络软件(SQL*Net, Net8, Names, OiD)配置和运行的很好。
    •与系统管理员(Unix & NT)一起工作以保证Oracle相关事务得到很好的处理。
    •为有效的,定期的维护数据库创建任何必要的脚本。

    前面各段的问题是为了使你考虑一名DBA该做些什么,帮助你决定这是不是适合你的职业。我并非意味着假如你的目标是成为DBA这些会阻止你。我只是尝试着展现一些事实。我看到过一些DBA一旦被实际工作打击了就一蹶不振。他们花费时间,精力和一些金钱获得了他们的第一份DBA工作。我个人认为这个职业非常有价值。而且我无法想像现在做任何其他的会怎样。所以,这一段帮助你决定这是不是你希望从事的。假如它是,那么尽你所有去得到它!

    我怎样得到第一份DBA工作?
    你已经阅读了前面的段落并且认为成为一名DBA是一个好的职业。祝贺你!我希望你的职业能变成你想像得那么令人兴奋和有意义。那么,你如何找到第一份DBA工作?这个问题我已经听别人问了许多许多遍。

    在90年代早期,因特网急速发展。它使公司象草一般萌芽。公司蜂拥而至并且开始创建他们在网上的形象。几乎所有这些有网站的公司都需要一个数据库作为web应用的后台。不幸的是,当时在该领域却没有那么多DBA。在IT业,DBA变得奇缺。那段时间里,得到一份DBA工作看上去只要可以拼出“Oracle”或者可能只是在大学里接触过一学期的数据库就行。为了使生活变得更好,DBA的匮乏促使公司付给有潜力的职员很高的薪水。假如你想要成为一名DBA,很容易,非常容易。你需要做的就是证明你了解什么是数据库然后工作就会比你预期的更早的出现在你面前。

    然后因特网的泡沫破灭了。大量投产因特网的公司破产。许多给公司工作的DBA重新寻找工作。缺少DBA的公司找到一名有DBA经验的人比以前容易得多。在21世纪初期,由于经济并不十分稳固,因此生活并不容易(至少在美国如此)。公司都勒紧了他们的裤腰带。所有这些转化为更少的工作机会和DBA候选人更少的工作空缺。

    得到第一份DBA工作的最艰难的部分是每一个职位都要求有一些工作经验。如果你从公司的角度出发,你就可以理解为什么对DBA职位而言经验是必需的。假如他没有一点经验,你会付给这个人很高的工资让他去操作,维护和运行你IT基础组织的最大最重要的一部分么?你的公司会付钱给一名没有经验的DBA么?并且,在等待他成长起来的过程中可能会损失上百万美元的收入。对大多数公司而言,这些问题的答案肯定是‘不’。所以,没有经验,获得你的第一份DBA工作是很困难的。

    第一份DBA工作现在成了恶性循环的境遇。假如我没有任何经验,我怎样才能得到DBA的工作呢?我没有工作的话又怎么能得到DBA经验呢?这是要战胜的最困难的障碍。最困难的部分是获得第一个DBA工作。这部分的剩下部分将针对实现你第一个DBA工作的目标给你一些建议。

    提示#1:接受教育。—尽可能多的学习有关数据库的知识。这很可能将占用你正常工作以外的部分时间也精力。参加本地大学举办的数据库培训班。许多培训公司都会举办数据库管理员的培训班。假如你的老板不资助你的学习,那么你可能不得不自己支付这笔费用。许多DBA职业要求至少为计算机科学或相关专业本科以上学历,因此你必须至少有那样的文凭。

    提示#2:锻炼成为DBA。—许多数据库供应商都允许你下载他们数据库系统的测试版或评估版。下载一份并且在自己的个人电脑上安装软件。练习使用数据库。故意破坏数据库并且尝试修复它。尝试着履行你所能想到的尽可能多的DBA职责。测试和磨练你在自己的测试平台上的技能这样你就可以证明你的数据库管理能力。

    提示#3:获得认证。—许多数据库提供商都提供自己的数据库产品的认证。许多公司现在都把认证看作是一种标准。需要记住的一件事是仅获得认证是不够的。通过DBA认证测试并不意味着你知道如何管理一个数据库。它只是告诉你以后可能的老板,现在你拥有了一定的技术。它还告诉你的老板你对DBA工作的态度是很认真的。我看到许多人抱怨他们已经得到了认证但是没有经验,却仍然不能得到第一份DBA工作。认证本身并不能使你得到工作,但它是无害的。即使没有其他的,在你进行认证的时候你也已经学到了许多知识。只是不要依赖认证来给你带来你要找的工作。你需要的比这还要多。但它会在最后帮助你。

    提示#4:利用你现有的技能。—许多DBA具有系统管理员背景。其他的有应用程序开发背景。假如可能,查看你能否利用现有的技能来得到工作。现在的目标就是为你和你的老板创造一个双赢的局面。例如,让我们假设你已经是一名系统管理员而想进入DBA领域。也许你会找到一份工作,这份工作一部分时间里可以用到你的系统管理技能,并且在剩下的时间里可以使你涉及到数据库管理领域。假如你已经是一名某个产品平台上的DBA但你希望转到其他产品平台,那么看看你能否找到一份同时接触两个产品平台的工作。这样,公司和你都得到了想要的。在你定向到了DBA工作后,你可以试着得到一个能让你全职作它的职位,也许还可以在同一个公司中。

    提示#5:利用现在的机会。—有时候,一个人进入DBA领域仅仅需要的是正确的地方和正确的时机。假如你现在的老板有一个机会让你进行任何数据库的项目,抓住这个机会!任何数据库经验就比没有数据库经验要好。让你的管理者知道你十分积极的在寻找任何可能的数据库机会。他们就有可能在下次机会到来的时候想到你。进行这些数据库项目以及看到你要成为一个DBA的渴望以后,他们可能会决定培训你,提拔你。许多许多人都是以这种方式获得他的第一个DBA工作,在进行了一些数据库相关的项目后不知不觉的成为一名较低级的DBA。通常当一名DBA离开公司后,公司将在内部寻找一个候选人,假如他们认为这名候选人是可训练的话。

    提示#6:寻找较低级的DBA职位。—假如你只是为了一个较低级的DBA工作,看到DBA职位的需求描述说他们正在寻找高级DBA或者其他的。所以,让我们严谨一些。你并没有一个高级方面的经验。我已经讨论过了对于这样的职位为什么公司不会考虑你。但是他们会在低级的职位上考虑你。低级的DBA在高级DBA的指导下完成工作。他们摸索窍门。一般来说,高级DBA对数据库承担责任,同时也获得所有的荣誉。但是不要焦急。随着你的事业发展,你将会有越来越多的责任和得到越来越多的信任。因为你没有任何经验,你应该从这里开始启航。

    我也听到过一些公司寻找一名高级DBA,但是到最后,他们实际想要雇一名低级的DBA。你或许希望申请这样的职位虽然你也许没有资格。他们可能还是会决定雇佣你。但是提前说明你仍然在摸索阶段并且已经是较低级的DBA水平。不要试图欺骗他们让他们认为你是高级DBA的水平。这只会降低你得到这项工作的机会。

    这些提示将帮助你得到第一份DBA的工作。祝你在寻找工作时有好运气。当你已经找到了第一份DBA工作后,继续下面的部分来学习如何往下走下去。

    我刚得到我的第一份工作!现在该怎样?

    祝贺你!你现在是DBA俱乐部的正式成员了!对于这份梦寐以求的令人激动的职业,你准备好了么?你的工作才刚开始并且你在学习上已经落在后面。你将会发现要成为一名高效的数据库管理员有大量的知识你必须掌握。你的第一年或前两年将花费比以前更多的时间来学习。假如你发现学习知识的数量使你大脑超负荷,那么休息一下,歇口气,然后再回到学习中去。为了帮助你继续走下去,你可以按照下面的方法进行:

    步骤#1: 关系型数据库理论 –这部分我假设你将管理的数据库是一个“关系型”数据库。其他数据库模型也存在,但是关系型模式是近二十年工业上占统治地位的一种数据库模式。假如你的数据库系统是其他的模式,那么学习它的理论。相关数据库理论是十分重要的。它是其他一切的基础。我也看到许多跳到数据库管理职位的人从不想去学习纯粹的关系型数据库理论。不可避免的,在他们的事业中对理论基础的匮乏作为缺点暴露了出来。假如你对关系型数据库理论理解得很好,那么你将非常容易的在任何平台的关系型数据库管理系统(RDBMS)中转变。我使用Oracle数据库,或者IBM的DB2,或者微软SQL Server是无关紧要的。他们都是关系型数据库系统。他们在最底层都在做着相同的事情。区别在于他们怎样去做相同的事情。纯粹的关系型数据库理论对于较低级的DBA来说并非必需的。但是假如你想要超越低级DBA的水平它就是十分重要的。许多大学的教科书都很好的包含了关系型数据库的理论。其中一本被广泛使用的教科书就是由Elmasri and Navathe编写的数据库系统基础,Bejamin/Cummings Press。

    步骤#2: 彻底的学习查询语言 –数据库都有语言让你能够从数据库中得到数据,把数据放到数据库中,以及修改数据库中的数据。对于关系型数据库而言,这种语言就是结构化查询语言(SQL)。这门语言是你与数据库接触的工具。不能让这个工具成为以后学习的障碍,这一点很重要。在你的测试数据库中练习不同的SQL语句直到他们变成了你的习惯。这方面的一本非常好的书叫做Oracle 9i完全参考(Oracle 9i The Complete Reference)由Loney 和Koch编写,Oracle Press。每一名Oracle DBA都应该在他事业的早期阅读这本书。Oracle 9i参考手册(Oracle 9i SQL Reference manual)是另一个很重要的知识来源。在他们的技术网站TechNet上(http://technet.oracle.com)你可以访问所有的Oracle在线文档。你必须注册一个账号,但是它是免费的。每个都应该在TechNet上有一个账号。

    步骤#3: 开始学习基本的数据库管理工作 –这难道不是你最开始在这里的原因?为什么它在列表的第三位?我们尝试着建造一个知识的金字塔,我强烈的感觉到一个人需要知道关系型数据库理论和SQL,并且在你学习如何进行基本的数据库管理工作时把他们当作工具来使用。这些工作包括启动和关闭数据库,备份和恢复数据库,以及创建/删除/修改数据库对象。对于Oracle数据库管理而言,在市面上有大量的书籍可以给你所期望的一个很好的体会。这本书是Oracle 9i DBA手册(Oracle 9i DBA Handbook by Loney on Oracle Press)。我知道的大多数DBA都在他们事业的早期不只一遍的阅读过这本书。这里,你应该同时阅读和理解Oracle 9i 概念指导,Oracle 9i管理员指导,以及Oracle 9i备份与恢复指导(Oracle 9i Concepts Guide, the Oracle 9i Administrator’s Guide, and the Oracle 9i Backup and Recovery Guide)都来自Oracle文档。

    步骤#4: 阅读,阅读,再阅读 –由于你才刚开始你的DBA职业生涯,因此你正在开始为你的技能奠定基础。这需要一段很长的时间去形成,吸收和领会所有你将学到的知识。毫无疑问的,比你资深的DBA由许多工作要做,因此他们可能不会总是腾出大量时间辅导你的学习。你不得不靠自己学习很多东西。这就是阅读的目的。市面上有许多书籍可以解答许多数据库相关的话题。Oracle Press是Oracle公司的官方出版社,有大量的Oracle相关书籍。同时也有其他的出版社,如Wrox Press 和 O’Reilly Press。你也可以找到Oracle文档来阅读。并且还有许多网站和新闻组。尽可能多的读书使你能够继续下去。还有,不只一遍的阅读它们可以使你吸收你第一次阅读时错过的内容。

    步骤#5: 创建测试案例 –我经常看到初学者问一些很基础的问题,其实假如他们花一些时间来考虑,这些问题都是很容易解答的。毫无疑问的,在你开始学习Oracle的时候你会有许多的问题。看看这些问题你能不能自己回答出来。例如,我又一次被问到能不能向有唯一性约束的列中插入空值。最开始,这看上去也许不是很容易回答的问题。但它却是非常容易去试验的!只需要创建一个简单的表。在其中的一列,假如唯一性约束。尝试着在该列插入一个空值。有效么?你应该能够非常容易的回答出这个问题了。那么,为什么要创建这些案例呢?一个原因是这样做可以提高你解决问题的能力。创建这些案例需要的技能就是解决问题用到的技能。解决问题的技能将会对你的DBA事业有很大的帮助。另一个原因是随着你的事业的发展,你将经常需要创建更复杂的测试案例以便保证数据库和应用程序的成功。在将来,甚至简单的测试案例也可以组成更复杂的数据库和应用程序分解。

    步骤#6: 找一个良师 –一个良师能够为你的DBA生涯(或者其它类似的职业)引领方向。他们能够给你指示,回答问题以及在你的DBA的成长过程中帮助你节约一些时间。但愿这篇文章能够在你事业发展的一段时间内起到良师益友的作用。假如你与一名资深的DBA共同工作,那么那个人应该有责任为你的事业进行有益的指导。你也可以同时选择其他的人指导你。

    步骤#7: 参加本地用户群 –许多跨国家的城市有本地用户群,他们定期聚会讨论数据库相关的话题。假如可能,参加其中一个本地用户群。这将给你一个与他人相互交流的很好的方法。

    我如何能够从一名DBA初学者变为一个具有中级水平的DBA?

    你已经成为DBA一段时间了,你现在希望你的技术水平提高一阶么?下一步该怎么做?首先,往回看前面的部分,确认你已经完成了所有的步骤。彻底理解SQL语言是十分重要的。理解关系型数据库理论和掌握基本的数据库管理任务也是非常重要的。到如今,你应该阅读文档和其他书籍到已经郁闷了。假如没有,那么你还没准备好继续深造,增长你的DBA的技术水平。假如你已经准备好继续了,我已为你的继续深造准备了一些方法。

    步骤#1: 学习操作系统和你的服务器硬件 – 正如我前面所说,数据库存在于操作系统和服务器硬件之上。理解这些组成部分如何工作是很必要的。你应该知道如何与特殊的操作系统相合。你如何删除或者编辑文件?假如你的操作系统是Unix,你应该掌握命令行以及Unix命令如何辅助你工作。对于运行在Windows或其他操作系统上而言也是一样的。你同时需要对服务器的硬件有一定的了解。物理内存和虚拟内存有什么区别?RAID是什么以及不同的级别是如何产生影响的?为什么数据库喜欢更多的物理硬盘而非一个大硬盘卷?你需要知道这些事情以便你能够容易的与系统管理员进行如何配置好你的服务器以便使它能够充分的支持数据库方面的交谈。

    步骤#2: 学习应用程序设计因为它与数据库相关 – 如前面所述,数据库存在于操作系统与数据库应用程序之间。你真的需要这两者。SQL语言是如何帮助创建好的应用程序的?绑定变量是什么并且为什么他们很重要?Tom Kyte 写了一本非常好的书,在Oracle应用程序设计上给出了很好的建议。他的Expert One-on-one Oracle书可在 Wrox Press找到。我强烈推荐阅读此书。他详细的叙述了那些能够生成和破坏Oracle应用程序的东西。你需要知道这些,因为你的应用程序开发人员希望从你这里得到指导和数据库知识。学习任何与应用程序设计有关的知识。也许参加一个关于软件工程,操作系统或数据结构的课程班会有好处。

    步骤#4: 取得认证 – 也许你的工作并不需要,但是取得认证一定对你有益。作为DBA的每一天里,你学到了许多新的和令人激动的事情。也许在你职业生涯的这段时间里,有几天你没学到任何新的东西。但你仍然有很多要学习。成为一名OCP(Oracle Certified Professional) DBA要求你必须已经学到了数据库管理所有方面的基础。我发现在OCP考试的学习过程中,我学到了在我工作中从未接触过的东西。一次我学到了我从未碰到过的一个特殊课题,在后来的日子里我就能够使用那个知识解决问题。假如我从为在OCP考试中学倒它,那么我永远也不会用那种特殊的方法去解决问题。这已经一次次的发生在我的面前。有的人可能会说认证实际上真的不值得。我要说它只会对你有益无害。所以,去取得认证吧!

    步骤#5: 获得一个资源库 – 在前面的部分中,我指出每个DBA都应该在Technet上有个账号。这是你其中一个主要资源。但是同时还有许多其他资源。很多人共享他们的Oracle知识。假如你还没有开始,你应该用网络浏览器去搜索并收集很多Oracle资源。愿意的话,你可以从访问我的网站(http://www.peasland.net)开始。下面是一些Oracle DBA必须了解得网站列表:
    Ask Tom – http://asktom.oracle.com
    Jonathan Lewis web site – http://www.jlcomp.demon.co.uk/
    Ixora (Steve Adams) – http://www.ixora.com.au
    Orapub – http://www.orapub.com
    Metalink (Oracle支持网站) – http://metalink.oracle.com

    还有许多其它的好网站。

    步骤#6: 开始在不同的新闻组和论坛上交流 – 也许你已经发现了他们,但假如现在你还没有那么是时候去开始了。有许多的新闻组和论坛可以回答你的任何Oracle问题。在Oracle群落里还有许多高手愿意和你共享他们的知识。你所要做的就是提问。下面是一个列表包含了可以开始交流的最好的因特网团体:

    Usenet newsgroups – comp.databases.oracle.server 和 comp.databases.oracle.misc 是两个可以交流的非常著名的世界性的新闻组。他们拥有大量的针对Oracle问题的交流卷宗。观看这些组的最好的方法式使用新闻广播员。但是假如你想通过基于web的方式访问,也可以通过Google搜索引擎搜索它。 (http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&group=comp.databases.oracle)
    Quest Pipelines – 当他们在最开始还属于软件提供商RevealNet的时候,被称为the RevealNet Pipelines。现在,Quest购买了RevealNet 并且拥有Pipelines 。因为Pipelines是中等的,所以这些是我最喜欢的。你可以在这里找到Pipelines (http://www.quest-pipelines.com/index.asp)。

    观察别人是如何经历考验和磨难的是一件好事。假如你有问题,可以自由的在群里提出来。假如你要提出问题,通常应该包括一些信息,比如你的Oracle版本和Oracle运行的平台。这些将会得到有很大的差别的答案。假如你忘记了,会有人提醒你!甚至你不用提问也可以从其他人的答案中学到许多知识。我已经记不得多少次我之所以能够解决问题完全是因为我记得其他人在新闻组里问过相同的问题。

    我如何从一名具有中级水平的DBA转变为一名高级DBA?

    好,作为DBA你已经坚持不懈的努力了很长时间。你感到自己已经准备好往前再走一步。成为一名高级DBA需要什么?下面的部分将帮助你走下去。

    步骤#1: 阅读所有的文档 – Oracle文档通常并不是很容易阅读的。无数次,你翻阅文档只是为了要弄清整件事情。假如文档是最好的东西,那么那些站在你的书架里的Oracle书籍就不会有市场。但是文档确实包含了一些无法在任何其他地方找到的信息。例如,你无法找到每一个专门的INIT.ORA参数或V$视图的详细说明。书本上也许会涉及一部分,但是Oracle文档却包含它们所有。我遇到过一个非常厉害的高级DBA,他没有从头至尾的阅读过Oracle文档。这不是偶然的。Oracle文档是必须阅读的。也许到现在为止你已经读过Oracle概念指导十二遍了。但是当Oracle 10i发布了,你还要再次阅读。任何有关10i的新概念将在文档里记录。假如你真的想更上一层,那么,去阅读那些文档。不要逃避它。

    步骤#2: 成为一名专家 – Oracle数据库是一个非常复杂的东西。为了更上一层,你必须精通产品的许多组成部分。以备份与恢复开始。成为一名备份与恢复的专家。故意的破坏数据库然后察看如何恢复它。尝试以任何可能的方式破坏数据库然后查看还有没有可能恢复。你将彻底的理解备份与恢复的概念。在你成为了备份与恢复的专家以后,再去成为其他领域的专家。你会有无穷无尽的题目要去掌握。在你整个职业生涯中都保持如此。但是请记住,无论你有多么专业,在某些领域,某些人会在某些方面知道的比你多。不要带个人情绪。只是尽可能多的从那个人那里学到知识。

    Route #3: 积极参加新闻组,论坛和用户组 – 在前面,我提过为什么不同的新闻组和论坛是学习新知识的很好的地方。现在轮到你进行下一步并且去回答任何你能够回答的问题。你将会惊讶于在这过程中你能学到那么多!

    Route #4: 写白皮书并且展示它们 – 这与前面提到的方法类似。首先,共享你拥有的知识是很重要的。假如你的职业生涯已经走到这一步,那么从某种意义上讲,是离不开他人的贡献的。所以,现在是你为他人奉献的时候了。第二,当你企图共享你的信息的时候会有令人惊异的事情发生。在你要用清楚的,简练的语言表述问题以便其他人能够使用时,那些信息在你的头脑里经过了一个令人瞠目的过程。这个过程使你巩固了知识,这是无法通过其它方法进行的。所以在白皮书中共享那些信息,讨论会,以及新闻组和论坛都是你学习和使你的能力更上一层的非常好的方法。顺着这条路,你应该作两件事。第一,认识到你将会犯错误。其他人将会很高兴的指出那些错误,有时在某种意义上那并不是很好。不要企图掩藏你的错误。承认它们并从它们那里学习。第二,学会说你不知道答案而不是企图以欺骗的方式通过。人们早晚会知道你在企图蒙蔽他们。简单的告诉他们现在你对答案并不肯定,但你会在查到答案后回来告诉他们。假如你时刻谨记这两件事,你就不会违背你的诚实而且你将成长为一名职业的IT人。

    步骤#5: 成为解决Oracle问题的专家– 高级DBA通常都是被看作是解决复杂的Oracle问题的人。你将会用到你所有的技术来解决许多问题,这些技术都是你的职业生涯中积累下来的。我前面提到的任何事都将会在解决问题的过程中用到;文档,书籍,新闻组,测试案例,和其它DBA都将辅助你解决问题。

    步骤#6: 成为性能调优的专家– 高级DBA通常都是被看作是调整数据库和应用程序性能的人。假如你是高级DBA但是你却不能分析性能瓶颈,那么你的公司将会到别处寻找这些服务。

    步骤#7: 成为承载能力计划的专家– 高级DBA通常都是被看作是根据数据增长量和交易增长来计划数据库承载能力的人。高级DBA需要在影响应用程序性能以前发现系统瓶颈。例如,DBA应该知道在数据库将可用的磁盘空间用完以前预置更多的磁盘空间。不密切关注承载能力计划将会导致生产数据库宕机。

    步骤#8: 密切关注新的技术– 高级DBA应该对IT界的关数据库技术的未来有好的建议。有什么可用的技术可以帮助数据库?例如,学习存储领域网的优缺点以及如何把它们应用到数据库系统。有什么技术在不远的将来可以用,哪些能够帮助我们?例如,写这篇文章的时候,linux操作系统正在变得越来越流行。Lunix会给你的数据库操作系统平台带来些什么?它能为你的公司工作么?

    结论

    从获得第一份工作,到从一名初级的DBA成长成一名高级DBA,我希望这篇文章在如何度过你的职业生涯的各个阶段方面给了你一些建议。无论你现在处在你的DBA职业生涯的哪一阶段都可以用到这篇文章。






    oracle的入门心得


    oracle的体系太庞大了,对于初学者来说,难免会有些无从下手的感觉,什么都想学,结果什么都学不好,所以把学习经验共享一下,希望让刚刚入门的人对oracle有一个总体的认识,少走一些弯路。

    一、定位
        oracle分两大块,一块是开发,一块是管理。
       开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form。有点类似于程序员,需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭J;
       管理则需要对oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验。

       因为数据库管理的责任重大,很少公司愿意请一个刚刚接触oracle的人去管理数据库。对于刚刚毕业的年轻人来说,可以先选择做开发,有一定经验后转型,去做数据库的管理。当然,这个还是要看人个的实际情况来定。
    二、学习方法
    我的方法很简单,就是:看书、思考、写笔记、做实验、再思考、再写笔记

    看完理论的东西,自己静下心来想想,多问自己几个为什么,然后把所学和所想的知识点做个笔记;在想不通或有疑问的时候,就做做实验,想想怎么会这样,同样的,把实验的结果记下来。思考和做实验是为了深入的了解这个知识点。而做笔记的过程,也是理清自己思路的过程。

         学习的过程是使一个问题由模糊到清晰,再由清晰到模糊的过程。而每次的改变都代表着你又学到了一个新的知识点。

        学习的过程也是从点到线,从线到网,从网到面的过程。当点变成线的时候,你会有总豁然开朗的感觉。当网到面的时候,你就是高手了

        很多网友,特别是初学的人,一碰到问题就拿到论坛上来问,在问前,你有没有查过书,自己有没有研究过,有没有搜索一下论坛?这就叫思维惰性。由别人来回答你的问题,会让你在短时间内不费劲地弄懂这个知识点,然而通过自己的努力去研究它,不但会更深入的了解这个知识点,更重要的是在研究的过程会提高你解决问题和分析问题的能力。总的来说,没有钻研的学习态度,不管学什么东西,都不会成功的。
           
        当然,初学的人很多时候是因为遇到问题时,无从下手,也不知道去哪里找资料,才会到论坛上提问题的。但我认为,在提问的时候,是不是可以问别人是如何分析这个问题?从哪里可以找到相关的资料?而不是这个问题的答案是什么?授人以鱼不如授人以渔。

       下面我讲下我处理问题的过程

       首先要知道oracle的官方网站:www.oracle.com 这里有oracle的各种版本的数据库、应用工具和权威的官方文档。其次,还要知道http://metalink.oracle.com/ 这里是买了oracle服务或是oracle的合作伙伴才可以进去的,里面有很多权威的解决方案和补丁。然后就是一些著名网站:asktom.oracle.com www.orafaq.net, www.dbazine.com。这里有很多经验之谈。

          遇到问题了。如果是概念上的问题,第一时间可以找tahiti.oracle.com,这里会给你最详细的解释。如果在运行的过程中出了什么错误。可以去metalink看看。如果是想知道事务的处理的经验之谈。可以去asktom。当然。这里只是相对而言。

    三、oracle的体系
    oracle的体系很庞大,要学习它,首先要了解oracle的框架。在这里,简要的讲一下oracle的架构,让初学者对oracle有一个整体的认识。

    1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成)
    控制文件:包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件
    数据文件:存储数据的文件
    重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件
    参数文件:定义Oracle 例程的特性,例如它包含调整SGA 中一些内存结构大小的参数
    归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
    密码文件:认证哪些用户有权限启动和关闭Oracle例程

    2、逻辑结构(表空间、段、区、块)
    表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。
    段:是对象在数据库中占用的空间
    区:是为数据一次性预留的一个较大的存储空间
    块:ORACLE最基本的存储单位,在建立数据库的时候指定

    3、内存分配(SGA和PGA)
    SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
    PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收

    4、后台进程(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程)
    数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件
    日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件
    系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
    进程监控:负责在一个Oracle 进程失败时清理资源
    检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
    归档进程:在每次日志切换时把已满的日志组进行备份或归档
    服务进程:用户进程服务。
    用户进程:在客户端,负责将用户的SQL 语句传递给服务进程,并从服务器段拿回查询数据。

    5、oracle例程:Oracle 例程由SGA 内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。

    6、SCN(System Change Number):系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
    四、深入学习


    管理:可以考OCP证书,对oracle先有一个系统的学习,然后看Oracle Concepts、oracle online document,对oracle的原理会有更深入的了解,同时可以开始进行一些专题的研究如:RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&RECOVER等等。

    开发:对于想做Oracle开发的,在了解完Oracle基本的体系结构之后,可以重点关注PL/SQL及Oracle的开发工具这一部分。 PL/SQL主要是包括怎么写SQL语句,怎么使用Oracle本身的函数,怎么写存储过程、存储函数、触发器等。 Oracle的开发工具主要就是Oracle自己的Developer Suite(Oracle Forms Developer and Reports Developer这些),学会如何熟练使用这些工具。

    五、开发经验及常见问题


    常见Oracle安装问题说明 [当前帖子数:5]
    1.问题集锦一
    2.Oracle9i在RedhatLinux8.0中的安装详细步骤
    3.问题集锦二
    4.如何配置和使用iSQL*Plus
    5.Oracle9i中Data Guard的新特性以及配置使用

    常见Oracle入门问题说明 [当前帖子数:5]
    1.关于Linux下DBSTART和DBSHUT脚本中需要修改的地方
    2.如何将EXP出来的数据IMP进不同的表空间
    3.如果系统中安装了多个数据库实例,如何修改默认SID
    4.Oracle9i初始化参数注解
    5.关于Oracle数据库的升级(Migration)

    常见Oracle开发问题说明 [当前帖子数:0]

    Oracle技巧与提示 [当前帖子数:3]
    1.如何修改数据库的字符集
    2.如何查看Control File中保存的内容
    3.Oracle9i(Version 9.2)SYS_CONTEXT函数的用法以及同USERENV函数的比较
    六、共享


    介绍几本oracle入门的好书

    oracle官方文档:《concept》上面讲了oracle的体系和概念,很适合初学者看。

    OCP的教学用书,也就是STUDY GUIDE(SG)。在我的FTP上有down。

    Oracle8i 备份恢复手册
    Oracle8高级管理与优化
    Oracle8i PLSQL程序设计
    Oracle8数据库管理员手册
    以上书本都是机械工业出版社出版。



    介绍几个网站
    http://tahiti.oracle.com      oracle的官方文档
    http://metalink.oracle.com/   oracle的技术支持网站。需要购买Oracle服务才能有一个帐号,才能登陆,有大量的Knowledge Base,大量问题解决经验。
    http://www.oracle.com   oracle的官方网站,可以在这里down oracle的软件、官方文档和获得最新的消息
    http://www.dbazine.com/    Oracle的杂志
    http://asktom.oracle.com   
    http://www.orafaq.net/ 
    http://www.ixora.com.au/
    http://www.oracle-base.com
    http://www.dba-oracle.com/oracle_links.htm




    www.boobooke.com最新网站
    www.boobooke.com/index_old.php这上面视频多又全
    http://www.boobooke.com/bbs/viewthread.php?tid=1857&extra=page%3D1
    小布老师Oracle 9i DBA Fundamentals I的系列视频下载地址
    在线播放地址:
    第一讲:  
    http://www.boobooke.com/v/bbk1109
    第二讲:  
    http://www.boobooke.com/v/bbk1110
    第三讲:  
    http://www.boobooke.com/v/bbk1112
    第四讲:  
    http://www.boobooke.com/v/bbk1114
    第五讲:  http://www.boobooke.com/v/bbk1115
    第六讲:  http://www.boobooke.com/v/bbk1148
    第七讲:  http://www.boobooke.com/v/bbk1149
    第八讲:  http://www.boobooke.com/v/bbk1150
    第九讲:  http://www.boobooke.com/v/bbk1151
    第十讲:  http://www.boobooke.com/v/bbk1152
    第十一讲: http://www.boobooke.com/v/bbk1153
    第十二讲: http://www.boobooke.com/v/bbk1154
    第十三讲: http://www.boobooke.com/v/bbk1161
    第十四讲: http://www.boobooke.com/v/bbk1162
    第十五讲: http://www.boobooke.com/v/bbk1163
    第十六讲: http://www.boobooke.com/v/bbk1164
    第十七讲: http://www.boobooke.com/v/bbk1165
    第十八讲: http://www.boobooke.com/v/bbk1166
    第十九讲: http://www.boobooke.com/v/bbk1167
    第二十讲: http://www.boobooke.com/v/bbk1168
    第二十一讲: http://www.boobooke.com/v/bbk1169
    第二十二讲: http://www.boobooke.com/v/bbk1170
    第二十三讲: http://www.boobooke.com/v/bbk1171
    第二十四讲: http://www.boobooke.com/v/bbk1179
    第二十五讲: http://www.boobooke.com/v/bbk1180

    下载地址:
    第一讲:  http://www.boobooke.com/v/bbk1109.zip
    第二讲:  http://www.boobooke.com/v/bbk1110.zip
    第三讲:  http://www.boobooke.com/v/bbk1112.zip
    第四讲:  http://www.boobooke.com/v/bbk1114.zip
    第五讲:  http://www.boobooke.com/v/bbk1115.zip
    第六讲:  http://www.boobooke.com/v/bbk1148.zip
    第七讲:  http://www.boobooke.com/v/bbk1149.zip
    第八讲:  http://www.boobooke.com/v/bbk1150.zip
    第九讲:  http://www.boobooke.com/v/bbk1151.zip
    第十讲:  http://www.boobooke.com/v/bbk1152.zip
    第十一讲: http://www.boobooke.com/v/bbk1153.zip
    第十二讲: http://www.boobooke.com/v/bbk1154.zip
    第十三讲: http://www.boobooke.com/v/bbk1161.zip
    第十四讲: http://www.boobooke.com/v/bbk1162.zip
    第十五讲: http://www.boobooke.com/v/bbk1163.zip
    第十六讲: http://www.boobooke.com/v/bbk1164.zip
    第十七讲: http://www.boobooke.com/v/bbk1165.zip
    第十八讲: http://www.boobooke.com/v/bbk1166.zip
    第十九讲: http://www.boobooke.com/v/bbk1167.zip
    第二十讲: http://www.boobooke.com/v/bbk1168.zip
    第二十一讲: http://www.boobooke.com/v/bbk1169.zip
    第二十二讲: http://www.boobooke.com/v/bbk1170.zip
    第二十三讲: http://www.boobooke.com/v/bbk1171.zip
    第二十四讲: http://www.boobooke.com/v/bbk1179.zip
    第二十五讲: http://www.boobooke.com/v/bbk1180.zip

    .......


     

  • [转] LINUX下安装ORACLE 10G

    2009-06-17 17:21:43

    ORACLE官方文档:

    http://www.oracle.com/technology/global/cn/pub/articles/smiley_10gdb_install.html

      在linux下安装oracle是一件令人生畏的事情,其复杂程度远远超过安装linux操作系统本身。如果能够进行成功的安装oracle,那么同时也就顺便掌握了linux一些技术。本文介绍在redhat linux 下安装oracle 10g 的方法。在这里说明一下,Oracle 10g的g是grid 的缩写,意为网格,目前较为前沿的网络计算技术。

      Oracle 10g 对软硬件的要求都非常的高,所以要玩转的话的花不少银子。首先来看看它对硬件的要求:内存512兆(建议1G),cpu 主频2.0G以上,硬盘转速7200转以上(建议使用scsi硬盘),依此条件,我看买台服务器才行。其次是软件要求:在oracle 官方的文档里,对于x86系列支持的操作系统只有3种(radhat ES/AS 2.1(x86),redhat ES/AS 3(x86),unitedlinux1.0(x86) ),如果只有redhat 9也是可以安装的,不过要麻烦一点点。当然oracle 10g需要更多的软件模块才能进行安装,这些软件模块我将在后面逐一说明。在本例中,使用RedHat ES 3(x86)作为操作平台,并且安装了xwindow。

      接下来,我们检查是否符合oracle 10g 的安装要求,以表格的形式列出。首先是硬件情况。以root登录系统,并且启动x-window.如果用下表命令输出的值大于或等于建议值,请

      检查项目 命令/方法 建议值

      内存 #grep MemTotal /proc/meminfo 512MB

      交换分区 #grep SwapTotal /proc/meminfo 1GB

      /tmp目录空闲区 #df –k /tmp 400MB

      硬盘空闲空间 #df -k 4GB

      继续往下,检查软件需求。对redhat ES 3(x86),需要如下的软件包:

      · Gnu gcc package, gcc-3.2.3-2 or 更高

      下面的包也必须被安装:· make-3.79· binutils-2.11· openmotif-2.2.2-16· setarch-1.3-1 · compat-db-4.0.14.5· compat-gcc-7.3-2.96.122· compat-gcc-c++-7.3-2.96.122· compat-libstdc++-7.3-2.96.122· compat-libstdc++-devel-7.3-2.96.122

      为了保证系统满足需求,执行下面的步骤检查安装的linux版本和安装的套件。

      检查项目 命令/方法 建议值

      Linux 版本 #cat /etc/issue ES 3

      已安装的包 #rpm -q package_name 安装所需包(上表所列)

      到这里我们已经全面的检查了安装oracle 10g所要求的软硬件环境,接着我们就要为安装创建组和用户。

      下面的组和用户必须存在

      The oinstall group (the oracle inventory group)

      The dba group (the OSDBA group)

      The oracle user (the oracle owner)

      如果上面的组和用户不存在,用下面的步骤创建它们。(1)先查看这些组和用户是否存在:

      #grep oinstall /etc/group

      #grep dba /etc/group

      (2)创建安装oracle 所需的组和用户

      #groupadd osintall

      #groupadd dba

      #useradd –g oinstall –G dba oracle 检查一下oracle 是否属于组 oinstall 和 dba (#id oracle) 再给oracle 设置一个用户口令 #passwd oracle 输入两次密码。

      创建安装所需的目录 /u01/app/oracle (the oracle base directory), /u02/oradata (an optional default directory ),用下表的命令形式创建它.然后改变它的目录权限。

      创建目录 更改权限

      #mkdir –p /u01/app/oracle #chown –R oracle:Oinstall /u01/app/oracle /u02/oradata

      #mkdir –p /u02/oradata #chmod –R 755 /u01/app/oracle /u02/oradata

      配置内核参数,下表是oracle 推荐的内核参数值,请参考。

      Parameter Value File

      semmslsemmnssemopmsemmni 25032000100128 /proc/sys/kernel/sem

      shmall 2097152 /proc/sys/kernel/shmall

      shmmax Half the size of physical memory /proc/sys/kernel/shmmax

      shmmni 4096 /proc/sys/kernel/shmmni

      file-max 65536 /proc/sys/fs/file-max

      ip_local_port_range 1024 65000 /proc/sys/net/ipv4/ip_local_port_range

      确保当前的参数值大于或等于上表所列。那么怎样查看这些参数值呢?用命令 #/sbin/sysctl –a | grep <参数名>,例如查看semmsl,用 #/sbin/sysctl -a | grep sem,余下的与此类似。逐个察看这些参数值,如果参数值不满足要求,就需要修改它们。请完成下面这些步骤

      a.用文本编辑器,创建或者编辑/etc/sysctl.conf文件,添加或修改如下的行

      kernel.shmall = 2097152

      kernel.shmmax = 2147483648

      kernel.shmmni = 4096

      kernel.sem = 250 32000 100 128

      fs.file-max = 65536

      net.ipv4.ip_local_port_range = 1024 65000

      b.改变当前内核参数的值,用命令 #/sbin/sysctl –p 来实现。

      为了提高在linux系统上运行软件的性能,必须对oracle用户设置下列shell 限定。

      Shell Limit Item in limits.conf Hard Limit

      Maximum number of open file descriptors nofile 65536

      Maximum number of processes available to a single user nproc 16384

      现在创建这些限定:

      1. 加入下面的行到文件/etc/security/limits.conf

      * soft nproc 2047

      * hard nproc 16384

      * soft nofile 1024

      * hard nofile 65536

      2. 加入下面的行到文件/etc/pam.d/login ,假如它不存在的话

      session required /lib/security/pam_limits.so

      3.根据oracle 用户的默认shell,对默认 shell start-up文件作如下改变,如果是Bourne, Bash, or Korn shell,修改环境变量/etc/profile文件如下:

      if [ $USER = "oracle" ]; then

      if [ $SHELL = "/bin/ksh" ]; then

      ulimit -p 16384

      ulimit -n 65536

      else

      ulimit -u 16384 -n 65536

      fi

      fi

      如果是c shell,则环境变量文件 /etc/csh.login的修改值如下:

      if ( $USER == "oracle" ) then

      limit maxproc 16384

      limit descriptors 65536

      endif

      接下来挂接光盘,#mount /dev/cdrom /mnt/cdrom 。

      以oracle 用户名登录系统,配置oracle 用户的环境。以oracle 帐号用安装器来安装oracle,但是开始运行安装器之前,还得设定oracle用户的环境变量,因此必须:

      ● 设置shell startup文件的umask 为022

      ● 设置DISPLAY, ORACLE_BASE, and ORACLE_SID 的环境变量。下面这些步骤是对这些环境变量进行设置的方法:

      1、 开启一个终端会话

      2、 确认xwindow 能正常显示。#xhost +

      3、 改变用户为oracle. $ su – oracle

      4、 检查oracle用户的默认shell. $echo $SHELL

      5、 用文本编辑器修改oracle用户的环境变量

      ●bash shell on redhat

      $vi .bash_profile

      ●c shell

      %vi .login

      6、 把下面的行插入上面编辑的文件中

      umask 022

      7、 保存文件并退出

      8、 运行shell开始脚本:

      ●Bash shell on Red Hat $ . ./.profile

      ●C shell % source ./.login

      9、设置环境变量

      ●Bash shell

      $ ORACLE_BASE=/u01/app/oracle

      $ ORACLE_SID=sales

      $ export ORACLE_BASE ORACLE_SID

      ●c shell

      % setenv ORACLE_BASE /u01/app/oracle

      % setenv ORACLE_SID sales

      10、确认ORACLE_HOME and TNS_ADMIN 的环境变量不被用户设置

      ●Bash shell

      $ unset ORACLE_HOME

      $ unset TNS_ADMIN

      ●c shell

      % unsetenv ORACLE_HOME

      % unsetenv TNS_ADMIN

      11、再检验一下上面设定的环境变量是否正确。

      $ umask

      $ env | more

      哎呀!终于算是完成准备工作了,喝口水,伸伸懒腰。进入安装器(runInstaller)所在的目录,执行 ./runInstaller 按步骤进行安装即可。

  • [转] ORACLE数据库占用大量硬盘空间常规解决方法

    2009-04-13 13:26:14

    转自:

    http://blog.donews.com/webspider/archive/2009/02/16/1469472.aspx

    通常ORACLE数据库占用硬盘空间过大的原因有这么几个(以oracle 10.2.0版本为例):
    1、oracle的安装目录...\oracle\product\10.2.0\admin\orcl\udump目录下,追踪日志文件占用大量硬盘空间;
    2、oracle的安装目录...\oracle\product\10.2.0\oradata\orcl目录下,UNDO表空间文件占用大量硬盘空间。

    针对以上两个问题,解决方法如下。
    第一个问题解决方法:
    udump目录下面是oracle的追踪日志文件,如果平常不去关心的话,建议删除掉。对数据库不会造成影响。另外在SQLPLUS中输入:
    alter system set sql_trace =false;
    如果需要保留追踪日志文件的,那可以给设定一个限额。命令行如下:
    alter  system  set  max_dump_file_size='100m' ;
    注:max_dump_file_size默认大小值的单位是数据块,因此如果限定了大小为100M,需要加单引号。

    第二个问题的解决方法:
    需要回收UNDO表空间。先创建一个新的过度的表空间UNDOTBS02,将UNDO表空间指向到UNDOTBS02,然后DROP原来的表空间UNDOTBS01,删除UNDOTBS01.DBF文件,释放磁盘空间。接着创建新的表空间UNDUTBS01,再将UNDO表空间指向到新建表空间的UNDOTBS01,DROP过度的表空间UNDOTBS02。
    具体操作如下:
    1)、使用DBA登陆SQLPLUS。
    2)建立过度表空间undotbs02
    create undo tablespace undotbs02 datafile 'e:\undotbs02.dbf' size 100M;
    3)切换UNDO表空间为新的UNDO表空间
    alter system set undo_tablespace=undotbs02 scope=both;
    4)删除原UNDO表空间
    drop tablespace undotbs01 including contents;
    5)删除硬盘上...\oracle\product\10.2.0\oradata\orcl目录下的undotbs01.dbf文件。
    6)建立新的表空间undotbs01,切换UNDO表空间到新建的undotbs01,删除undotbs02表空间。方法同上。
    至此,完成了UNDO表空间回收。

    上面的操作是临时解决UNDO表空间过大的方法。Oracle的AUM(Auto Undo Management)从出生以来就经常出现只扩展,不收缩(shrink),通常我们可以设置足够的UNDO表空间大小,然后取消其自动扩展属性。



     

  • [转] Oracle数据库的锁

    2009-04-02 17:19:35

    转自:

    http://www.51testing.com/?uid-88979-action-viewspace-itemid-100935

    Oracle数据库的锁        

     

    数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。


     

    Oracle数据库的锁类型

    根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。

    DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

    当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。

    在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

    当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

    悲观封锁和乐观封锁

    一、悲观封锁
    锁在用户修改之前就发挥作用:
    Select ..for update(nowait)
    Select * from tab1 for update
    用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
    如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
    1:对返回结果集进行update或delete操作会发生阻塞。
    2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.

    原因分析
    此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
    同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.

    二、乐观封锁
    乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。

    阻塞

    定义:
    当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞
    INSERT
    UPDATE
    DELETE
    SELECT…FOR UPDATE


    INSERT

    Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。

    UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。

    Select …for update

    当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.


     

    死锁-deadlock

    定义:当两个用户希望持有对方的资源时就会发生死锁.
    即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
    例子:
    1:用户1对A表进行Update,没有提交。
    2:用户2对B表进行Update,没有提交。
    此时双反不存在资源共享的问题。
    3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
    4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
    起因:
    Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

    DML锁分类表


    表1 Oracle的TM锁类型
    锁模式 锁描述 解释 SQL操作
    0 none    
    1 NULL Select
    2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行

    Select for update、Lock for update、Lock row share

    3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作

    Insert、Update、Delete、Lock row share

    4 S(Share) 共享锁 Create index、Lock share
    5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
    6 X(Exclusive) 排它锁

    Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

     

    1.关于V$lock表和相关视图的说明
     

    Column
    Datatype
    Descrīption
    ADDR
    RAW(4 | 8)
    Address of lock state object
    KADDR
    RAW(4 | 8)
    Address of lock
    SID
    NUMBER
    Identifier for session holding or acquiring the lock
    TYPE
    VARCHAR2(2)
    Type of user or system lock
    The locks on the user types are obtained by user applications. Any process that is blocking others is likely to be holding one of these locks. The user type locks are:
    TM - DML enqueue   
    TX - Transaction enqueue
    UL - User supplied
    --我们主要关注TX和TM两种类型的锁
    --UL锁用户自己定义的,一般很少会定义,基本不用关注
    --其它均为系统锁,会很快自动释放,不用关注
    ID1
    NUMBER
    Lock identifier #1 (depends on type)
    ID2
    NUMBER
    Lock identifier #2 (depends on type)
    ---当lock type 为TM时,id1为DML-locked object的object_id
    ---当lock type 为TX时,id1为usn+slot,而id2为seq。
    --当lock type为其它时,不用关注
    LMODE
    NUMBER
    Lock mode in which the session holds the lock:
    • 0 - none
    • 1 - null (NULL)
    • 2 - row-S (SS)
    • 3 - row-X (SX)
    • 4 - share (S)
    • 5 - S/Row-X (SSX)
    • 6 - exclusive (X)
    --大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞。
    --往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个或几个TX锁,但他们的id1和id2是不同的,请注意
    REQUEST
    NUMBER
    Lock mode in which the process requests the lock:
    • 0 - none
    • 1 - null (NULL)
    • 2 - row-S (SS)
    • 3 - row-X (SX)
    • 4 - share (S)
    • 5 - S/Row-X (SSX)
    • 6 - exclusive (X)
    --大于0时,表示当前会话被阻塞,其它会话占有改锁的模式
    CTIME
    NUMBER
    Time since current mode was granted
    BLOCK
    NUMBER
    The lock is blocking another lock
    0, 'Not Blocking', /* Not blocking any other processes */
    1, 'Blocking', /* This lock blocks other processes */
    2, 'Global', /* This lock is global, so we can't tell */

    --该锁是否阻塞了另外一个锁
     

    2.其它相关视图说明


    视图名 描述 主要字段说明
    v$session 查询会话的信息和锁的信息。
    sid,serial#:表示会话信息。
    program:表示会话的应用程序信息。
    row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。
    lockwait :该会话等待的锁的地址,与v$lock的kaddr对应.
    v$session_wait 查询等待的会话信息。
    sid:表示持有锁的会话信息。
    Seconds_in_wait:表示等待持续的时间信息
    Event:表示会话等待的事件,锁等于enqueue
         
    dba_locks 对v$lock的格式化视图。
    Session_id:和v$lock中的Sid对应。
    Lock_type:和v$lock中的type对应。
    Lock_ID1: 和v$lock中的ID1对应。
    Mode_held,mode_requested:和v$lock中
    的lmode,request相对应。
    v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。
    Xidusn,xidslot,xidsqn:表示回滚段信息。和
    v$transaction相关联。
    Object_id:表示被锁对象标识。
    Session_id:表示持有锁的会话信息。
    Locked_mode:表示会话等待的锁模式的信
    息,和v$lock中的lmode一致。

     

    1.查询数据库中的锁

    select * from v$lock;
    select * from v$lock where block=1;

    2.查询被锁的对象

    select * from v$locked_object;

    3.查询阻塞

    查被阻塞的会话
    select * from v$lock where lmode=0 and  type in ('TM','TX');

    查阻塞别的会话锁
    select * from v$lock where lmode>0 and  type in ('TM','TX');

    4.查询数据库正在等待锁的进程

    select * from v$session where lockwait is not null;

    5.查询会话之间锁等待的关系

    selecta.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctimefromv$lock a,v$lock b
    wherea.id1=b.id1anda.id2=b.id2anda.block=
    1andb.block=0;

    6.查询锁等待事件
    select * from v$session_wait where event='enqueue';
     
    解决方案:
        SELECT sid, serial#, username, osuser FROM v$session; 
       ALTER SYSTEM KILL SESSION 'sid,serial';
       example:
       ALTER SYSTEM KILL SESSION '13, 8';
  • [转] ORACLE学习笔记-ORACLE(基本命令)

    2009-04-02 17:02:19

    转自:

    http://www.51testing.com/?uid-191521-action-viewspace-itemid-101703

    ORACLE第一章:

    --查看VGA信息:

     show sga;

     
    select * from v$sgastat;

    --可以通过以下几个动态性能视图查看信息:

     V$sysstat                系统统计信息
     V$sesstat                用户会话统计信息 
     V$pgastat               显示内存使用统计信息
     V$sql_workarea          SQL游标所用工作区的信息
     V$ sql_workarea_active    当前系统工作区的信息
    data_file:dba_data_files;
    control_file:从init.ora里面可以看到,D:ora92adminora92pfileinit.ora.
    redo_log:v$logfile;
    实际上D:ora92oradataora92里面放着很多东西。
    select * from v$database;里面可以查询archivelog的信息。
    段:dba_segments
    区:dba_extents

    --在V$process动态性能视图中可以查询到每个Oracle进程的PGA分配的内存和已使用的内存情况,
    --
    其中PGA_used_mem表示已使用的,pag_alloc_mem表示已分配的,pga_max_men表示PGA的最大值。

     SQL
    > select pid,pga_used_mem,pga_alloc_mem,pga_max_mem from v$process;

    --查看后台进程:

    SELECT * FROM v$bgprocess WHERE paddr <> '00';

    --查看所有的表空间;

     SQL
    > select tablespace_name from dba_data_files  order by tablespace_name;

    --查看表空间的名字及大小:
     SQL> select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size    
     
    from dba_tablespaces t, dba_data_files d    where t.tablespace_name = d.tablespace_name   
     
    group by t.tablespace_name;

    --创建表空间的语法是:
     CREATE TABLESPACE tablespacename
     DATAFILE 
    'filename' [SIZE integer [K|M]
     
    [AUTOEXTEND [OFF|ON]];
    --创建有多个数据文件的表空间:
     SQL> create tablespace  SALES
      datafile  
    'd:salesSALES_DATA01.dbf' size 10m autoextend on next 10m maxsize 100m,
      
    'd:salesSALES_DATA02.dbf' size 10m  autoextend   on next 10m maxsize
      unlimited,
    'd:salesSALES_DATA03.dbf' size 10m;

    --查看表空间的大小;

     SQL
    > SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 MB FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;

    --查看表空间中数据文件存放的路径:

     SQL
    > SELECT    TABLESPACE_NAME,  BYTES/1024/1024   FILE_SIZE_MB,  FILE_NAME    FROM DBA_DATA_FILES;


    insert into date_test values(interval '12' month,'adjf');测试interval 数据类型;


    删除表空间:
    SQL
    > drop tablespace worktbs including contents;
    表空间已丢弃。

    再次查询表空间会发现已经没有worktbs表空间了。
    如果我们再次删除表空间会出现什么后果?
    删除一个不存在的表空间:
    SQL
    > drop tablespace worktbs including contents;
    drop tablespace worktbs including contents
    *
    ERROR 位于第 
    1 行:
    ORA
    -00959: 表空间'WORKTBS'不存在
    o 为表空间增加数据文件
    SQL
    > alter tablespace sales add datafile 'd:oracleoradata est esttablespace
    sales_data04.dbf
    ' size 10m autoextend on next 10m maxsize 100m,
    'c:oracleoradata est esttablespacesales_data05.dbf' size 10m autoextend on next 10m maxsize unlimited, 'c:oracleoradata est esttablespacesales_data06.dbf' size 10m;

    表空间已更改。
    o 修改数据文件的大小
    o 在数据文件中的可用空间未使用完时,允许对数据文件进行压缩,当压缩空间大小超过未使用空间大小时,将会产生错误。
    SQL
    >  alter database datafile 'c:oracleoradata est esttablespaceSALES_DATA04.dbf' resize 30m;

    数据库已更改。
    o 关闭表空间数据文件的自动扩展属性
    alter database
    o     datafile  
    'c:SALES_DATA04.dbf' ,
    o                    
    'c:SALES_DATA05.dbf',
    o                     
    'c:SALES_DATA06.dbf'
    o                      autoextend  
    off;
    o 打开表空间数据文件的自动扩展属性
    alter database
    o     datafile  
    'c:SALES_DATA04.dbf' ,
    o                    
    'c:SALES_DATA05.dbf',
    o                     
    'c:SALES_DATA06.dbf'
    o                      autoextend  
    on;

    o 修改表空间属性(离线)
    alter tablespace   sales  offline;  
    o 修改表空间属性(在线)
    alter tablespace   sales  online;
    o 修改表空间属性(只读)
    alter tablespace   sales  read  only;
    o 修改表空间属性(读写)
    alter tablespace   sales  read   write;
    o 如下系统表空间不得设置为  offline   或者  
    read only
    o system  , 
    temp,undo  ,undotbs 

    o 移动表空间的数据文件
    1.  使表空间脱机(系统表空间不得脱机,故不得移动)
    2.  修改数据文件的名称
    3.  执行  alter  tablespace  rename  datafile 命令
    4.  使表空间联机
    o 第一步:
    alter  tablespace    sales  offline;  
    o 第二步:物理移动数据文件到目的地(可以是表空间的
    o                部分数据文件,可以修改数据文件的名称)
    o 第三步:    逻辑移动,修改控制文件的内容

    alter  tablespace sales  rename 
    o datafile 
    'c:sales01.dbf' to 'd:sales02.dbf'
    --可以有多个数据文件,但是源文件
    o 要在to的左边,目的文件要在to 右边,文件名称之间逗号分割.
    o 第四步: 将表空间联机
    alter   tablespace  sales   online;
    o 第五步:查询dba_data_files确认

    o 创建用户,指定默认表空间,磁盘配额
    o  
    create  user rose identified by rose   default
    o tablespace sales quota 10m 
    on sales;
    o 给用户授权
    grant   connect,resource,dba to rose;
    o 用户登录
    o connect   rose
    /rose
    o 创建表
    create table  emp(eid  number
    o 该表默认放在表空间  sales   中
    o 查询用户的存储限额dba_ts_quotas 
    o 删除表空间(如果该表空间为空)
    drop tablespace sales  ;
    o 删除表空间的同时删除数据文件(不为空)
    drop tablespace sales  including contents  and  datafiles;
    o 创建表的同时指定该表的存储位置
    o  
    create table mytab(tid  int ) tablespace sales;

    o 删除表空间(如果该表空间为空)
    drop tablespace sales  ;
    o 删除表空间的同时删除数据文件(不为空)
    drop tablespace sales  including contents  and  datafiles;
    o 创建表的同时指定该表的存储位置
    o  
    create table mytab(tid  int ) tablespace sales;


    o 查看当前用户每个表占用空间的大小:
    select  segment_name,sum(bytes)/1024/1024 from user_extents group by segment_name 
    o 查看每个表空间占用空间的大小:
    select tablespace_name,sum(bytes)/1024/1024 from dba_segments group by tablespace_name 


    只有用合法的用户帐号才能访问Oracle数据库
    Oracle 有几个默认的数据库用户  
    Scott
    /tiger

    创建一个名称为 martin 的用户,其密码为 martinpwd
    CREATE USER MARTIN IDENTIFIED BY martinpwd
    DEFAULT TABLESPACE USERS
    TEMPORARY TABLESPACE TEMP;

    GRANT 命令可用于为用户分配权限或角色;
    CONNECT角色允许用户连接至数据库,并创建数据库对象。
    GRANT CONNECT TO MARTIN; 

    RESOURCE角色允许用户使用数据库中的存储空间。
    GRANT RESOURCE TO MARTIN; 

    此系统权限允许用户在当前模式中创建序列,此权限包含在CONNECT角色中。
    GRANT CREATE SEQUENCE TO MARTIN; 

    GRANT CREATE SESSION TO MARTIN;

    GRANT CREATE TABLE TO MARTIN;

    GRANT CREATE VIEW TO MARTIN;

    GRANT CREATE SEQUENCE TO MARTIN;

     

    授予用户 MARTIN 操作emp表对象的权限 :
    允许用户查询 TEST 表的记录
    GRANT SELECT ON EMP TO MARTIN; 

    允许用户更新 TEST 表中的记录
    GRANT UPDATE ON EMP TO MARTIN; 

    允许用户插入、删除、更新和查询 TEST 表中的记录
    GRANT ALL ON EMP TO MARTIN; 


    ALTER USER 命令可用于更改口令:
    修改 MARTIN 用户的密码:
    ALTER USER MARTIN IDENTIFIED BY martinpass;
    DROP USER 命令用于删除用户: 
    删除 MARTIN 用户模式:
    DROP USER MARTIN CASCADE;


    alter session set nls_date_format='yyyy-mm-dd';

    create  查看(419) 评论(0) 收藏 分享 管理

  • 删除表空间(前提:误删除数据文件)

    2009-04-02 16:12:01

    误删除任一表空间对应的dbf文件之后,登陆数据库时提示有误

    在命令窗口下执行:

    sqlplus /nolog

    conn / as sysdba;

    shutdown immediate;

    startup restrict;

    提示:

    ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
    ORA-01110: 数据文件 6: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCL113\TEST.DBF'

    解决方法:

    shutdown immediate;
    startup mount;
    alter database datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCL113\TEST.DBF' offline drop;
    alter database open;
    drop tablespace test including contents;

  • [转] 改变临时表空间

    2009-03-26 12:02:10

    转自:

    http://www.51testing.com/?uid-117986-action-viewspace-itemid-109062

    删除临时表空间(drop temporary tablespace)

    不能直接删除数据库的默认临时表空间,但是我们可以把另外一个临时表空间切换成默认临时表空间,然后删除原先的临时表空间


    Step01:查看数据库的默认临时表空间
    SQL> select PROPERTY_NAME,PROPERTY_VALUE
      2  from DATABASE_PROPERTIES
      3  where
    PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';


    PROPERTY_NAME                     PROPERTY_VALUE
    ------------------------     --------------------------
    DEFAULT_TEMP_TABLESPACE             TEMP
    数据库默认的临时表空间是TEMP


    Step02:创建一个新的临时表空间TEMP_SWITCH
    SQL> CREATE TEMPORAR
    Y TABLESPACE TEMP_SWITCH
      2  TEMPFILE 'D:
    bo
    boTEMP_SWITCH.ora' SIZE 20M;
    表空间已创建。
    SQL>
    TEMPORARY
    表示创建的表空间是临时表空间
    TEMP_SWITCH
    是临时表空间的名字。
    TEMPFILE
    是关键字,用于指定临时文件。
    TEMP_SWITCH.ora
    是组成临时表空间的数据文件。
    SIZE 20M
    是组成临时表空间的临时文件TEMP_SWITCH.ora的大小。

    Step03:查看数据库中有哪些临时表空间。
    S
    QL> select distinct tablespace_name
      2  from dba_temp_files;

    TABLESPACE_NAME
    ------------------------------
    TEMP
    TEMP_SWITCH
    SQL>
           
    从输出可以看出,数据库中共有两个临时表空间(TEMPTEMP_SWITCH


    Step04:把默认临时表空间从TEMP切换到TEMP_SWITCH
    SQL> ALTER DATABASE DEFAULT TEMPORARY TAB
    LESPACE TEMP_SWITCH;
    数据库已更改。

    Step05:再次查看数据库的默认临时表空间
    SQL>select PROPERTY_NAME,PROPERTY_VALUE
      2 from DATABASE_PROPERTIES
      3 where PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
    PROPERTY_NAME                     PROPERTY_VALUE
    ------------------------   
      --------------------------
    DEFAULT_TEMP_TABLESPACE             TEMP_SWITCH

    Step06:删除原来的临时表空间
    drop tablespace TEMP
    ;

     

  • 增加临时表空间

    2009-03-26 11:58:40

    eg:ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/oradata/orcl/temp02.dbf' SIZE 200M;

    注意:关键字是tempfile而不是datafile。


     

  • [转] oracle用户权限及角色

    2009-03-26 11:43:50

    转自:

    http://www.51testing.com/?uid-117986-action-viewspace-itemid-106267

    每个Oracle用户都有一个名字和口令,并拥有一些由其创建的表、视图和其他资源。Oracle角色(role)就是一组权限(privilege)(或者是每个用户根据其状态和条件所需的访问类型)。用户可以给角色授予或赋予指定的权限,然后将角色赋给相应的用户。一个用户也可以直接给其他用户授权。

        数据库系统权限(Database System Privilege)允许用户执行特定的命令集。例如,CREATE TABLE权限允许用户创建表,GRANTANY PRIVILEGE权限允许用户授予任何系统权限。

       数据库对象权限(Database Object Privilege)使得用户能够对各个对象进行某些操作。例如DELETE权限允许用户删除表或视图的行,SELECT权限允许用户通过select从表、视图、序列(sequences)或快照 (snapshots)中查询信息。

    一、创建用户

      Oracle内部有两个建好的用户:SYSTEM和SYS。用户可直接登录到SYSTEM用户以创建其他用户,因为SYSTEM具有创建别的用户的权限。在安装Oracle时,用户或系统管理员首先可以为自己建立一个用户。例

       create user user01 identified by u01;

        该命令还可以用来设置其他权限,详细情况参见自学资料。要改变一个口令,可以使用alter user命令:

       alter user user01 identified by usr01;

        现在user01的口令已由“u01”改为“usr01”。

        除了alter user命令以外,用户还可以使用password命令。如果使用password命令,用户输入的新口令将不在屏幕上显示。有dba特权的用户可以通过password命令改变任何其他用户的口令;其他用户只能改变自己的口令。

        当用户输入password命令时,系统将提示用户输入旧口令和新口令,如下所示:

       password

        Changing password for user01

        Old password:

        New password:

        Retype new password:

        当成功地修改了口令时,用户会得到如下的反馈:

        Password changed

    、删除用户

        删除用户,可以使用drop user命令,如下所示:

       drop user user01;

      如果用户拥有对象,则不能直接删除,否则将返回一个错误值。指定关键字CASCADE,可删除用户所有的对象,然后再删除用户。下面的例子用来删除用户与其对象:

       drop user user01 CASCADE;

    、3种标准角色

        Qracle为了兼容以前的版本,提供了三种标准的角色(role):CONNECT、RESOURCE和DBA。

       1. CONNECT Role(连接角色)

        临时用户,特别是那些不需要建表的用户,通常只赋予他们CONNECTrole。CONNECT是使用Oracle的简单权限,这种权限只有在对其他用户的表有访问权时,包括select、insert、update和delete等,才会变得有意义。拥有CONNECT role的用户还能够创建表、视图、序列(sequence)、簇(cluster)、同义词(synonym )、会话(session)和与其他数据库的链(link)。

       2. RESOURCE Role(资源角色)

        更可靠和正式的数据库用户可以授予RESOURCE role。RESOURCE提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)和簇(cluster)。

       3. DBA Role(数据库管理员角色)

        DBA role拥有所有的系统权限----包括无限制的空间限额和给其他用户授予各种权限的能力。SYSTEM由DBA用户拥有。下面介绍一些DBA经常使用的典型权限。

       (1)grant(授权)命令

        下面对刚才创建的用户user01授权,命令如下:

       grant connect, resource to user01;

       (2)revoke(撤消)权限

        已授予的权限可以撤消。例如撤消(1)中的授权,命令如下:

        revoke connect, resource from user01;

       一个具有DBA角色的用户可以撤消任何别的用户甚至别的DBA的CONNECT、RESOURCE 和DBA的其他权限。当然,这样是很危险的,因此,除非真正需要,DBA权限不应随便授予那些不是很重要的一般用户。

        撤消一个用户的所有权限,并不意味着从Oracle中删除了这个用户,也不会破坏用户创建的任何表;只是简单禁止其对这些表的访问。其他要访问这些表的用户可以象以前那样地访问这些表。

    四、创建角色

       除了前面讲到的三种系统角色----CONNECT、RESOURCE和DBA,用户还可以在Oracle创建自己的role。用户创建的role可以由表或系统权限或两者的组合构成。为了创建role,用户必须具有CREATE ROLE系统权限。下面给出一个create role命令的实例:

       create role STUDENT;

        这条命令创建了一个名为STUDENT的role。

        一旦创建了一个role,用户就可以给他授权。给role授权的grant命令的语法与对对用户的语法相同。在给role授权时,在grant命令的to子句中要使用role的名称,如下所示:

       grant select on CLASS to STUDENT;

      现在,拥有STUDENT角色的所有用户都具有对CLASS表的select权限。

    五、删除角色

       要删除角色,可以使用drop role命令,如下所示:

      drop role STUDENT;

      指定的role连同与之相关的权限将从数据库中全部删除。

  • ORA-01658 unable to create INITIAL extent for segment in tablespace string

    2009-03-26 11:35:41

    在导库时出现:

    ORA-01658 unable to create INITIAL extent for segment in tablespace string

    具体原因:

    ORA-01658 unable to create INITIAL extent for segment in tablespace string

    Cause: Failed to find sufficient contiguous space to allocate INITIAL extent for segment being created.

    Action: Use ALTER TABLESPACE ADD DATAFILE to add additional space to the tablespace or retry with a smaller value for INITIAL.

    解决方法:

    有2个方法:
    1。增大现在表空间数据文件的大小.alter database datafile 'XXX' resize XXXXM;
    2。给这个表空间增加数据文件:alter  tablespace XXX add datifile 'XXX' size XXXM autoextend on next XXM maxsize XXXXM;



     

  • ORA-01940: 无法删除当前已连接的用户

    2009-03-25 10:04:23

    SQL> drop user a cascade;
    drop user a cascade
    *
    ERROR 位于第 1 行:
    ORA-01940: 无法删除当前已连接的用户

    解决方法:

    SQL> select username,sid,serial# from v$session;

    USERNAME                              SID    SERIAL#
    ------------------------------ ---------- ----------
                                            1          1
                                            2          1
                                            3          1
                                            4          1
                                            5          1
                                            6          1
                                            7          1
    SYS                                     8          3
    A                                       9          4

    已选择9行。

    SQL> alter system kill session'9,4';

    系统已更改。

    SQL> drop user a cascade;

    用户已丢弃

  • [转] oracle中得字符集

    2009-03-25 09:50:33

    一、什么是oracle字符集


      Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。

      影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下:

      NLS_LANG = language_territory.charset

      它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:

      Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN_AMERICA.ZHS16GBK

      从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
    所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。


    二、如何查询Oracle的字符集

      很多人都碰到过因为字符集不同而使数据导入失败的情况。这涉及三方面的字符集,
           1).oracel server端的字符集
           2).oracle client端的字符集
           3).dmp文件的字符集
        在做数据导入的时候,需要这三个字符集都一致才能正确导入。


    1、查询oracle server端的字符集

    有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:SQL>select userenv(‘language’) from dual;

      结果类似如下:AMERICAN_AMERICA.ZHS16GBK

    2、如何查询dmp文件的字符集

    用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

      SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;

      ZHS16GBK

      如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):

      cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

      然后用上述SQL也可以得到它对应的字符集。

    3、查询oracle client端的字符集

    这个比较简单。在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如:

      set nls_lang=AMERICAN_AMERICA.ZHS16GBK

      这样就只影响这个窗口里面的环境变量。

      在unix平台下,就是环境变量NLS_LANG。

      $echo $NLS_LANG

      AMERICAN_AMERICA.ZHS16GBK

      如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。

    三、修改oracle的字符集

      上文说过,oracle的字符集有互相的包容关系。如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。

      一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。

    1、修改server端字符集(不建议使用)

    在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,
    只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:

      $sqlplus /nolog

      SQL>conn / as sysdba;


      若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:

      SQL>STARTUP MOUNT;

      SQL
    >ALTER SYSTEM ENABLE RESTRICTED SESSION;

      SQL
    >ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

      SQL
    >ALTER SYSTEM SET AQ_TM_PROCESSES=0;

      SQL
    >ALTER DATABASE OPEN;

      SQL
    >ALTER DATABASE CHARACTER SET ZHS16GBK;

      SQL
    >ALTER DATABASE national CHARACTER SET ZHS16GBK;

      SQL
    >SHUTDOWN IMMEDIATE;

      SQL
    >STARTUP



     

    2、修改dmp文件字符集

    上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。

      具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,
    可以用以下SQL查出该种字符集对应的16进制代码:

      SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;

      0354


      然后将dmp文件的2、3字节修改为0354即可。

      如果dmp文件很大,用ue无法打开,就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,
    缺点是比较麻烦)。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。有兴趣的朋友可以研究一下程序代码

  • [转] oracle v$session每个字段的意义

    2009-03-23 17:06:00

    查看数据库连接
    select   *  from   v$session;
    中断回话
    ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

    v$session表每个字段的意义:
    $SESSION
    This view lists session information for each current session.

    Column   Datatype   Description  
    SADDR 
    RAW(4) 
    Session address 

    SID 
    NUMBER 
    Session identifier 

    SERIAL# 
    NUMBER 
    Session serial number. Used to identify uniquely a session's objects. Guarantees that session-level commands are applied to the correct session objects if the session ends and another session begins with the same session ID 

    AUDSID 
    NUMBER 
    Auditing session ID 

    PADDR 
    RAW(4) 
    Address of the process that owns this session 

    USER# 
    NUMBER 
    Oracle user identifier 

    USERNAME 
    VARCHAR2(30) 
    Oracle username 

    COMMAND 
    NUMBER 
    Command in progress (last statement parsed); for a list of values, see Table 3-7 

    OWNERID 
    NUMBER 
    The column contents are invalid if the value is 2147483644. Otherwise, this column contains the identifier of the user who owns the migratable session

    For operations using Parallel Slaves, interpret this value as a 4Byte value. The low-order 2Bytes of which represent the session number, and the high-order bytes the instance ID of the query coordinator 

    TADDR 
    VARCHAR2(8) 
    Address of transaction state object 

    LOCKWAIT 
    VARCHAR2(8) 
    Address of lock waiting for; NULL if none 

    STATUS 
    VARCHAR2(8) 
    Status of the session: ACTIVE (currently executing SQL), INACTIVE, KILLED (marked to be killed), CACHED (temporarily cached for use by Oracle*XA), SNIPED (session inactive, waiting on the client) 

    SERVER 
    VARCHAR2(9) 
    Server type: DEDICATED, SHARED, PSEUDO, NONE 

    SCHEMA# 
    NUMBER 
    Schema user identifier 

    SCHEMANAME 
    VARCHAR2(30) 
    Schema user name 

    OSUSER 
    VARCHAR2(15) 
    Operating system client user name 

    PROCESS 
    VARCHAR2(9) 
    Operating system client process ID 

    MACHINE 
    VARCHAR2(64) 
    Operating system machine name 

    TERMINAL 
    VARCHAR2(10) 
    Operating system terminal name 

    PROGRAM 
    VARCHAR2(48) 
    Operating system program name 

    TYPE 
    VARCHAR2(10) 
    Session type 

    SQL_ADDRESS 
    RAW(4) 
    Used with SQL_HASH_VALUE to identify the SQL statement that is currently being executed 

    SQL_HASH
    _VALUE 
    NUMBER 
    Used with SQL_ADDRESS to identify the SQL statement that is currently being executed 

    MODULE 
    VARCHAR2(48) 
    Contains the name of the currently executing module as set by calling the DBMS_APPLICATION_INFO.SET_MODULE procedure 

    MODULE_HASH 
    NUMBER 
    The hash value of the above MODULE 

    ACTION 
    VARCHAR2(32) 
    Contains the name of the currently executing action as set by calling the
    DBMS_APPLICATION_INFO.SET_ACTION procedure 

    ACTION_HASH 
    NUMBER 
    The hash value of the above action name 

    CLIENT_INFO 
    VARCHAR2(64) 
    Information set by the DBMS_APPLICATION_INFO.SET_CLIENT_INFO procedure 

    FIXED_TABLE
    _SEQUENCE 
    NUMBER 
    This contains a number that increases every time the session completes a call to the database and there has been an intervening select from a dynamic performance table. This column can be used by performance monitors to monitor statistics in the database. Each time the performance monitor looks at the database, it only needs to look at sessions that are currently active or have a higher value in this column than the highest value that the performance monitor saw the last time. All the other sessions have been idle since the last time the performance monitor looked at the database 

    ROW_WAIT_OBJ# 
    NUMBER 
    Object ID for the table containing the ROWID specified in ROW_WAIT_ROW# 

    ROW_WAIT_FILE# 
    NUMBER 
    Identifier for the datafile containing the ROWID specified in ROW_WAIT_ROW#. This column is valid only if the session is currently waiting for another transaction to commit and the value of ROW_WAIT_OBJ# is not -1 

    ROW_WAIT
    _BLOCK# 
    NUMBER 
    Identifier for the block containing the ROWID specified in ROW_WAIT_ROW#. This column is valid only if the session is currently waiting for another transaction to commit and the value of ROW_WAIT_OBJ# is not -1 

    ROW_WAIT_ROW# 
    NUMBER 
    The current ROWID being locked. This column is valid only if the session is currently waiting for another transaction to commit and the value of ROW_WAIT_OBJ# is not -1 

    LOGON_TIME 
    DATE 
    Time of logon 

    LAST_CALL_ET 
    NUMBER 
    The last call 

    PDML_STATUS 
    VARCHAR2(8) 
    If ENABLED, the session is in a PARALLEL DML enabled mode. If DISABLED, PARALLEL DML enabled mode is not supported for the session. If FORCED, the session has been altered to force PARALLEL DML. 

    PDDL_STATUS 
    VARCHAR2(8) 
    If ENABLED, the session is in a PARALLEL DDL enabled mode. If DISABLED, PARALLEL DDL enabled mode is not supported for the session. If FORCED, the session has been altered to force PARALLEL DDL. 

    PDML_ENABLED 
    VARCHAR2(3) 
    This column has been replaced by PDML_ENABLED and PDML_STATUS. See above. 

    FAILOVER_TYPE 
    VARCHAR2(10) 
    NONE if failover is disabled for this session, SESSION if client is able to failover its session following a disconnect, and SELECT if client is able to fail over selects in progress as well 

    FAILOVER
    _METHOD 
    VARCHAR2(3) 
    NONE if failover is disabled for this session, BASIC if client reconnects following a disconnect, PRECONNECT if the backup instance is able to support all connections from every instance that it is backup for 

    FAILED_OVER 
    VARCHAR2(13) 
    TRUE if running in failover mode and have failed over, otherwise FALSE 

    RESOURCE_CONSUMER_GROUP 
    VARCHAR2(32) 
    Name of the session's current resource consumer group

  • [转] ORA-12516错误的处理(修改连接数)

    2009-03-23 16:57:12

    ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程 

    解决过程


    1、查看当前会话数、processes和sessions值,发现session数和2个参数的值已经非常逼近


    SQL
    *Plus: Release 10.2.0.1.0 - Production on 星期一 10月 9 15:50:21 2006Copyright (c) 19822005, Oracle.  All rights reserved.

    SQL
    > conn / as sysdba
    已连接。SQL
    > select count(*from v$session;
    COUNT(*)----------     
      45

    SQL
    > show parameter processes
    NAME                                 TYPE        VALUE

    db_writer_processes                  integer     1
    gcs_server_processes                 
    integer     0
    job_queue_processes                  
    integer     10
    log_archive_max_processes            
    integer     2
    processes                            
    integer     50

    SQL
    > show parameter sessions
    NAME                                 TYPE        VALUE

    java_soft_sessionspace_limit         integer     0l
    icense_max_sessions                 
    integer     0
    license_sessions_warning             
    integer     0
    logmnr_max_persistent_sessions       
    integer     1
    sessions                             
    integer     60
    shared_server_sessions               
    integer


    2、修改processes和sessions值

    SQL> alter system set processes=300 scope=spfile;
    系统已更改。
    SQL
    > alter system set sessions=335 scope=spfile;
    系统已更改。


    3、查看processes和sessions参数,但更改并未生效

    SQL> show parameter processes
    NAME                                 TYPE        VALUE

    db_writer_processes                  integer     1
    gcs_server_processes                 
    integer     0
    job_queue_processes                  
    integer     10
    log_archive_max_processes            
    integer     2
    processes                            
    integer     50
    SQL
    > show parameter sessions
    NAME                                 TYPE        VALUE

    license_max_sessions                 
    integer     0
    license_sessions_warning             
    integer     0
    logmnr_max_persistent_sessions       
    integer     1
    sessions                             
    integer     60
    shared_server_sessions               
    integer


     4、重启数据库,使更改生效

    SQL> shutdown
    SQL
    > startup
    SQL
    > show parameter processes
    NAME                                 TYPE        VALUE
    db_writer_processes                  
    integer     1
    gcs_server_processes                 
    integer     0
    job_queue_processes                  
    integer     10
    log_archive_max_processes            
    integer     2
    processes                            
    integer     300
    SQL
    > show parameter sessions
    NAME                                 TYPE        VALUE
    java_soft_sessionspace_limit         
    integer     0
    license_max_sessions                 
    integer     0
    license_sessions_warning             
    integer     0
    logmnr_max_persistent_sessions       
    integer     1
    sessions                             
    integer     335
    shared_server_sessions               
    integer


    其他:

        ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关,它们的关系如下:

        sessions=(1.1*process+5)

         但是我们增加process数时,往往数据库不能启动了。这因为我们还漏调了一个unix系统参数:它是/etc/proc/kernel 中semmns,这是unix系统的信号量参数。每个process会占用一个信号量。semmns调整后,需要重新启动unix操作系统,参数才能生效。不过它的大小会受制于硬件的内存或ORACLE SGA。范围可从200——2000不等。

       semmns的计算公式为:   SEMMNS>processes+instance_processes+system
     
       processes=数据库参数processes的值   instance_processes=5(smon,pmon,dbwr,lgwr,arch)

       system=系统所占用信号量。系统所占用信号量可用下列命令查出:
        #ipcs -s 
       其中列NSEMS显示系统已占用信号量。

       其它一些跟连接有关的参数,如 licence_max_sessions, licence_sessions_warning 等默认设置都为零,也就是没有限制。我们可以放心大胆地使用数据库了。

  • [转] V$session 表的妙用

    2009-03-23 16:55:46

    v$session 表中比较常用的几个字段说明^_^

    select machine,username,count(*)  from v$session 
    group by machine,username
    order by  machine
    统计每个客户端,每个用户的链接数
    ccc023 - 193
    server - 169
    ecard-web - 179
    1. sid,serial#
    通过sid我们可以查询与这个session相关的各种统计信息,处理信息.
    a. select * from v$sesstat where sid = :sid;
    查询用户相关的各种统计信息.
    select a.sid,a.statistic#,b.name,a.value
    from v$sesstat a,v$statname b
    where a.statistic# = b.statistic#
    and a.sid = :sid;

    b. 查询用户相关的各种io统计信息
    select * from v$sess_io where sid = :sid;

    c. 查询用户想在正在打开着的游标变量.
    select * from v$open_cursor where sid = :sid;

    d. 查询用户当前的等待信息. 以查看当前的语句为什么这么慢/在等待什么资源.
    select * from v$session_wait where sid = :sid ;

    e. 查询用户在一段时间内所等待的各种事件的信息. 以了解这个session所遇到的瓶颈^_^
    select * from v$session_event where sid = :sid;

    f. 还有, 就是当我们想kill当前session的时候可以通过sid,serial#来处理.
    alter system kill session ':sid,:serail#';

    2. paddr.字段, process addr, 通过这个字段我们可以查看当前进程的相关信息, 系统进程id,操作系统用户信息等等.
    select a.pid,a.spid,b.name,b.description,a.latchwait,a.latchspin,a.pga_used_mem,a.pga_alloc_mem,a.pga_freeable_mem,a.pga_max_mem
    from v$process a,v$bgprocess b
    where a.addr = b.paddr(+)
    and a.addr = :paddr

    3. command 字段, 表明当前session正在执行的语句的类型.请参考reference.

    4. taddr 当前事务的地址,可以通过这个字段查看当前session正在执行的事务信息, 使用的回滚段信息等^_^
    select b.name rollname,a.*
    from v$transaction a,v$rollname b
    where a.xidusn = b.usn
    and a.addr = '585EC18C';

    5. lockwait字段, 可以通过这个字段查询出当前正在等待的锁的相关信息.
    select *
    from v$lock
    where (id1,id2) = (
            select id1,id2 from v$lock where kaddr = '57C68C48'
    )

    6. (sql_address,sql_hash_value) (prev_sql_addr,prev_hash_value) 根据这两组字段, 我们可以查询到当前session正在执行的sql语句的详细信息.

    select * from v$sqltext where address = :sql_address and hash_value = :sql_hash_value;

    7.ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#
    可以通过这几个字段查询现在正在被锁的表的相关信息.^_^
    a. 首先得到被锁的的信息
    select * from dba_objects where object_id = :row_wait_obj#;
    b. 根据row_wait_file#可以找出对应的文件的信息.
    select * from v$datafile where file# = :row_wait_file#.
    c. 在根据以上四个字段构造出被锁的字段的rowid信息.
    select dbms_rowid.ROWID_CREATE(1,:row_wait_obj#,:row_wait_file#,:row_wait_block#,:row_wait_row#) from dual;

    8. logon_time 当前session的登录时间.
    9. last_call_et 该session idle的时间, 每3秒中更新一次^_^
    10.status 值有两个:active,inactive。
    acitve表示会话的sql没有执行完。
    11、记录客户端登录ip

    创建触发器
    create or replace trigger on_logon_trigger
    after logon on database
    begin
        dbms_application_info.set_client_info(sys_context( 'userenv', 'ip_address' ) );
    end;

    用select client_info from v$session;查询客户端ip


    (1)-V$SESSION_WAIT

      这是一个寻找性能瓶颈的关键视图。它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件)。当系统存在性能问题时,本视图可以做为一个起点指明探寻问题的方向。

      V$SESSION_WAIT中,每一个连接到实例的session都对应一条记录。

    V$SESSION_WAIT中的常用列



    l         SID: session标识

    l         EVENT: session当前等待的事件,或者最后一次等待事件。

    l         WAIT_TIME: session等待事件的时间(单位,百分之一秒)如果本列为0,说明session当前session还未有任何等待。

    l         SEQ#: session等待事件将触发其值自增长

    l         P1, P2, P3: 等待事件中等待的详细资料

    l         P1TEXT, P2TEXT, P3TEXT: 解释说明p1,p2,p3事件

    附注:

    1.State字段有四种含义﹕

    (1)Waiting:SESSION正等待这个事件。

    (2)Waited unknown time:由于设置了timed_statistics值为false,导致不能得到时间信息。表示发生了等待,但时间很短。

    (3)Wait short time:表示发生了等待,但由于时间非常短不超过一个时间单位,所以没有记录。

    (4)Waited knnow time:如果session等待然后得到了所需资源,那么将从waiting进入本状态。

    2.Wait_time值也有四种含义:

    (1)值>0:最后一次等待时间(单位:10ms),当前未在等待状态。

    (2)值=0:session正在等待当前的事件。

    (3)值=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。

    (4)值=-2:时间统计状态未置为可用,当前未在等待状态。

    3.Wait_time和Second_in_wait字段值与state相关:

    (1)如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。

    (2)如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。

    (3)如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。

    (4)如果state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。

    V$SESSION_WAIT中的连接列

    Column        View                     Joined Column(s)

    SID              V$SESSION          SID

    示例:

    1.列出当前系统的等待事件

    SELECT event,

           sum(decode(wait_time,0,1,0)) "Curr",

           sum(decode(wait_time,0,0,1)) "Prev",

          count(*)"Total"

    FROM v$session_wait GROUPBY event ORDERBYcount(*);

    EVENT                                             Prev       Curr       Tot

    ---------------------------------------------       ----        -----       -----

    PL/SQL lock timer                             0            1            1

    SQL*Net more data from client           0            1            1

    smon timer                                        0            1            1

    pmon timer                                        0            1            1

    SQL*Net message to client                  2            0            2

    db file scattered read                           2            0            2

    rdbms ipc message                            0            7            7

    Enqueue                                           0            12           12

    pipe get                                             0            12           12

    db file sequential read                          3            10           13

    latch free                                          9            6            15

    SQL*Net message from client             835        1380       2215

    这个按事件和wait_time的分组查询列出下列的信息:

    l         多数的session都是空闲事件如:SQL*Net message from client, pipe get, PMON timer等。

    l         session的cpu占用可以通过上次session的非等待事件大致算出,除此问题外:看起来多数session没有在等待什么事情(难道他们都在干活?)但其最后等待事件都是SQL*Net message from client。

    2.列出指定ID的等待事件

    select * from v$session_wait where sid=100;

    3.应用p1,p2,p3进行等待事件的分析

    v$session_wait视图的列代表的缓冲区忙等待事件如下:

    P1—与等待相关的数据文件的全部文件数量。

    P2—P1中的数据文件的块数量。

    P3—描述等待产生原因的代码。

    例:select p1 "File #", p2 "Block #", p3 "Reason Code"

      from v$session_wait

      where event = 'buffer busy waits';

    如果以上查询的结果显示一个块在忙等待,以下的查询将显示这一块的名称和类型:

    select owner, segment_name, segment_type

     from dba_extents

     where file_id = &P1 and &P2 between block_id and block_id + blocks -1;

      我们也可以查询dba_data_files以确定等待的文件的file_name,方法是使用v$session_wait中的P1。

      从v$session_wait中查询P3(原因编码)的值可以知道session等待的原因。原因编码的范围从0到300,下列为部分编码所代表的事项:

    0 块被读入缓冲区。

    100 我们想要NEW(创建)一个块,但这一块当前被另一session读入。

    110 我们想将当前块设为共享,但这一块被另一session读入,所以我们必须等待read()结束。

    120 我们想获得当前的块,但其他人已经将这一块读入缓冲区,所以我们只能等待他人的读入结束。

    130 块被另一session读入,而且没有找到其它协调的块,所以我们必须等待读的结束。缓冲区死锁后这种情况也有可能产生。所以必须读入块的CR。

    200 我们想新创建一个block,但其他人在使用,所以我们只好等待他人使用结束。

    210 Session想读入SCUR或XCUR中的块,如果块交换或者session处于非连续的TX模式,所以等待可能需要很长的时间。

    220 在缓冲区查询一个块的当前版本,但有人以不合法的模式使用这一块,所以我们只能等待。

    230 以CR/CRX方式获得一个块,但块中的更改开始并且没有结束。

    231 CR/CRX扫描找到当前块,但块中的更改开始并且没有结束。

    (2)-V$SESSION_EVENT

      本视图记录了每个session的每一项等待事件。由上文所知V$SESSION_WAIT显示了session的当前等待事件,而V$SESSION_EVENT则记录了session自启动起所有的事件。

    V$SESSION_EVENT中的常用列

    l         SID:session标识

    l         EVENT:session等待的事件

    l         TOTAL_WAITS:此session当前事件的总等待数

    l         TIME_WAITED:此session总等待时间(单位,百分之一秒)

    l         AVERAGE_WAIT:此session当前事件平均等待时间(单位,百分之一秒)

    l         TOTAL_TIMEOUTS:等待超时次数

    其它用法与V$SESSION_WAIT相似,不详述了

    附注:

    Oracle的等待事件是衡量Oracle运行状况的重要依据及指标。等待事件的概念是在Oracle7.0.1.2中引入的,大致有100个等待事件。在Oracle 8.0中这个数目增加到了大约150个,在Oracle8i中大约有200个事件,在Oracle9i中大约有360个等待事件。主要有两种类别的等待事件,即空闲(idle)等待事件和非空闲(non-idle)等待事件。
  • [转] 学习动态性能表(五)--V$SESSION

    2009-03-23 16:50:50

    学习动态性能表第五篇--V$SESSION

      在本视图中,每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。

    V$SESSION中的常用列

    V$SESSION是基础信息视图,用于找寻用户SID或SADDR。不过,它也有一些列会动态的变化,可用于检查用户。如例:
    SQL_HASH_VALUE,SQL_ADDRESS:这两列用于鉴别默认被session执行的SQL语句。如果为null或0,那就说明这个session没有执行任何SQL语句。PREV_HASH_VALUE和PREV_ADDRESS两列用来鉴别被session执行的上一条语句。

    注意:当使用SQL*Plus进行选择时,确认你重定义的列宽不小于11以便看到完整的数值。

    STATUS:这列用来判断session状态是:
    Achtive:正执行SQL语句(waiting for/using a resource)
    Inactive:等待操作(即等待需要执行的SQL语句)
    Killed:被标注为删除

    下列各列提供session的信息,可被用于当一个或多个combination未知时找到session。

    Session信息
    SID:SESSION标识,常用于连接其它列
    SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个 SESSION结束,另一个SESSION开始并使用了同一个SID)。
    AUDSID:审查session ID唯一性,确认它通常也用于当寻找并行查询模式
    USERNAME:当前session在oracle中的用户名。

    Client信息
    数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
    OSUSER:客户端操作系统用户名
    MACHINE:客户端执行的机器
    TERMINAL:客户端运行的终端
    PROCESS:客户端进程的ID
    PROGRAM:客户端执行的客户端程序
    要显示用户所连接PC的 TERMINAL、OSUSER,需在该PC的ORACLE.INI或Windows中设置关键字TERMINAL,USERNAME。

    Application信息
    调用DBMS_APPLICATION_INFO包以设置一些信息区分用户。这将显示下列各列。
    CLIENT_INFO:DBMS_APPLICATION_INFO中设置
    ACTION:DBMS_APPLICATION_INFO中设置
    MODULE:DBMS_APPLICATION_INFO中设置
    下列V$SESSION列同样可能会被用到:
    ROW_WAIT_OBJ#
    ROW_WAIT_FILE#
    ROW_WAIT_BLOCK#
    ROW_WAIT_ROW#

    V$SESSION中的连接列

    Column View Joined Column(s)
    SID V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID
    (SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
    (PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
    TADDR V$TRANSACTION ADDR
    PADDR V$PROCESS ADDR


    示例:
    1.查找你的session信息
    SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS
    FROM V$SESSION WHERE audsid = userenv('SESSIONID');

    2.当machine已知的情况下查找session
    SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL
    FROM V$SESSION
    WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1';

    查找当前被某个指定session正在运行的sql语句。假设sessionID为100
    select b.sql_text
    from v$session a,v$sqlarea b
    where a.sql_hash_value=b.hash_value and a.sid=100
    寻找被指定session执行的SQL语句是一个公共需求,如果session是瓶颈的主要原因,那根据其当前在执行的语句可以查看session在做些什么。

622/4<1234>
Open Toolbar