收到某数据库服务器容量超90%限值告警,排查处理要么删除些数据,要么扩容
然后就关注到临时表空间这块,发现部分临时表空间的数据文件一直未更新,日期还是去年的,接下来具体来看看是怎么回事
1. 查询临时表空间文件触发报错
SQL> select round(bytes/1024/1024/1024,2) as bytes,tf.* from dba_temp_files tf;
select round(bytes/1024/1024/1024,2) as bytes,tf.* from dba_temp_files tf
ORA-01157: 无法标识/锁定数据文件 2015 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 2015: '/mnt/oradata/tempp01.dbf'
2. 原因分析
2.1 究竟是怎么回事,OS层面查询,发现文件确实是不存在的;
猛然想起,数据库缩容做迁移的时候,只处理数据文件,并新增了个临时表空间 temp2,对原有的临时表 tempp 空间没有给予理会,初步判断应该是一个无用的临时表空间,难怪一直没有发现他有问题
[oracle@virdb mnt]$ ll -h /mnt/oradata/tempp01.dbf
ls: 无法访问/mnt/oradata/tempp01.dbf: 没有那个文件或目录
为了防止出错,进一步确认
2.2 查看所有临时表空间名字及文件名
发现tempp临时表空间包含的部分文件确实不存在与操作系统了
select f.file#,t.ts#,f.name "File",t.name "Tablespace"
from v$tempfile f,V$tablespace t
where f.ts# = t.ts# ;
2.3 查看当前用户的默认表空间
select distinct temporary_tablespace from dba_users;
查询后发现都是temp2
2.4 查看会话正在使用的表空间
SELECT se.username,
sid,
serial#,
sql_address,
machine,
program,
tablespace,
segtype,
contents
FROM v$session se,
v$sort_usage su
WHERE se.saddr=su.session_addr;
查询后发现都是temp2
到此,可以确认:tempp确实是无用的,可以进行删除。
由于涉及较多的文件,为了加快速度,先删除部分表空间包含的文件,最后删除临时表空间(谨慎)
4. 解决问题:删除无用临临时表空间tempp
4.1 删除临时表空间包含的数据文件
SQL> alter tablespace TEMPP drop tempfile '/mnt/oradata/tempp02.dbf';
Tablespace altered.
SQL> alter tablespace TEMPP drop tempfile '/mnt/oradata/tempp03.dbf';
alter tablespace TEMPP drop tempfile '/mnt/oradata/tempp04.dbf';
Tablespace altered.
SQL>
Tablespace altered.
4.2 删除临时空间及其文件
SQL> drop tablespace TEMPP including contents and datafiles ;
Tablespace dropped.
到此,再次查询之前遇到报错的语句,已经可以正常执行了。
迁移无小事,还是要多查看多验证