ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle 切换undo tablespace小结

oracle 切换undo tablespace小结

原创 Linux操作系统 作者:tthero00boo 时间:2013-11-10 14:34:22 0 删除 编辑

/* 1. 检查参数文件类型 ,如果不是spfile ,scope=memory ,要记得尽快去修改pfile */
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /opt/oracle/112/dbs/spfilemyor
                                                 cl11.ora
/* 2. 查看当前数据文件size */
select tablespace_name,sum(bytes)/1024/1024/1024 GB
from dba_data_files group by tablespace_name
union all
select tablespace_name,sum(bytes)/1024/1024/1024 GB
from dba_temp_files group by tablespace_name order by GB;

/* 3. 建立一个新undo tbs,先df确认有足够空间,默认的AUTOEXTEND OFF*/
create undo tablespace UNDOTBS02 datafile '/opt/oracle/oradata/myorcl11/undotbs02.dbf' size 100m ;

/* 4. 查看当前事务,存在活动事务时,是可以切换undo tbs的,只是正使用的回滚段无法offline,
仍保持online状态(dba_rollback_segs),而在v$rollstat中段的status是PENDING OFFLINE */
select count(*) from v$transaction;

/* 此时如果drop原来tbs,会收到  */
SQL> drop tablespace undotbs01 including contents;
drop tablespace undotbs01 including contents
*
ERROR at line 1:
ORA-30013: undo tablespace 'UNDOTBS01' is currently in use
/* 5. 等待dba_rollback_segs原tbs的段全部offline,或者看v$rollstat已不存在 */
drop tablespace undotbs01 including contents and datafiles;

/* 如果急着想干掉原来的transaction */
select ss.sid,ss.SERIAL#,p.SPID,ss.SCHEMANAME,ss.OSUSER,ss.TERMINAL,ss.PROGRAM
from v$session ss, v$process p, v$transaction t
where ss.TADDR = t.ADDR
and ss.PADDR = p.ADDR
and t.UBAFIL = &fno; --&fno是undotbs1的file#

/* 记下 p.SPID 3293 ,没记看最后...

因为alter system kill session 会使paddr 指向同一个虚拟地址.
此时v$process和v$session失去关联,进程就此中断.
然后Oracle就等待PMON去清除这些Session.
所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.
如果此时被Kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,
process退出,此时Oracle会立即启动PMON来清除该session.这被作为一次异常中断处理 */

SQL> alter system kill session '39,35';

System altered.

/* 此时v$session status被标记为killed,事务回滚,在v$transaction中消失,
但dba_rollback_segs,v$rollstat仍是占用状态*/


/* kill ospid, 如果session 一直处于killed 状态,那么可以考虑在操作系统级别kill掉相关的进程。
不过在操作之前,要先确认session 是否在执行rollback 操作, v$session关联查不到v$transaction就okay  */
# lsof -p 3293
oracle  3293 oracle   11u   REG    8,2  10493952 283525 /opt/oracle/oradata/myorcl11/append02.dbf
oracle  3293 oracle   12u   REG    8,2 104865792 282798 /opt/oracle/oradata/myorcl11/undotbs01.dbf (deleted)

--文件句柄未释放,还可以恢复文件
# cp /proc/3293/fd/12 ~/undotbs01.dbf.frm            

# kill -9 3293
--至此undotbs01才被真正删除,空间释放

/* 网上查到还有一个语句 */
SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' POST_TRANSACTION;
SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' IMMEDIATE;

POST_TRANSACTION 选项会等待事务完成之后在断开连接。
IMMEDIATE 选项会立即断开连接,然后事务会进行recover操作。

/* 与kill session 命令不同,disconnect session 命令会kill 掉 dedicated server process,
该命令等同于在操作系统级别kill 掉server process。
使用alter system disconnectsession 命令就不需要切换到系统来kill session,
也从而减少了kill 错进程的几率 */

/* 如果已经asks了,没记下v$process.spid,因为v$process的信息都不会动
所以还是不难找,下面的sql可基本上最快定位到process*/
select pid,spid,pname,serial#,program from v$process
where addr in (
select p.addr from v$process p where pid <> 1 
minus 
select s.paddr from v$session s);

       PID SPID                     PNAME    SERIAL# PROGRAM
---------- ------------------------ ----- ---------- -----------------------------------
        17 3073                     D000           1 oracle@localhost.myrh6 (D000)
        18 3075                     S000           1 oracle@localhost.myrh6 (S000)
        36 4195                                   81 oracle@localhost.myrh6 (TNS V1-V3)


--总结就是,不要太着急,多等会再drop总是好的

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28859270/viewspace-776228/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-06-30

  • 博文量
    31
  • 访问量
    142192