oracle数据库使用的一些技巧(8)

2019-05-24 14:12

3、 系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。

二、处理方法

其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session会对应着操作系统中相应的一个进程(process),我们不使用Alter system kill session这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。

1、 以一个session做以示例,

a、 找到你要杀掉的那个session, 并记下paddr

select sid, username, paddr, status from v$session where username = '用户名' and status = 'INACTIVE';

b、 找到这个session所对应的spid

select * from v$process where addr = '上面查寻的paddr'; c、 杀掉spid所标识的那个进程

如果你的Oracle是在Unix平台上的,可以用kill。

$kill spid

如果你的Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为rakill sid spid

C:\\>orakill sid spid

d、 再查一下v$session,看会话在不在了。

2、 如何谋杀掉所有的Oracle的用户的进程呢?

a、windows的环境,执行如下图中的SQL,并把结果存成.bat的文件,比如kill.bat, 执行一下kill.bat就可以了。

select 'orakill '||sid||' '||spid as thread from sys.v_$process p, sys.v_$session s where sid > 6 and p.addr = s.paddr ;

b、 Unix的环境相对来说就简单多了,执行如下的命令就可以了

$ ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill

然后你再shutdown immediate就很快的了。

有一些死锁进程,异常退出后用

alter system kill session 'sid, serial#';无法释放会话 可从操作系统直接处理。

[Q] 如何有效的删除一个大表(extent数很多的表)

[A] 一个有很多(100k)extent的表,如果只是简单地用drop table的话,会很大量消耗CPU(Oracle要对fet$、uet$数据字典进行操作),可能会用上几天的时间,较好的方法是分多次删除extent,以减轻这种消耗:

1. truncate table big-table reuse storage;

2. alter table big-table deallocate unused keep 2000m ( 原来大小的n-1/n); 3. alter table big-table deallocate unused keep 1500m ; ....

4. drop table big-table;

[Q]如何收缩临时数据文件的大小 [A]9i以下版本采用

ALTER DATABASE DATAFILE 'file name' RESIZE 100M类似的语句 9i以上版本采用

ALTER DATABASE TEMPFILE 'file name' RESIZE 100M

注意,临时数据文件在使用时,一般不能收缩,除非关闭数据库或断开所有会话,停止对临时数据文件的使用。

[Q]怎么清理临时段 [A]可以使用如下办法

1、 使用如下语句查看一下认谁在用临时段

SELECT username,sid,serial#,sql_address,machine,program, tablespace,segtype, contents FROM v$session se,v$sort_usage su WHERE se.saddr=su.session_addr 2、 那些正在使用临时段的进程

SQL>Alter system kill session 'sid,serial#'; 3、把TEMP表空间回缩一下

SQL>Alter tablespace TEMP coalesce; 还可以使用诊断事件 1、 确定TEMP表空间的ts#

SQL> select ts#, name FROM v$tablespace; TS# NAME

----------------------- 0 SYSYEM 1 RBS 2 USERS 3* TEMP ??

2、 执行清理操作

alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1' 说明:

temp表空间的TS# 为 3*, So TS#+ 1= 4 如果想清除所有表空间的临时段,则 TS# = 2147483647

[Q]怎么样dump数据库内部结构,如上面显示的控制文件的结构 [A]常见的有

1、分析数据文件块,转储数据文件n的块m alter system dump datafile n block m 2、分析日志文件

alter system dump logfile logfilename; 3、分析控制文件的内容

alter session set events 'immediate trace name CONTROLF level 10' 4、分析所有数据文件头

alter session set events 'immediate trace name FILE_HDRS level 10' 5、分析日志文件头

alter session set events 'immediate trace name REDOHDR level 10' 6、分析系统状态,最好每10分钟一次,做三次对比

alter session set events 'immediate trace name SYSTEMSTATE level 10' 7、分析进程状态

alter session set events 'immediate trace name PROCESSSTATE level 10' 8、分析Library Cache的详细情况

alter session set events 'immediate trace name library_cache level 10'

[Q]如何获得所有的事件代码

[A] 事件代码范围一般从10000 to 10999,以下列出了这个范围的事件代码与信息 SET SERVEROUTPUT ON DECLARE

err_msg VARCHAR2(120); BEGIN

dbms_output.enable (1000000); FOR err_num IN 10000..10999 LOOP

err_msg := SQLERRM (-err_num);

IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN dbms_output.put_line (err_msg);

END IF; END LOOP; END; /

在Unix系统上,事件信息放在一个文本文件里 $ORACLE_HOME/rdbms/mesg/oraus.msg 可以用如下脚本查看事件信息 event=10000

while [ $event -ne 10999 ] do

event=`expr $event + 1` oerr ora $event done

对于已经确保的/正在跟踪的事件,可以用如下脚本获得 SET SERVEROUTPUT ON DECLARE

l_level NUMBER; BEGIN

FOR l_event IN 10000..10999 LOOP

dbms_system.read_ev (l_event,l_level); IF l_level > 0 THEN

dbms_output.put_line ('Event '||TO_CHAR (l_event)|| ' is set at level '||TO_CHAR (l_level)); END IF; END LOOP; END; /

[Q]怎么样快速重整索引

[A]通过rebuild语句,可以快速重整或移动索引到别的表空间

rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数 语法为

alter index index_name rebuild tablespace ts_name storage(??);

如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改 SQL> set heading off SQL> set feedback off SQL> spool d:\\index.sql

SQL> SELECT 'alter index ' || index_name || ' rebuild '

||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);' FROM all_indexes

WHERE ( tablespace_name != 'INDEXES' OR next_extent != ( 256 * 1024 )

)

AND owner = USER SQL>spool off

另外一个合并索引的语句是

alter index index_name coalesce,这个语句仅仅是合并索引中同一级的leaf block 消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。

[Q]怎么快速查找锁与锁等待

[A]数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。

这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。

可以通过alter system kill session ‘sid,serial#’来杀掉会话 SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) LOCK_LEVEL,

o.owner,o.object_name,o.object_type,

s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser FROM v$session s,v$lock l,dba_objects o WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username is NOT NULL

如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待 以下的语句可以查询到谁锁了表,而谁在等待。

SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, o.owner,o.object_name,o.object_type,s.sid,s.serial# FROM v$locked_object l,dba_objects o,v$session s WHERE l.object_id=o.object_id AND l.session_id=s.sid

ORDER BY o.object_id,xidusn DESC

以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN

[Q]怎样监控无用的索引

[A]Oracle 9i以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引 语法为:

开始监控:alter index index_name monitoring usage; 检查使用状态:select * from v$object_usage;

停止监控:alter index index_name nomonitoring usage; 当然,如果想监控整个用户下的索引,可以采用如下的脚本: set heading off


oracle数据库使用的一些技巧(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:胺 值 测 量

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: