客观地删除Oracle数据库中的数据

时间:2014-12-19 19:26:20

标签: database oracle

我有一个带有虚拟数据的基本测试数据库(Oracle XE 11g),我试图对它进行基准测试。我不在乎数据发生了什么。

我尝试插入大量数据(大约25 GB),但遇到了错误,例如:

"...maximum file size of autoextend clause out of range"

但它说它达到了11 GB,然后停了下来。 好吧,没问题,谷歌说我可以跑:

SELECT * FROM DBA_DATA_FILES;

...然后复制路径,并运行此命令

ALTER DATABASE DATAFILE '/my/path/to/datafile' autoextend on maxsize 30G; 

所以这一切都很有效,很酷。现在我需要摆脱现有的数据,这些数据都包含在一个表中。

所以我决定跑:

DROP TABLE my_schema.benchmark_table CASCADE CONSTRAINTS;
COMMIT; 

现在,我假设表格和所有数据都已消失,但我使用我列出的第一个命令检查它,并且它似乎没有实际删除数据。甲骨文的文档说,再次关闭谷歌,我引用:

  

使用DROP TABLE语句将表或对象表移动到回收站,或者完全从数据库中删除表及其所有数据。

     

注意:   除非您指定PURGE子句,否则DROP TABLE语句不会导致空间被释放回表空间以供其他对象使用,并且该空间将继续计入用户的空间配额。

哦,所以有一个回收站,这是可以理解的,虽然我认为承诺会照顾到这一点。没问题,我只需按照文档运行:

PURGE TABLE my_schema.benchmark_table;

它说有效吗?好吧,以防万一,让我们检查,所以我跑:

SELECT * FROM RECYCLEBIN;
SELECT * FROM USER_RECYCLEBIN; 

在这两种情况下都会获取0行。 "它必须工作!",我说。但现在我跑了:

SELECT file_name, bytes, max_bytes FROM DBA_DATA_FILES;

...遗憾的是,它显示了字节列下的11xxxxxxxxx,我假设是使用的字节,以及maxbytes部分下的32xxxxxxxxx。因此,分配的磁盘空间仍未释放。我需要释放11 GB。

我宁愿不删除整个表空间,因为已经配置了我不想删除的模式,抽象数据类型,索引等。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

dba_data_files告诉您数据文件有多大。通常,这可能与表中的数据量有很大不同。

您有一个大小约为10 GB的数据文件(基于您发布的bytes数字)。在该数据文件中,您有0个或更多个段,每个表一个段(或多或少,对于分区表或集群或具有延迟段创建的表的事件有例外,但我会忽略它)。在每个段内是一个或多个范围。在每个范围内都有许多数据块。在每个数据块中是零行或多行的数据。

删除表后,不再有一个包含表名的段(也没有表中包含各种索引名称的段)。假设表空间中没有其他段,表空间中没有一个数据文件(为简单起见),这意味着您有一个10 GB的数据文件,其中0个字节分配给段。如果在同一表空间中创建另一个表(创建新段),则这些段将使用已分配给数据文件的10 GB空间。这意味着在Oracle必须增长数据文件之前,您可以在新表中插入10 GB。

您可以通过查看dba_segments

来查看表格空间中各个细分受众群的大小
SELECT owner, segment_name, bytes
  FROM dba_segments
 WHERE tablespace_name = <<name of tablespace>>;

您可以通过查看dba_extents来查看分配给每个细分的各种范围。