1. 程式人生 > >undo過大的常見處理方式

undo過大的常見處理方式

空間 proc 常用 roc tro sta 回滾 lock 數據庫

一、普通情況下的操作:
undo表空間處理方式一般采用如下:
1、創建新的undo表空間
create undo tablespace undotbs3 datafile‘+ORA_DATA_02‘ size 30G;
alter tablespace undotbs3 add datafile‘+ORA_DATA_02‘ size 30G;-------可以添加數據文件來增大表空間,也可以通過resize擴大數據文件來擴大表空間
2、切換undo表空間
ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS3 scope=both;
3、刪除舊的undo表空間------操作到這一步其實就可以了,但是為了保證表空間還是原來的名字,就需要再來一遍創建、切換、刪除舊的undo表空間
drop tablespace UNDOTBS1 including contents and datafiles;
4、創建undo表空間
5、切換undo表空間
6、刪掉舊的undo表空間

針對ASM管理的rac,不同節點使用不同undo表空間的,需要在每個節點進行修改(一般rac不會所有節點共用一個undo表空間)


二、特殊情況之一
這兩天處理項目undo表空間問題時,在刪除舊的undo表空間時報錯(ORA-30013)
SQL> drop tablespace UNDOTBS1 including contents and datafiles;
drop tablespace UNDOTBS1 including contents and datafiles
*
ERROR at line 1:
ORA-30013: 還原表空間 ‘UNDOTBS1‘ 當前正在使用中



以上情況的處理方式

1、這時候就需要查詢回滾段情況了:
select segment_name,owner,tablespace_name,status from dba_rollback_segs where tablespace_name=‘UNDOTBS4‘ and status = ‘ONLINE‘;

----查看回滾段中的事物sid,serial#
select SID, MACHINE,PADDR,SADDR,substr(username,1,10) username,serial#,segment_name from v$transaction,dba_rollback_segs,v$session where saddr=ses_addr and xidusn=segment_id;

----oracle級別殺掉會話
alter system kill session ‘SID,SERIAL#‘;


2、終極絕招(絕對不是重啟試試):
如果還殺不掉的話,就需要先殺掉操作系統級別的進程,再在oracle級別殺掉會話。

-----------------------如下查看更加詳細的事物進程號(oracle級別、系統級別)----------------------
set line 200
set pagesize 999
col Sid for 99999
col MACHINE for a15
col ThreadID for 99999
col segment_name for a30
col tablespace_name for a10
col db_username for a10
col OSUser for a10
col program for a40

select s.Sid AS "Sid",
s.Serial# "Serial#",
p.spid "ThreadID",
s.MACHINE,
seg.segment_name,
seg.tablespace_name,
seg.status,
substr(s.username,1,10) db_username,
s.OSUser "OSUser",
s.Program AS "Program"
from v$transaction,dba_rollback_segs seg,v$session s,v$process p
where saddr=ses_addr and xidusn=segment_id and p.addr=s.paddr(+);


三、贈送兩個我認為寫的比較好的常用的查詢表空間的語句

-----查看數據庫各個表空間的使用情況---------------------------------
SET linesize 200
col tablespace_name format a15
SELECT a.tablespace_name,
round(((a.bytes - b.bytes) * 100) / a.maxbytes,
2) "% USED",
round(((a.maxbytes - a.bytes + b.bytes) * 100) / a.maxbytes,
2) "% FREE",
round(a.maxbytes / 1024 / 1024 / 1024,
2) "TOTAL(G)",
round((a.bytes - b.bytes) / 1024 / 1024 / 1024,
2) "USED(G)",
round((a.maxbytes - a.bytes + b.bytes) / 1024 / 1024 / 1024,
2) "FREE(G)",
round(a.maxbytes / 1024 / 1024,
2) "TOTAL(M)",
round((a.bytes - b.bytes) / 1024 / 1024,
2) "USED(M)",
round((a.maxbytes - a.bytes + b.bytes) / 1024 / 1024,
2) "FREE(M)"
FROM (SELECT ddf.tablespace_name,
SUM(decode(ddf.autoextensible,
‘NO‘,
ddf.bytes,
(sqrt((ddf.bytes + ddf.maxbytes) *
(ddf.bytes + ddf.maxbytes)) +
sqrt((ddf.bytes - ddf.maxbytes) *
(ddf.bytes - ddf.maxbytes))) / 2)) maxbytes,
SUM(ddf.bytes) bytes
FROM dba_data_files ddf
GROUP BY ddf.tablespace_name) a,
(SELECT dfs.tablespace_name,
SUM(dfs.bytes) bytes
FROM dba_free_space dfs
GROUP BY dfs.tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name(+)
ORDER BY round(((a.bytes - b.bytes) * 100) / a.maxbytes,
2) DESC;


-----查看數據庫各個表空間的使用情況---------------------------------

SELECT D.TABLESPACE_NAME,
SPACE || ‘M‘ "SUM_SPACE(M)",
BLOCKS "SUM_BLOCKS",
SPACE - NVL (FREE_SPACE, 0) || ‘M‘ "USED_SPACE(M)",
ROUND ( (1 - NVL (FREE_SPACE, 0) / SPACE) * 100, 2) || ‘%‘
"USED_RATE(%)",
FREE_SPACE || ‘M‘ "FREE_SPACE(M)"
FROM ( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE,
SUM (BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES) / (1024 * 1024), 2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
UNION ALL
SELECT D.TABLESPACE_NAME,
SPACE || ‘M‘ "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,
USED_SPACE || ‘M‘ "USED_SPACE(M)",
ROUND (NVL (USED_SPACE, 0) / SPACE * 100, 2) || ‘%‘ "USED_RATE(%)",
NVL (FREE_SPACE, 0) || ‘M‘ "FREE_SPACE(M)"
FROM ( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE,
SUM (BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
( SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES_USED) / (1024 * 1024), 2) USED_SPACE,
ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
ORDER BY 1;









undo過大的常見處理方式