为什么Oracle DROP USER CASCADE不会从磁盘中删除用户的所有重新映射?

时间:2016-02-27 00:54:12

标签: sql oracle oracle11g oracle-sqldeveloper

我需要从Oracle 11g R2数据库中删除特定用户的所有残余。这意味着不仅要逐个删除用户,还要删除与该用户关联的所有对象,以及磁盘上的所有物理残留,例如.dbf个文件。

我阅读了几篇建议语法的文章,并针对每个用户确定了以下两行系列:

DROP USER <username> CASCADE;
DROP TABLESPACE <username> INCLUDING CONTENTS AND DATAFILES;  

然后我输入SELECT USERNAME, DEFAULT_TABLESPACE FROM DBA_USERS;并确认具有特定用户名的USER未包含在结果中。

但是我也打开了包含.DBF文件的文件夹,我注意到 .DBF文件没有被删除,即使Oracle SQL Developer界面告诉我这两个文件都是以上命令成功。

我需要采取哪些特定的语法或其他操作才能从Oracle 11g R2数据库中删除用户及其关联架构等的每个残余?

正在进行的研究:

在阅读@ EliasGarcia的方法后,我尝试了他的第一个命令select tablespace_name from dba_data_files where file_name = 'file_including_path',用于OP中前面命令中使用的相同用户名。但是这个查询没有产生任何结果,因为我的OP中上面显示的两个命令删除了表空间。

鉴于我必须删除用户以及与用户相关的所有对象,有人可以向我们展示如何将OP方法与@EliasGarcia的方法相结合吗?例如, OP要求提供类似DROP USER username CASCADE INCLUDING CONTENTS AND DATAFILES;

的内容

在运行上述命令后,我毫不犹豫地删除.dbf文件。

1 个答案:

答案 0 :(得分:7)

数据文件分配给表空间,而不是用户。删除用户将从表空间中删除表等,但底层存储不受影响。

不要直接从文件系统中删除dbf文件,否则会导致数据库陷入混乱。要删除它们,请使用以下语句查找文件所属的表空间:

select tablespace_name
from   dba_data_files
where  file_name = <file name with full path>;

然后您可以通过删除表空间来删除​​文件:

drop tablespace <tablespace_name> including contents and datafiles;

在执行此操作之前,您应该验证仍然没有为其他用户分配给表空间的任何对象。您可以通过运行:

找到它
select * from dba_segments
where  tablespace_name = <tablespace to drop>;

如果返回任何内容,如果要在删除表空间之前保留它们,请将对象移动到另一个表空间。