主题 : 关于未表空间增加数据文件的等待事件分析
级别: 2级
UID: 174 打招呼
积分:300 加为好友
威望: 60 精华: 0
主题:60 回复:5
注册时间:2017-04-13
在线时长:0
1#   发表于:2020-03-05 09:59:59  IP:118.64.*.*
关于未表空间增加数据文件的等待事件

现象及原理分析:
在增加数据文件的时候,会持有 WLOCK_DD_TS 独占锁。表在分配extent的时候,也需要持有WLOCK_DD_TS 独占锁。
根据 x 与 x 锁互斥机制。增加数据文件,可能会锁住该表空间中的DML操作。
解决办法:
增加一个小的数据文件,然后自动扩展。
设置USE_TS_QUOTA=N, 该参数控制自动扩展时会不会阻塞其他会话。
永久生效: 写入参数文件
临时生效:
ALTER SYSTEM SET USE_TS_QUOTA=N;

查看表空间方法:

 select dbf.tablespace_name,
        dbf.totalspace "total(M)",
        dfs.freespace+ max_tbs.max_totalspace "free(M)",
        round(( (dfs.freespace+max_tbs.max_totalspace) / dbf.totalspace) * 100,2) "free ratio"
   from ( select t.tablespace_name,
                 sum(decode(sign(nvl(maxbytes,0)-bytes),-1,bytes,nvl(maxbytes,0)))/1024/1024 totalspace
            from dba_data_files t
           group by t.tablespace_name) dbf,
        ( select tt.tablespace_name,
                  sum(tt.bytes) / 1024 / 1024 freespace
             from dba_free_space tt
            group by tt.tablespace_name) dfs,
( select mxt.tablespace_name,
                  (sum(decode(sign(nvl(maxbytes,0)-bytes),-1,bytes,nvl(maxbytes,0))) -sum (mxt.bytes) ) /1024/1024 max_totalspace
             from dba_data_files mxt
            group by mxt.tablespace_name) max_tbs
  where trim(dbf.tablespace_name) = trim(dfs.tablespace_name)
  and trim(max_tbs.tablespace_name) =trim (dbf.tablespace_name);

下边是二个验证的实验:
测试环境: 单机+文件系统

test1:插入操作需要为表分配新的extent
test2: 插入操作不需要为表分配新的extent



create tablespace test datafile 'test01.tdf' size 1M;
create user test identified by 'test' default tablespace test;
grant connect,resource to test;

create table t1(id int,name varchar(10));

--插入0.25M数据
begin
for i in 1..10000 loop
insert into t1 values(i,'machao');
end loop;
commit;
end;
/

col SEGMENT_NAME for a10
col PARTITION_NAME for a10
col tablespace_name for a20
set linesize for 200




test1:
   session1:                                    session2:
   alter tablespace test add                             insert into t1 select * from t1;
   datafile 'test02.tdf' size 10G;
   
现象:  session2被session1 block住,等待事件WE_WLOCK_DD_TS


test2:
   delete t1;
   commit;
SQL> select * from user_extents;
SEGMENT_NA PARTITION_ SEGMENT_TYPE       TABLESPACE_NAME       EXTENT_ID      BYTES     BLOCKS
---------- ---------- ------------------ -------------------- ---------- ---------- ----------
T1                    TABLE              TEST                          0     131072         16
T1                    TABLE              TEST                          1     131072         16



session1:                                       session2: 
alter tablespace test add                                begin
datafile 'test02.tdf' size 10G;                          for i in 1..10000 loop
                                                         insert into t1 values(i,'machao');
                                                         end loop;
                                                         commit;
                                                         end;
                                                         /
session2没有被锁。



session3(session1未结束之前):
   insert into t1 select * from t1;
   
session3 被锁住。
1 共1页