为什么Oracle DROP USER CASCADE不能从磁盘中删除用户的所有重新分区?

问题描述:

我需要从Oracle 11g R2数据库中清除所有特定用户的残余。这意味着除了删除用户之外,还会删除与该用户关联的所有对象以及磁盘上的所有物理残留物,例如.dbf文件。为什么Oracle DROP USER CASCADE不能从磁盘中删除用户的所有重新分区?

我读了几篇文章提示了这种语法,并在以下一系列的两行对每个用户支付:

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

我然后键入SELECT USERNAME, DEFAULT_TABLESPACE FROM DBA_USERS;并证实与特定用户名的用户没有被列入结果。

但我也有一个包含.DBF文件打开的文件夹,我注意到,尽管Oracle SQL Developer中的界面告诉我,这两种以上两个命令的成功.DBF文件不会被删除。

为了从Oracle 11g R2数据库中删除用户及其关联模式等的剩余部分,需要采取哪些特定语法或其他操作?


正在进行的研究:


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

鉴于我必须删除用户和所有与用户相关的对象,是否有人可以展示如何将OP方法与@EliasGarcia的方法结合?例如,的OP是要求像DROP USER username CASCADE INCLUDING CONTENTS AND DATAFILES;

我犹豫运行上面的命令后,直接删除.dbf文件。

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

不要直接从文件系统中删除dbf文件,你会让数据库变得混乱。要删除它们,发现其表空间中的文件属于使用下面的语句:

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

然后,您可以删除该文件(S)通过删除表空间:

drop tablespace <tablespace_name> including contents and datafiles; 

这样做,你应该确认之前但是没有任何对象仍然分配给其他用户的表空间。您可以通过运行找到这个:

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

如果返回任何内容,对象,如果你想丢弃表之前,让他们移动到另一个表空间。

+0

您的第一条命令是从dba_data_files中选择tablespace_name,其中file_name ='file_including_path'没有产生任何结果,因为表空间已被我的OP中显示的两个命令删除。鉴于我必须删除用户以及与用户相关的所有对象,您能否介绍如何将OP方法与您的方法结合起来? – HereAndThere

+0

该OP请求类似于“DROP USER用户名级联,包括内容和数据文件;” – HereAndThere

+0

尽管在“包含”子句中有synax,Oracle仍不会删除数据文件。如果你删除了表空间,你可以用你的操作系统手动删除它,或者你可以简单地使用: CREATE SMALLFILE TABLESPACE dev_01 DATAFILE'C:\ Oradata \ db1 \ devdata \ dev_01.dbf'SIZE 500M REUSE;' This将会重用现有文件(如果存在)。 –