表空间处理过物理文件后遇到ORA-01537报错
oracle表空间问题处理记录
oracle表空间占用越来越大,增加了很多表空间文件,在不能删除表空间情况下处理表空间中无用的用户数据,腾出表空间文件后,在删除空余表空间文件(删除前查一下确认无数据的情况下),在删除表空间物理文件后发现还能查询到表空间物理文件,同时在建同名表空间文件后报错 “ORA-01537 无法添加文件该文件已是数据库的一部分”。
正常处理表空间最好且最安全的办法是,删除表空间后重建,但数据文件大重建不太实际。问题:我用命令正常删除的表空间文件只是将该数据文件从逻辑上删除,物理文件还存在,在用手工删除物理文件后使用命令还能查询到已删除的物理文件,记录一下怎么彻底删除掉这个表空间文件。
彻底删除记录
虽然命令上逻辑删除后可以手动删除掉表空间物理文件,这样做实际硬盘空间已经腾出来了,但你查询表空间还给显示这个被删除掉的文件信息,同时新建同名被删除掉的表空间文件会报错ORA-01537。
- 查询表空间物理文件使用情况 ,要清理表空间前查询正在使用的表空间文件信息和存储使用情况;
select b.file_name 物理文件名,
b.tablespace_name 表空间,
b.bytes / 1024 / 1024 大小M,
(b.bytes - sum(nvl(a.bytes, 0))) / 1024 / 1024 已使用M,
substr((b.bytes - sum(nvl(a.bytes, 0))) / (b.bytes) * 100, 1, 5) 利用率
from dba_free_space a, dba_data_files b
where a.file_id = b.file_id
group by b.tablespace_name, b.file_name, b.bytes
order by b.tablespace_name;
- 查询要删除表空间数据文件下是否还存在信息(查看表空间数据文件下有哪些对象,并记录先这些对象)
SELECT DISTINCT a.SEGMENT_NAME 对象名,
PARTITION_NAME 分区名,
a.SEGMENT_TYPE 类型,
a.TABLESPACE_NAME 表空间名,
a.FILE_ID 文件ID,
b.NAME 文件名
FROM DBA_EXTENTS a
JOIN V$DATAFILE b
ON a.FILE_ID = b.FILE#
WHERE b.NAME = 'D:\APP\ADMIN\ORADATA\ORCL\XXX03.DBF';
正常清理完用户下数据库信息后这个表空间对象查询结果应该是空的,如果有查询结果证明表空间数据文件没有清理干净。
- 删除表空间数据文件命令(这个命令用来将该数据文件从逻辑上删除)
alter database datafile 'D:\APP\ADMIN\ORADATA\ORCL\XXX03.DBF' offline drop;
这个删除命令有局限,只是数据库对表空间数据文件的逻辑删除,物理文件还是存在的,执行完这个命令后我直接去存储表空间文件的地给物理文件删除了(这个删除前提是需要确认表空间数据文件下已经没有任何信息了)
- 查看数据文件是否还存在(检查指定表空间下表空间数据文件有哪些)
SELECT T1.NAME 表空间, T2.NAME 数据文件
FROM V$TABLESPACE T1, V$DATAFILE T2
WHERE T1.TS# = T2.TS#
AND T1.NAME LIKE 'DSY%';
用表空间数据文件删除命令进行删除后,检查数据文件中还可以查询到已删除过的表空间信息
- 彻底删除,查询检索表空间数据文件的状态
SELECT file_id, file_name, status, online_status FROM Dba_Data_Files;
DBA_DATA_FILES 是记录数据库中所有数据文件的详细信息的系统视图,其中ONLINE_STATUS字段表示“文件的状态”,‘ONLINE’(在线状态),‘RECOVER’(离线状态)。查询结果显示已被删除的表空间数据文件被置于离线状态,还存在视图中。
`
上面是我的截图,可以看到03.DBF这个已删除的表空间数据文件还是存在的,后面要删除掉它。
- 从file$基表中把这个文件删除
select file#,status$ from file$;
delete file$ where file# = 9;
- 再次检查表空间数据文件
SELECT file_id, file_name, status, online_status FROM Dba_Data_Files;
最终实际检查时还是有问题,可以查询到数据文件的存在,根据网上的建议需要“重置控制文件”(目前重置控制文件失败了,重启了服务还是用的以前的控制文件…这个后续重新试一下重置控制文件)
8. 检查oracle配置文件,查看控制文件的个数、名称和位置
show parameter control_files
查看 v$controlfile 视图
select name,block_size,file_size_blks from v$controlfile;
- 查看控制文件的内容
将控制文件转出为文本文件
查看控制文件的内容### 导入
参考博客
[1]: https://www.cnblogs.com/colaclicken/p/11347737.html