如何获得Oracle的隐含参数

如何获得Oracle的隐含参数,第1张

Oracle数据库的初始化参数 主要来源于两个Oracle内部数据字典表:X$KSPPCV X$KSPPI通常我们查询的v$parameter视图就来源于这两个表 只不过隐去了部分参数 通过以下脚本可以查询获得这些被隐含的参数:set linesize column name format a column value format a selectx ksppinm name y ksppstvl value y ksppstdf isdefault decode(bitand(y ksppstvf ) MODIFIED SYSTEM_MOD FALSE ) i *** od decode(bitand(y ksppstvf ) TRUE FALSE ) isadjfromsys x$ksppi x sys x$ksppcv ywherex inst_id = userenv( Instance ) andy inst_id = userenv( Instance ) andx indx = y indx andx ksppinm like %_&par% order bytranslate(x ksppinm _ )/这些参数通常不建议修改 仅作参考目的 供学习用 lishixinzhi/Article/program/Oracle/201311/16508

我们知道 在Oracle数据库中 可以通过kill session的方式来终止一个进程 其基本语法结构为:alter system kill session sid serial# 被kill掉的session 状态会被标记为killed Oracle会在该用户下一次touch时清除该进程 我们发现当一个session被kill掉以后 该session的paddr被修改 如果有多个session被kill 那么多个session的paddr都被更改为相同的进程地址:SQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR  SIDSERIAL# PADDRUSERNAME  STATUS E E C B E EYGLE INACTIVE E B D SYSACTIVESQL>alter system kill session System altered SQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR  SIDSERIAL# PADDRUSERNAME  STATUS E E C D BD EYGLE KILLED E B D SYSACTIVESQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR  SIDSERIAL# PADDRUSERNAME  STATUS E E C D BD EYGLE KILLED E AA B EQSP  INACTIVE E B D SYSACTIVESQL>alter system kill session System altered SQL>select saddr sid serial# paddr username status from v$session where username is not nullSADDR  SIDSERIAL# PADDRUSERNAME  STATUS E E C D BD EYGLE KILLED E AA D BD EQSP  KILLED E B D SYSACTIVE在这种情况下 很多时候 资源是无法释放的 我们需要查询spid 在 *** 作系统级来kill这些进程 但是由于此时v$session paddr已经改变 我们无法通过v$session和v$process关联来获得spid那还可以怎么办呢?我们来看一下下面的查询: SQL>SELECT s username s status    x ADDR x KSLLAPSC x KSLLAPSN x KSLLASPO x KSLLID R x KSLLRTYP    decode(bitand (x ksuprflg ) null )   FROM x$ksupr x v$session s   WHERE s paddr(+)=x addr   and bitand(ksspaflg )!= USERNAME  STATUS  ADDR  KSLLAPSC  KSLLAPSN KSLLASPO  KSLLID R KS D B A         ACTIVE  B    ACTIVE  B C   ACTIVE  B FB    ACTIVE  B   ACTIVE  B   ACTIVE  B AC     ACTIVE  B E   ACTIVE  B   ACTIVE  B D    ACTIVE  B  USERNAME  STATUS  ADDR  KSLLAPSC  KSLLAPSN KSLLASPO  KSLLID R KS D SYSACTIVE  B D     B E     EV B     EVSYSINACTIVE B       SYSINACTIVE B BF     EV rows selected 简化一点 其实就是如下概念:SQL>select p addr from v$process p where pid <>minus select s paddr from v$session sADDR B E B 现在我们获得了进程地址 就可以在v$process中找到spid 然后可以使用Kill或者orakill在系统级来杀掉这些进程 当在Oracle中kill session以后 Oracle只是简单的把相关session的paddr 指向同一个虚拟地址 此时v$process和v$session失去关联 进程就此中断 然后Oracle就等待PMON去清除这些Session 所以通常等待一个被标记为Killed的Session退出需要花费很长的时间 如果此时被Kill的process 重新尝试执行任务 那么马上会收到进程中断的提示 process退出 此时Oracle会立即启动PMON来清除该session 这被作为一次异常中断处理 lishixinzhi/Article/program/Oracle/201311/11195

在9i参考手册中只查到BITAND函数,没有bitor。

BITOR好像要自己弄,网上资料:

BITOR(x,y) = (x + y) - BITAND(x, y)

BITXOR(x,y) = BITOR(x,y) - BITAND(x,y) = (x + y) - BITAND(x, y) * 2


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10085903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存