天影
===========================================================
shared pool 运行情况查询
===========================================================

      前两天遇到了一种情况:数据库报错,shared pool空间不足,无法在其中申请新的空间,而导致数据库不可用。经查询,错误的原因是使用了含动态sql的存储过程,并且频繁的调用此动态sql,导致shared pool中的空间迅速消耗,而不再可用。

      在对liabrary cache的分析时发现几个对其分析有用的东东:

      1、v$sqlarea、v$sql:选出最占用资源的查询。其中的disk_reads列的值显示了系统上执行的磁盘读取量。将这个值与执行次数结合在一起(disk_reads/ececutions),就可以返回每次执行时都有最大磁盘命中率的sql语句。如果使用buffer_gets列来替换disk_reads列,从而可以提供占用最多内存的sql语句的相关信息。v$sql查看的是共享sql区域中的每条语句,而v$sqlarea查看的是语句组。(另一种描述:v$sql中为每一条sql保留一个条目,而v$sqlarea中根据sql_text进行group by,通过version_count计算子指针的个数。)

     2、X$KSMSP: [K]ernal [S]torage [M]emory Management [S]GA Hea[P]。这个试图中的每一行都代表shared pool中的一个chunk。先记录当前视图中的行数,然后运行有问题的含动态sql的存储过程,再一次查询视图中的行数,发现行数有了大的变化。如果,不使用动态sql的存储过程(修改前面有问题的存储过程),会发现这个行数变化是很小的。

     另外,讲一点相关的东东。语法解析:Oracle进行语法检查时遵循自右向左,自下向上的原则,如果发现语法错误就马上返回错误。语法检查通过以后,Oracle将sql文本转换为相应的ASCII数值,然后根据数值通过Hash函数计算其HASH_VALUE在shared pool中寻找是否存在相同的sql语句,如果存在,则进入下一步骤;如果不存在则尝试获取shared pool latch请求内存,存储该sql代码。在这里有一个问题需要说明一下:因为大小写字母的ascii值是不同的,所以Oracle会把大小写不同的代码作为不同的sql来处理

    在进行资源的查询时,不要忘记statspack。

    今天,就到这吧。有的明天再说。

 

 

 

 


tianying 发表于:2005.04.04 23:27 ::分类: ( 初始分类 ) ::阅读:(815次) :: 评论 (0)
===========================================================
Solaris上Oracle自动启动设置
===========================================================

    刚在一台solaris上装了oracle9i,对于oracle在solaris上的自动启动设置很感兴趣,研究了一下。总结如下:

一、Solaris上开机自动启动

       Solaris在开关机时,会自动运行/etc/rc.d目录下的所有脚本。其中N越大,执行的级别越高。其中,S开头的脚本在开机时自动运行,K开头的脚本在关机时自动运行。

二、Oracle上的启动脚本

       脚本可手写,或使用Oracle自带的启动和关闭数据库的脚本。

       Oracle自带脚本:$ORA_HOME/bin/dbstart$ORA_HOME/bin/dbshut

       注意:dbstart中的参数PFILE可能存在问题(Oracle默认不使用pfile启动),需手动修改。

三、设置Oracle自动启动步骤(使用Oracle自带脚本)

       1、修改dbstartdbshut脚本,保证直接运行时可启动关闭数据库

       2、将调用dbstartdbshut的脚本dbora放置在/etc/init.d目录下,dbora的内容如下:

#!/bin/sh
ORA_HOME=/export/home/oracle/app/oracle/products/9.2.0
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
  then
  echo "Oracle startup:cannot start"
  exit
fi
case "$1" in
'start' )
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart &
/etc/init.d/dblsnrctl.sh
;;
'stop' )
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut &
;;
esac

       3、将启动lsnrctl的脚本dblsnrctl.sh(脚本dbora将调用此脚本)放置在/etc/init.d目录下,dblsnrctl.sh内容如下

su - oracle <lsnrctl start
exit

          注意:需修改dblsnrctl.sh的权限,以保证可运行:chmod 755 /etc/init.d/dblsnrctl.sh

       4、在etcrc2.d中设置启动链接:

              ln –s etcinit.ddbora S99oracle

       5、在etcrc0.d中设置关闭链接:

           ln –s etcinit.ddbora K10oracle

    试一下,应该可以自动启动oracle了。


tianying 发表于:2005.04.03 21:51 ::分类: ( 初始分类 ) ::阅读:(2868次) :: 评论 (0)
===========================================================
恭喜!您的Blog已经建立。
===========================================================
您已经成功注册ITPUB Blog帐号。请进入http://blog.itpub.net/admin.php管理您的Blog站点。建议先修改Blog的名称并建立文档分类,系统已经默认建立了【初始分类】。如果您的登陆ID包含中文字符,请记录您现在的地址。如果您的登陆ID里未包含任何中文字符,还可以使用“http://blog.itpub.net/您的ID”这种链接形式访问。登陆密码与itpub论坛帐号的密码相同。如有问题请在斑竹区发贴。谢谢。
tianying 发表于:2004.12.30 01:05 ::分类: ( 初始分类 ) ::阅读:(455次) :: 评论 (0)
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
Blog信息
网站链接...