发布新日志

  • [转] 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表空间大小,然后取消其自动扩展属性。



     

  • 压缩指令

    2009-04-09 15:28:47

    常见的压缩文件后缀名:

    • *.Z       compress程序压缩的文件;
    • *.bz2     bzip2程序压缩的文件;
    • *.gz      gzip程序压缩的文件;
    • *.tar     tar程序打包的数据,没有经过压缩;
    • *.tar.gz  tar程序打包的数据,且经过压缩。

    以下是各个压缩程序的使用方法:

    • compress / uncompress / zcat

        语法: 

        compress -参数 filename

        参数说明:

        -d : 解压缩参数;

        范例:

        先复制/etc/man.config到/root下,再将其压缩

        cp /etc/man.config /root

        compress /etc/man.config     将man.comfig压缩为man.config.Z

        compress -d man.config.Z     将man.config.Z解压为man.config

        uncompress man.config.Z      解压缩文件(结果跟compress -d相同)

        zcat man.config.Z            无需解压直接查看文件内容

        总结:compress是用来压缩和解压缩后缀名为*.Z的文件的指令,通过compress压缩文件时,会自动将其后缀指定为.Z。注意:用compress压缩文件,如果没有指定参数,则原始文件会被压缩后的*.Z文件取代。compress -d 和 uncompress 都是用来解压缩文件;zcat用于直接查看压缩文件内容--无需解压缩文件。

    • bzip2 / unbzip2 / bzcat

         语法:

         bzip2 -参数 filename   压缩或解压文件

         unbzip2 filename      解压文件,等同于bzip2 -d

         bzcat *.bz2           不解压文件直接查看文件内容

         参数说明:

         -d : 解压缩

         -z : 压缩

         通过compress解压文件时的文件格式:

         filename.bz2    becomes     filename

         filename.bz     becomes     filename

         filename.tbz2   becomes     filename.tar

         filename.tbz    becomes     filename.tar

         anyothername    becomes     anyothername.out

         范例:

         bzip2 -z man.config      将man.config压缩为man.config.bz2

         bzcat man.config.bz2     直接查看压缩man.config文件的内容--无需解压缩

         bzip2 -d man.config.bz2  将man.config.bz2解压为man.config

         bunzip2 man.config.bz2   效果同bzip2 -d

         总结:通过bzip2压缩文件时,自动将其后缀指定为.bz2。注意:通过bzip2 -z 压缩文件后,原文件会被压缩后的.bz2文件取代。如果需要不解压文件直接读取文件内容,可以使用bzcat指令,可以使用bzip2 -d或unbzip2来解压文件。 

    • gzip,zcat

          语法:

          gzip -参数 filename    压缩或解压缩文件

          zcat filename.gz         无需解压文件直接查看filename文件内容

          参数说明:

          -d : 解压缩

          -# : 压缩等级,1最不好,9最好,6为默认级别

          范例:

          gzip man.config     将man.config压缩为man.config.gz文件

          zcat man.config.gz  直接读取man.config文件的内容

          gzip -d man.config.gz  将man.config.gz解压缩为man.config

          gunzip man.config.gz   效果同gzip -d

          gzip -9 man.config    以最大压缩比压缩man.config文件

          总结:gzip用来压缩和解压缩后缀名为*.gz的文件。另外,gzip提供压缩比的服务,-1压缩比最差,但是速度很快,-6为默认压缩比,-9压缩比最佳(压缩后的文件比较小),但是速度较慢。通过zcat指令可以直接读取压缩文件的内容。

    • tar

          语法:

          tar [-zxcvfpP] filename

          tar -N 'yyyy/mm/dd' /path -zcvf target.tar.gz source

          参数说明:

          -z : 是否用gzip进行压缩

          -x : 解压缩

          -c : 压缩

          -t : 查看tarfile里面的文件

          -v : 压缩过程中显示文件

          -f : 使用文件名

          -p : 使用原文件的属性(属性不会依据用户而改变)

          -P : 使用绝对路径

          -N : 比其后接的(yyyy/mm/dd)时间新的文件才会被打包进新的文件中

          --exclude file : 在压缩过程中,不要将file打包

          范例:

          tar -cvf directory.tar directory  将directory目录打包成果以个文件

          tar -zcvf directory.tar.gz directory 除了将directory目录打包外,同时用gzip进行压缩成名为directory.tar.gz的文件

          tar -zxvf file.tar.gz /home/test/*  将/home/test目录下的所有文件打包并用gzip压缩成一个名为file.tar.gz的文件

          tar -xvf directory.tar  解压tar包,注意:因为没有经过gzip压缩,所以不需要指定参数z,否则会有问题

          tar -zxvf directory.tar.gz 通过文件后缀名判断--该文件经过gzip压缩,所以需要指定参数z

          tar -ztvf directory.tar.gz 参数t可用来查看tar包中的文件信息,不要解压缩

          tar -zcvf home.tar.gz -P /home  大写P参数--压缩后的文件的路径均为绝对路径

          tar -N '2002/6/22' -zcvf home.tar.gz /home  在home目录中,日期比2002/6/22还要新的文件才会被打包到home.tar.gz中

          tar -zcvf host.tar.gz / --exclude /mnt --exclude /proc  将根目录中的数据都打包到host.tar.gz中,除了/mnt和/proc目录中的数据

          tar -cvf - /home |  tar -xvf -   将/home打包后,直接解压缩在当前工作目录下,不需要建立中间文件,使用该语法最好是用绝对路径,不容易出现问题---适用于不想产生中间文件的情况

          总结:

    1. 之前提到的compress和gzip只适用于压缩文件,不能对目录进行压缩,而tar可以将整个目录或文件整个成一个文件;
    2. 需要用绝对路径来打包文件--用参数大写P,参数小写p---被打包的文件不会依据用户的身份而改变全县;
    3. -N参数,参开上面的例子,直到该参数中日期很重要,在备份时,需要备份较新的文件时,就可用该参数;
    4. 最后一个例子,直接以管线命令进行压缩和解压缩,比如:要将/home下的文件复制到当前工作目录,可以使用cp -r,也可以使用上面例子中的指令;
    5. tar的功能很多,它是经由打包之后再处理的过程。 常听到的tarball文件就是经由tar打包再压缩的文件。此外,tar也可用在备份的存储媒体上,最常见的就是磁带机。假设,磁带机编号为/dev/st0,想要将/home下的数据在磁带机上做备份,既可用 tar /dev/st0 /home。
    6. 在linux中,gzip已整合到tar中,但是SUN或者其他版本较旧的UNIX版本中tar并没有整合gzip,所以解压缩需要分2步:

         gzip -d test.tar.gz   先解压所

         tar -xvf test.tar   解出数据

       7. 使用tar压缩或解压缩时,原文件都存在。

    • cpio

          语法:

          cpio -covB > [file.device]    <=====备份

          cpio -icduv < [file/device]   <=====还原

          参数说明:

          -o:将文件复制输出到文件或设备上

          -i:将数据自文件或设备复制出到系统中

          -t:查看cpio建立的文件或设备的内容

          -c:以一种较新的便携格式(portable fromat)存储

          -v:在存储过程中文件名可以在屏幕上显示

          -B:让默认的Blocks可以增致5120bytes,默认是512bytes,这样可以使大文件的存储速度加快

          -d:自动建立目录,由于cpio的内容可能不在同一个目录内,如此再反备份中可能出现问题,这时候就可用-d参数自动建立所需要的目录

          -u:自动用较新的文件替换较旧的文件

          范例:

          find / -print | cpio -covB > /dev/st0

          将搜寻到的文件存储到磁带机

          cpio -icduv < /dev/st0

          将磁带机中的数据还原回来

          cpio -icduv < /dev/st0 > /tmp/content

          将磁带机的内容转存到/tmp/content中

          find / -type -f | cpio -o > /tmp/root.cpio

          cpio -i < /tmp/root.cpio

          先将搜索结果输出到/tmp/root.cpio文件然后再还原回来

          总结:

          cpio最适用于文件备份,它不想cp--可以直接将文件复制过去,例如,cp * /tmp---将所在目录的所有文件复制到/tmp目录下。cpio无法直接读取文件,而是记录每个文件的路径连同文件名。cpio最常跟find指令一起使用。cpio可以备份任何文件,连同/dev下的任何设备文件。由于cpio必须要配合其他程序(如find)建立文件名,所以cpio与管线命令以及命令重定向的相关性相当重要。总体来说,cpio的作用就是备份和还原。

         

  • 管线命令

    2009-04-08 16:04:03

       bash命令执行时会输出数据,如果这些数据必需经过几道手续之后才能得到我们想要的格式,应该如何设定?这就涉及到管线命令的问题(pipe)。管线命令使用的是“|”界定符号。

       假设,我们需要读取last指令中root的登入的次数,步骤如下:

    1. 执行last,将这个月所有人的所有登入数据取出来;
    2. 使用grep将上面输出数据中的root截取出来,其他的不要;
    3. 使用wc这个可以计算行数的指令对上一步所获得的数据进行计算。

       整个命令可以写成:last | grep root | wc -l

       注意:管线命令“|”仅能处理由前一个命令所传来的正确数据,对于错误信息没有直接处理能力。每个管线部分都是指令,前一个指令的输出是后一个指令的输入。

       常用的管线指令:

    • cut

          参数说明:

          -d(delimiter) : 后面接的是分隔符,默认是空格符;

          -c(character) : 后面接的是第几个字符;

          -f(fields)    : 后面接的是第几个字段;

          范例:

          cat /etc/passwd | cut -d ":" -f 1            将passwd文件中每一行里的“:”作为分隔符,列出第一个字段,即用户姓名

          last | cut -d " " -f 1    以空格符作为分隔,列出文件中每一行的第一个字段

          last | cut -c 1-20   将last得到的数据,每一行第1-20个字符取出来

          总结:cut一般常用来分析日志文件。cut主要的用途是将同一行里的数据进行分解,最常用在分析一些数据或文字数据的时候,因为需要以某些字符作为分隔参数,然后将数据进行切割,以取得所需要的数据。

    • sort

          -t 分隔符: 使用分隔符隔开不同的区块,默认是tab;

          +start -end: 有start区块排序到end区块;

          -n: 使用纯数字排序,否则会以字母方式排序;

          -r: 反向排序;

          -u: 相同出现的一行,只列出一次

          范例:

          cat /etc/passwd | sort     将列出来的个人帐号排序

          cat /etc/passwd | sort -t: +2n   将个人帐号以用户ID排序(每一行第1个字段序号为0,序号为2的表示第3个字段,即用户ID)

          cat /etc/passwd | sort -t: +2nr  将个人帐号以用户ID反向排序

          总结:当我们需要比较信息时可以用sort,比如,假设有很多帐号,想知道最大的用户ID是多少,用sort即可知道答案。

    • wc

          参数说明:

          -l: 多少行;

          -m: 多少字符;

          -w:多少字(这里:以分隔符隔开的算一个字);

         总结:wc是一个计算文件内容的工具组。例如,当需要知道账号文件中有多少个帐号时,可以使用wc -l,因为/etc/passwd文件中,一行代表一个用户;需要计算一个文件有多少个字符时,可以使用wc -m。

    • uniq

         范例:

         last | cut -d " " -f1 | sort | uniq

         该指令用来删除重复的行从而只显示一条数据。例如,想要知道这个月登入主机的用户有哪些,而不在乎其登入次数,即可采用上面的指令:(1)先列出所有的数据;(2)将人名单独列出来;(3)排序;(4)删除重复的数据只显示一个。

    • tee

         范例:

         last | tee last.list | cut -d " " -f1

         在命令重定向时,如果将数据重定向到文件,屏幕上就不会出现任何数据。如果需要将数据同时显示在屏幕上和文件中,此时可用tee指令。例如,上面的指令,last可以查到这个月的登入数据,使用tee之后,会将这些数据传给下一个指令,并且会将数据写入到last.list文件中。

    • tr

         参数说明:

         -d : 删除其后接的字符串;

         -s : 取代重复的字符串;

         范例:

         last | tr '[a-z]' '[A-Z]'     将小写的a-z替改成大写

         cat /etc/passwd | tr -d :     删除/etc/passwd文件中的“:”符号

         cat /home/test/dostext | tr -d '\r' >dostext-noM    将dostext文件中行尾符号^M删除

         总结:该指令可用于正规表达法中,因为它也是以正规表达法方式取代数据。以上面的例子作说明,使用[]可以设定一串字符,也常常用它来取代文件中的怪异符号。比如第3个例子,可用它来去除DOS文件中留下来的^M断行符。

    • split

         语法:

         split [bl] 输入文件(需要分隔的文件) 输出文件(分隔以后的文件的文件名前缀)

         参数说明:

         -b : 以文件size来分;

         -l : 以行数来分

         范例:

         split -l 5 /etc/passwd test    会产生testaa,testab,testac等分隔后的文件

         总结:split指令用来分隔文件,可将文件根据大小或行数分隔成任意大小,方便复制。

        

  • 常有生活心

    2009-04-07 17:02:08

  • 命令重定向

    2009-04-07 13:21:40

    什么是重定向?简单的说,就是将所得数据转到其它地方。例如,将当前屏幕输出数据转到文件中,可用 ls -l / > test,大于号“>”的作用就是将输出结果导向到test文件。需要注意:                                           

    • 当使用>导向到test文件时,屏幕不会显示任何信息,但是会将执行的结果输出到test文件中;
    • 若文件test不存在,系统会自动创建;
    • 若文件test存在,系统会先清空该文件原先的内容,然后将数据写入。也就是说,若以>将内容输出到一个已有文件中,该文件原有的内容就会被覆盖掉。

    除了>符号,在bash命令执行过程中,还有3种输出输入情况,分别是:                              

    • 标准输入:代码为0,或称为stdin,使用方式为<;
    • 标准输出:代码为1,或成为stdout,使用方式为1>;
    • 错误输出:代码为2,或称为stderr,使用方式2>;                                           

        基本的指令书写方式为:

        指令                  >                设备或文件

                             2>

                             >>

                             <

        左边一定是指令,右边可能是设备或文件。注意:1>和2>之间没有空格符。例如:

    • ls -al > list.txt   将显示结果输出到list.txt文件中,若该文件已存在则予以取代;               
    • list -al >> list.txt   将显示结果输出到list.txt文件中,该文件内容累加,旧数据保留;           
    • ls al 1> list.txt 2> list.err   将正确的显示结果输出到list.txt文件中,错误的数据输出到list.err;
    • ls al 1> list.txt 2>&1  将显示数据不论正确或错误 均输出到list.txt中,注意:正确或错误的信息输出到同一个文件中,只能采用该方法,不能写成其它格式;                                             
    • ls al 1> list.txt 2> /dev/null   显示的数据,正确的输出到list.txt文件中,错误的数据予以丢弃(说明:/dev/null相当于一个类似垃圾桶的设备);

        命令重定向里常用的符号和设备:

    • < :由<的右边读入参数文件;
    • > :将原本由屏幕输出的正确数据输出到>右边的文件或设备中;
    • >>:将原本由屏幕输出的正确数据输出到>>右边,与>不同的是,该文件原有的内容不会被覆盖,新的数据以累加的方式添加到文件的最后面;
    • 2>:将原本应该由屏幕输出的错误数据输出到2>的右边;
    • /dev/null:可以视为垃圾设备。

        如果需要将正确的数据和错误的数据分别存入不同的文件,正确的写法是:1>和2>

    • 1>:将正确的数据输出到指定的地方(标准输出);
    • 2>:将错误的数据输出到指定的地方(标准错误输出);                                       

       例如:

    1. find / -name testing 1> list_right 2> list_error                              正确的数据输出到list_right文件中,错误的数据输出到list_error文件;                   
    2. find / -name testing 1> list_right 2> /dev/null                                    正确的数据输出到list_right文件中,错误的数据直接丢掉。                                  
    3. 如果要将数据写入同一个文件中,需要用到特殊的写法:                                  

          find / -name test 1> list 2>list   错误的写法                                  

          find / -name test 1> list 2>&1  正确的写法

        下面来介绍<,最简单的说法,就是将原本由键盘输入的数据经由文件读入,最明显的例子就是mail这个东东。比如,以root身份寄信给root:

      2.有文件代替输入                                                             如:mail -s "test" root < /root/.bashrc   将.bashrc的内容寄给root 

      最后,总结一下,为什么要使用命令重定向?答案:

    • 屏幕输出的信息很重要,需要保存的时候;
    • 背景执行中的程序,不希望它干扰屏幕正常的输出结果时;
    • 一些系统的例行性命令(如:/etc/crontab中的文件)的执行结果,希望被保存时;
    • 一些执行命令,已经知道可能的错误信息,想通过2>/dev/null丢掉时;
    • 错误信息与正确信息需要分别输出时。
  • [转] 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  查看(416) 评论(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;

  • 手工删除services.msc中的服务

    2009-04-02 15:23:28

    windows XP:

    (1)  Regedit  
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services   key    
      选择想删除的--在编辑下删除;

    (2)在命令行执行sc delete [servicename]

    另外sc的常用功能,如服务启动、停止(sc start [servicename]\sc stop [servicename])都比在services.msc服务控制台中操作快得多,服务启动和停止是瞬间完成的。

    关于sc的其他功能请查看sc/?

     

    补充:

    在命令行模式下输入 sc,看到了吧,一大堆命令

      语法:sc create | delete | config 服务名 [参数]
      主要参数列表:
        start= demand|boot|system|auto|disabled|delayed-auto  //启动类型
        binPath= BinaryPathName                //可执行文件路径
        depend= 依存关系(以 / (斜杠) 分隔)
        DisplayName= <显示名称>                //屏幕显示名称

      作用依次是:新建、移除、重配置服务。

      例如:重新配置服务mysql的执行路径的方法是:
         sc config mysql binPath= "新路径"

    VISTA

    跟其他操作系统没什么区别,唯一要注意的就是cmd.exe要以管理员身份运行,否则不执行命令.


    一、注册服务,以tomcat为例
    1,在dos下进入tomcat\bin目录
    2,在命令行输入service install [服务名,默认Tomcat5]
    3,要启动该服务,输入:net start 服务名

    二、修改、删除服务
    语法:sc create | delete | config 服务名 [参数]
    主要参数列表:
      start= demand|boot|system|auto|disabled|delayed-auto  //启动类型
      binPath= BinaryPathName                //可执行文件路径
      depend= 依存关系(以 / (斜杠) 分隔)
      DisplayName= <显示名称>                //屏幕显示名称 作用依次是:新建、移除、重配置服务。
    例如:重新配置服务mysql的执行路径的方法是:
    sc config mysql binPath= "新路径"

     

    windows 2000:

    (1)HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services   key     选择你需要删除的服务删除    
    (2)resource kit 中的INSTSRV.EXE或者delsrv.exe也可以删除  
    用法: instsrv   <service   name>   remove
          delsrv <serviceName>

  • [转] 改变临时表空间

    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;



     

  • LE5.1.msstyles为无效的windows映像

    2009-03-25 10:48:26

    安装应用程序时出现:


      解决方法:

     

    桌面右键“属性”--主题 ,把主题改回“window xp”就OK。

  • 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选项。有兴趣的朋友可以研究一下程序代码

  • 不要空虚心

    2009-03-23 17:36:06

  • [转] 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)等待事件。
Open Toolbar