
张红记 | 东方龙马 · 北京
东方龙马在金融行业的某客户经常会收到核心生产数据库监控TEMP表空间使用率超过90%告警,DBA分析告警发出时间范围内并没有需要使用temp表空间的大SQL。DBA实时跟踪temp空间使用率,发现告警时间范围内temp使用率大部分为0。我们怀疑问题可能出现在TEMP表空间监控的应用程序上。
DBA和监控运维人员要到temp监控SQL语句,应用程序使用v$sort_segment 的TOTAL_BLOCKS字段计算临时表空间使用率。
#4临时表空间空闲信息
q(
select s.tb_sp_name,
nvl(s.tb_sp_size - u.tb_sp_used, s.tb_sp_size) tb_sp_freesize,
null tb_sp_maxblksize,
null tb_sp_fragmentation
from (select seg.TABLESPACE_NAME tb_sp_name,
seg.TOTAL_BLOCKS * ts.block_size tb_sp_usedfrom v$sort_segment seg, Dba_Tablespaces ts
where ts.tablespace_name = seg.TABLESPACE_NAME
and seg.TABLESPACE_NAME not like '%UNDO%') u,
(select tablespace_name tb_sp_name, sum(bytes) tb_sp_size
from DBA_TEMP_FILES
where tablespace_name not like '%UNDO%'
group by tablespace_name) s
where s.tb_sp_name = u.tb_sp_name(+)
)
根据ORACLE官方文档信息,USED_BLOCKS更适合于临时表空间的使用率的计算。
客户要求对USED_BLOCKS和TOTAL_BLOCKS字段对维护人员进行测试学习。
1. used_blocks为SQL执行过程中占用的block数
2. total_blocks为当前的block总数
3. total_blocks在RAC两个节点之间可以相互使用,但总和不大于表空间总块数
使用order by 占用临时表空间
一节点执行
create table comframe.H_VM_WF_471_201805_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201805 order by workflow_id
二节点执行
create table comframe.H_VM_WF_471_201804_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201804 order by workflow_id;
监控语句
select inst_id,TABLESPACE_NAME,used_blocks,total_blocks,CURRENT_USERS from gv$sort_segment where tablespace_name='TEMP_TEST_TBS';
临时表大小不足以支持大表的排序操作
临时表空间(容量1GB)
create TEMPORARY TABLESPACE temp_test_tbs TEMPFILE '+DATA1' size 1g;
表容量
OWNER SEGMENT_NAME SIZE_M SEGMENT_TYPE TABLESPACE_NAME
---------- ------------------- ------ ------------------------------
COMFRAME H_VM_WF_471_201804 7308 TABLE TS_PUBDB_01
COMFRAME H_VM_WF_471_201805 28805 TABLE TS_PUBDB_01
新的临时表空间未使用时gv$sort_segment为空
执行监控语句:
select inst_id,TABLESPACE_NAME,used_blocks,total_blocks,CURRENT_USERS from gv$sort_segment where tablespace_name='TEMP_TEST_TBS';
无结果
一节点开始执行SQL过程中临时表空间使用率开始增加,由于临时表空间不足,SQL执行失败后USED_BLOCKS释放为0,TOTAL_BLOCKS为最终结果没有变化
一节点执行SQL
14:53:44 SQL>
create table comframe.H_VM_WF_471_201805_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201805 order by workflow_id
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP_TEST_TBS
Elapsed: 00:00:34.52
执行监控语句:
14:53:55 SQL>
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- --------------- ------ ------------ ---
1 TEMP_TEST_TBS 0 130944 0
二节点开始执行SQL时一节点TOTAL_BLOCKS不断被二节点获取,直到一节点TOTAL_BLOCKS=0
二节点执行SQL
14:55:01 SQL> create table comframe.H_VM_WF_471_201804_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201804 order by workflow_id;
create table comframe.H_VM_WF_471_201804_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201804 order by workflow_id
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP_TEST_TBS
14:55:58 SQL>
监控
14:55:29 SQL> --二节点还没有开始使用临时表空间
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ------------------ --- -------- ----
1 TEMP_TEST_TBS 0 130944 0
1 rows selected.
14:55:35 SQL> --二节点开始使用临时表空间
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ------------------ --- -------- ----
1 TEMP_TEST_TBS 0 118144 0
2 TEMP_TEST_TBS 128 128 1
2 rows selected.
14:55:37 SQL> --二节点继续使用临时表空间,一节点TOTAL_BLOCKS不断减少
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ------------------ --- -------- ----
1 TEMP_TEST_TBS 0 109312 0
2 TEMP_TEST_TBS 12800 12800 1
2 rows selected.
14:55:50 SQL> --一节点TOTAL_BLOCKS=0
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ------------------ -------- -------- ----
1 TEMP_TEST_TBS 0 0 0
2 TEMP_TEST_TBS 129792 129792 1
2 rows selected.
14:55:54 SQL> --二节点SQL执行失败,USED_BLOCKS释放
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ------------------ --- -------- ----
1 TEMP_TEST_TBS 0 0 0
2 TEMP_TEST_TBS 0 130944 0
2 rows selected.
监控
寂静在喧嚣里低头不语,沉默在黑夜里与目光结交,于是,我们看错了世界,却说世界欺骗了我们。by 泰戈尔
一二节点同时执行SQL,两个节点同时获取TOTAL_BLOCKS
同时执行:
节点一
15:05:24 SQL>
create table comframe.H_VM_WF_471_201805_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201805 order by workflow_id
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP_TEST_TBS
Elapsed: 00:00:20.93
15:06:08 SQL>
节点二
15:05:27 SQL> create table comframe.H_VM_WF_471_201804_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201804 order by workflow_id;
create table comframe.H_VM_WF_471_201804_t tablespace TS_PUBDB_01 as select * from comframe.H_VM_WF_471_201804 order by workflow_id
*
ERROR at line 1:
ORA-01652: unable to extend temp segment by 128 in tablespace TEMP_TEST_TBS
15:06:08 SQL>
监控
15:05:59 SQL> --没开始使用temp
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ----------------- --- ------- ---
1 TEMP_TEST_TBS 0 28544 0
2 TEMP_TEST_TBS 0 93440 0
2 rows selected.
15:06:00 SQL> --二节点开始使用temp
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ----------------- --- ------- ---
2 TEMP_TEST_TBS 128 93440 1
1 TEMP_TEST_TBS 0 28544 0
2 rows selected.
15:06:01 SQL> --一二节点同时使用temp
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ----------------- ------- ------- ---
1 TEMP_TEST_TBS 1920 28544 1
2 TEMP_TEST_TBS 13056 93440 1
2 rows selected.
15:06:05 SQL> --一节点TOTAL_BLOCKS超过原来的28544时开始获取二节点TOTAL_BLOCKS
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ----------------- ------- ------- ---
1 TEMP_TEST_TBS 43904 43904 1
2 TEMP_TEST_TBS 72320 80640 1
2 rows selected.
15:06:07 SQL> --SQL执行失败,USED_BLOCKS返回0
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
- ----------------- --- ------- ---
1 TEMP_TEST_TBS 0 51456 0
2 TEMP_TEST_TBS 0 79488 0
2 rows selected.
一小时后为执行SQL,TOTAL_BLOCKS保持原来数据
监控
16:05:13 SQL> select inst_id,TABLESPACE_NAME,used_blocks,total_blocks,CURRENT_USERS from gv$sort_segment where tablespace_name='TEMP_TEST_TBS';
INST_ID TABLESPACE_NAME USED_BLOCKS TOTAL_BLOCKS CURRENT_USERS
--- --------------- --- ------- ---
1 TEMP_TEST_TBS 0 51456 0
2 TEMP_TEST_TBS 0 79488 0
2 rows selected.
视图gv$sort_segment中字段
1. used_blocks为SQL执行过程中占用的block数成立
2. total_blocks为当前的block数成立
3. total_blocks在两个节点之间可以相互使用,但总和不大于表空间总块数成立
我们建议应用人员对已经发出的警告进行统一处理,将TOTAL_BLOCKS字段由USED_BLOCKS代替,对正在发出的相关警告进行屏蔽,修改临时表空间监控模板并统一下发至各核心数据库。
SELECT a.username,
a.sid,
a.serial#,
a.osuser,
b.tablespace,
b.blocks,
c.sql_text
FROM v$session a, v$tempseg_usage b, v$sqlarea c
WHERE a.saddr = b.session_addr
AND c.address = a.sql_address
AND c.hash_value = a.sql_hash_value
ORDER BY b.tablespace, b.blocks;


| 北京 | 上海 | 广州 | 成都 |
4008-906-960





