暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

临时表空间相关查询及问题解决汇总

原创 张鹏 2021-12-02
1715

临时表空间相关查询及问题解决汇总

 

查询临时表空间分配大小及目前已使用的大小

select * from (select a.tablespace_name,

sum(a.bytes/1024/1024) allocated_mb

from dba_temp_files a

where a.tablespace_name = upper('temp') group by a.tablespace_name) x,

(select sum(b.bytes_used/1024/1024) used_mb,

sum(b.bytes_free/1024/1024) free_mb

from v$temp_space_header b

where b.tablespace_name=upper('temp') group by b.tablespace_name);

 

查询临时表空间大小及目前已使用的大小

 

select c.tablespace_name,

to_char(c.bytes / 1024 / 1024, '99,999.999') total_mb,

to_char((c.bytes - d.bytes_used) / 1024 / 1024, '99,999.999') free_mb,

to_char(d.bytes_used / 1024 / 1024 , '99,999.999') use_mb,

to_char(d.bytes_used * 100 / c.bytes, '99.99') || '%' use

from (select tablespace_name, sum(bytes) bytes

          from dba_temp_files

         GROUP by tablespace_name) c,

       (select tablespace_name, sum(bytes_cached) bytes_used

          from v$temp_extent_pool

         GROUP by tablespace_name) d

where c.tablespace_name = d.tablespace_name;

 

查询临时表空间实时统计大小,用于统计在sql执行过程中temp的使用,当sql执行完毕,这里就不再统计了

 

SELECT d.tablespace_name "Name",

TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,990.900') "Size (M)",

TO_CHAR(NVL(t.hwm, 0)/1024/1024,'99999999.999') "HWM (M)",

TO_CHAR(NVL(t.hwm / a.bytes * 100, 0), '990.00') "HWM % " ,

TO_CHAR(NVL(t.bytes/1024/1024, 0),'99999999.999') "Using (M)",

TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "Using %"

FROM sys.dba_tablespaces d,

(select tablespace_name, sum(bytes) bytes from dba_temp_files group by tablespace_name) a,

(select tablespace_name, sum(bytes_cached) hwm, sum(bytes_used) bytes from v$temp_extent_pool group by tablespace_name) t

WHERE d.tablespace_name = a.tablespace_name(+)

AND d.tablespace_name = t.tablespace_name(+)

AND d.extent_management like 'LOCAL'

AND d.contents like 'TEMPORARY';

 

 

实时运行一个排序的大sql

 

 alter tablespace temp shrink space;

 

 

临时表空间相关查询

–查表空间使用率情况(含临时表空间)
SELECT d.tablespace_name "Name", d.status "Status",

TO_CHAR (NVL (a.BYTES / 1024 / 1024, 0), '99,999,990.90') "Size (M)",

TO_CHAR (NVL (a.BYTES - NVL (f.BYTES, 0), 0) / 1024 / 1024,

'99999999.99'

) USE,

TO_CHAR (NVL ((a.BYTES - NVL (f.BYTES, 0)) / a.BYTES * 100, 0),

'990.00'

) "Used %"

FROM SYS.dba_tablespaces d,

(SELECT tablespace_name, SUM (BYTES) BYTES

FROM dba_data_files

GROUP BY tablespace_name) a,

(SELECT tablespace_name, SUM (BYTES) BYTES

FROM dba_free_space

GROUP BY tablespace_name) f

WHERE d.tablespace_name = a.tablespace_name(+)

AND d.tablespace_name = f.tablespace_name(+)

AND NOT (d.extent_management LIKE 'LOCAL' AND d.CONTENTS LIKE 'TEMPORARY')

UNION ALL

SELECT d.tablespace_name "Name", d.status "Status",

TO_CHAR (NVL (a.BYTES / 1024 / 1024, 0),'99,999,990.90') "Size (M)",

TO_CHAR (NVL (t.BYTES, 0) / 1024 / 1024,'99999999.99') USE,

TO_CHAR (NVL (t.BYTES / a.BYTES * 100, 0),'990.00') "Used %"

FROM SYS.dba_tablespaces d,

(SELECT tablespace_name, SUM (BYTES) BYTES

FROM dba_temp_files

GROUP BY tablespace_name) a,

(SELECT tablespace_name, SUM (bytes_cached) BYTES

FROM v$temp_extent_pool

GROUP BY tablespace_name) t

WHERE d.tablespace_name = a.tablespace_name(+)

AND d.tablespace_name = t.tablespace_name(+)

AND d.extent_management LIKE'LOCAL'

AND d.CONTENTS LIKE'TEMPORARY';

 

 

--查询表空间剩余字节大小

SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS "FREE SPACE(M)"

FROM DBA_FREE_SPACE

WHERE TABLESPACE_NAME = '&tablespace_name'

GROUP BY TABLESPACE_NAME;

 

--注:如果是临时表空间,请查询DBA_TEMP_FREE_SPACE

SELECT TABLESPACE_NAME, FREE_SPACE/1024/1024 AS "FREE SPACE(M)"

FROM DBA_TEMP_FREE_SPACE

WHERE TABLESPACE_NAME = '&tablespace_name';

 

--查询表空间所有数据文件路径

SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME, BYTES/1024/1024 AS "BYTES(M)"

FROM DBA_DATA_FILES

WHERE TABLESPACE_NAME = '&tablespace_name';

 

--注:如果是临时表空间,请查询DBA_TEMP_FILES

SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME, BYTES/1024/1024 AS "SPACE(M)"

FROM DBA_TEMP_FILES

WHERE TABLESPACE_NAME = '&tablespace_name';

 

--为空间不足的表空间增加数据文件

ALTER TABLESPACE &tablespace_name ADD DATAFILE '&datafile_name' SIZE 2G;

 

--注:如果要为临时表空间扩容,使用下面的语句

ALTER TABLESPACE &tablespace_name ADD TEMPFILE '&datafile_name' SIZE 2G;

 

--查看临时表空间的大小 和 数据文件路径

SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME, BYTES/1024/1024 AS "SPACE(M)"

FROM DBA_TEMP_FILES

WHERE TABLESPACE_NAME = 'TEMP';

--或者

select name, bytes/1024/1024 as "大小(M)" from v$tempfile order by bytes;

--重建并修改默认临时表空间办法:

--查询当前数据库默认临时表空间名

select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

--创建新的临时表空间

create temporary tablespace temp02 tempfile 'E:\oracle\oradata\lims\TEMP02.DBF' size 1024M autoextend on;

--修改默认表空间为刚刚建立的临时表空间

alter database default temporary tablespace temp02;

--查看用户所用临时表空间的情况

SELECT USERNAME,TEMPORARY_TABLESPACE FROM DBA_USERS;

--删除原来的临时表空间

drop tablespace temp including contents and datafiles;

--查看所有表空间名确认临时表空间是否已删除

select tablespace_name from dba_tablespaces;

 

如果使用asm

 

create temporary  tablespace  zxksxt_temp tempfile '/+DATA/zxksxt/datafile/zxksxt_temp001.dbf' size 30G;

 

alter  tablespace zxksxt_temp add tempfile '/+DATA/zxksxt/datafile/zxksxt_temp002.dbf' size 30G;

 

数据表空间中加文件语句

alter tablespace css add datafile '+BJ_SY_DATA/ORCL/DATAFILE/css_data_26.dbf' size  30G; 

 

 

临时表空间损坏的修复

    最近测试环境需要把一些现有的存储空间匀出一部分来给新增的环境使用。
    unix组的人很快就空间按照指定的比例重新切分好了。环境交给我的时候,我先把数据库起来,没有任何问题,因为需要到处一个创建用户的语句,就简单执行了一个查询。
select dbms_metadata.get_ddl('USER',u.username) from dba_users u WHERE USERNAME in('TEST');
但是让我意外的,报了如下的错误。
SQL> select dbms_metadata.get_ddl('USER',u.username) from dba_users u WHERE USERNAME in('TEST');
ERROR:
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '/u01/oracle/TEST/oratmp01/temp/temp01.dbf'
ORA-06512: at "SYS.DBMS_METADATA", line 4018
ORA-06512: at "SYS.DBMS_METADATA", line 5843
ORA-06512: at line 1

no rows selected

想数据文件被清掉了,先给offline了重新配置一下。
offline不可以,offline drop也不行。

SQL> alter database datafile '/u01/oracle/TEST/oratmp01/temp/temp01.dbf' offline;
alter database datafile '/u01/oracle/TEST/oratmp01/temp/temp01.dbf' offline
*
ERROR at line 1:
ORA-01516: nonexistent log file, data file, or temporary file
"/u01/oracle/TEST/oratmp01/temp/temp01.dbf"

SQL> alter database datafile '/u01/oracle/TEST/oratmp01/temp/temp01.dbf' offline drop;
alter database datafile '/u01/oracle/TEST/oratmp01/temp/temp01.dbf' offline drop
*
ERROR at line 1:
ORA-01516: nonexistent log file, data file, or temporary file
"/u01/oracle/TEST/oratmp01/temp/temp01.dbf"

 


我说不能offline,offline drop,有的人说得放在mount状态下执行,我试了也不行。
我直接删除表空间重新建得了,oracle已经开始给我哭穷了,说不能删除默认的临时表空间。
SQL> drop tablespace temp including contents and datafiles;
drop tablespace temp including contents and datafiles
*
ERROR at line 1:
ORA-12906: cannot drop default temporary tablespace

那我删除这个临时文件,oracle又说这个临时表空间里只有一个数据文件。
SQL> alter tablespace temp drop tempfile '/u01/oracle/TEST/oratmp01/temp/temp01.dbf';
alter tablespace temp drop tempfile '/u01/oracle/TEST/oratmp01/temp/temp01.dbf'
*
ERROR at line 1:
ORA-03261: the tablespace TEMP has only one file

我还是自己查看下文件夹到底在不在。一查文件夹都被清掉了。
SQL> !ls -l /dbusgsPT1/oracle/PETUSG1/oratmp01/temp
ls: /dbusgsPT1/oracle/PETUSG1/oratmp01/temp: No such file or directory

先把文件夹给补上
SQL> !mkdir -p /u01/oracle/TEST/oratmp01/temp
建立一个别名的临时文件,马上见temp01的临时数据文件还不行。
SQL> alter tablespace temp add tempfile '/u01/oracle/TEST/oratmp01/temp/temp02.dbf'  size 20G;
Tablespace altered.
然后再去删除其实不存在的临时数据文件。从数据字典里进行更新。
SQL> alter tablespace temp drop tempfile '/u01/oracle/TEST/oratmp01/temp/temp01.dbf';
Tablespace altered.
后续就如果需要可以把临时数据文件的名字从temp02.dbf改成temp01.dbf

 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论