Oracle 删除数据后释放数据文件所占磁盘空间

摘要:
在测试期间,大量数据被插入到数据库中。测试结束后,测试用户及其所有数据都被删除,但数据文件没有减少。查阅数据后,我们发现这是由甲骨文的“高水位”造成的。我们如何减少这些数据文件的大小?删除数据后,虽然占用的数据块已减少,但高水位不会下降。)降低高水位的正确方法是首先降低HWM,然后确定实际占用的大小,然后调整数据文件的大小。好的,数据文件已从修改前的1.4GB更改为600MB。

.

.

.

.

.

测试的时候向数据库中插入了大量的数据,测试完成后删除了测试用户以及其全部数据,但是数据文件却没有缩小。经查阅资料之后发现这是 Oracle “高水位”所致,那么怎么把这些数据文件的大小降下来呢?解决办法如下:

概念:

表空间的相关知识请见这里,详细的介绍了 Oracle 数据库的存储结构。

高水位:High Water Mark (HWM),是段(Segment)的一个指标,界定了段(Segment)曾经配置过的 block 水位。

据说,随着数据的 insert,所使用段(Segment)的数据块(data block)也不断增加,这时候高水位(HWM)也随着上升。当数据被删除后(无论是 delete 还是 truncate table)虽然被占用的数据块(data block)已经相应减少,但是高水位(HWM)并不会随之下降。当高水位(HWM)下存在大量的空白数据块(data block)时,如果发生全表扫描(Full Table Scan, FTS)就会造成很多额外的 IO。因为全表扫描(FTS)的时候读取段(Segment)中的数据块(data block)会一直读取到高水位(HWM)才结束。高水位(HWM)就是段(Segment)中数据块(data block)有没有使用的分界线,所以全表扫描(FTS)所花费的时间不但不会因为数据的删除而减少,反而会增加。(关于此段查询效率的内容有待验证,笔者未亲自验证。不过可以确定的是高水位确实不会随着数据的删除而下降。)

降低高水位的正确做法是先降低HWM,再确定实际占有大小,再resize数据文件。

数据文件比较多,我们用其中一个较大的文件做为 Demo,其它数据文件如法炮制即可。我选择的文件是:D:oracleproduct10.2.0oradataorclUSERS01.DBF 1.4GB 左右。

1.登录 sqlplus:

语法:sqlplus username/password@hostname:port/sid

例:sqlplus system/orcl@localhost:1521/orcl

2.查询这个数据文件的编号:

SQL> select file#, name from v$datafile;

FILE# NAME
------------------------------------------------------------------------------------------

1 D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF

2 D:ORACLEPRODUCT10.2.0ORADATAORCLUNDOTBS01.DBF

3 D:ORACLEPRODUCT10.2.0ORADATAORCLSYSAUX01.DBF

D:ORACLEPRODUCT10.2.0ORADATAORCLUSERS01.DBF

 可以看到,我们要操作的数据文件的编号是4。

2.根据文件 ID 查询这个数据文件最大数据块(data block)的编号:(似乎这个最大编号可以代表该数据文件中数据块的数量,这一点有待考证。)

SQL> select max(block_id) from dba_extents where file_id=4;

MAX(BLOCK_ID)
-------------
65673

3.计算该表空间实际占用的空间:

--查询数据块的大小,单位是 byte

SQL> show parameter db_block_size;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192

--8192 byte = 8 kb

--接下来计算该表空间占用的物理空间

SQL> select 65673 * 8 / 1024 from dual;

65673*8/1024
------------
513.070313

--实际占用的物理空间是 513MB 多点

4.最后一步,把我们的数据文件尺寸修改得比这个表空间实际占用的物理空间大点就行了:

SQL> alter database datafile 'D:oracleproduct10.2.0oradataorclUSERS01.DBF' resize 600m;

数据库已更改。

OK,数据文件从修改前的 1.4GB 变成了 600MB。对于其它的数据文件,大家也知道如何收缩了吧?

参考文献:

Oracle表空间(tablespaces)http://www.cnblogs.com/fnng/archive/2012/08/12/2634485.html

Oracle降低HWM的集中方法 http://hi.baidu.com/wschao2005/item/5383388fb2e21fc8b17154b1

修改oracle数据文件大小 http://www.2cto.com/database/201204/126864.html

oracle删除数据后,空间不释放如何解决??? http://bbs.csdn.net/topics/310046810

免责声明:文章转载自《Oracle 删除数据后释放数据文件所占磁盘空间》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CA证书安装以及SSLH协议转发ESLint的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据集成之主数据管理(一)基础概念篇

数据集成是当下比較热门的话题,相关的产品和平台也越来越多。非常多CIO都在各种数据集成平台和产品之间犹豫不决。因此对数据集成平台的框架体系有全面的理解,对各个厂家产品所提供的功能有深入的认识才干为数据平台选型的决策提供可靠的保证。 我有幸參与了国内一个知名企业的集成平台的设计工作,并主导了数据集成平台的需求分析和产品选型工作。这次工作中,研究了非常多新的...

使用Python Requests上传表单数据和文件

在Python环境下写一个HTTP客户端,发送POST请求,同时上传表单数据和文件,我们可以使用Requests模块来实现。代码如下: data = { 'name': 'nginx' } files = {'file': open("abc.csv", 'rb')} response = requests.post(url, data=data...

使用PLSql连接Oracle时报错ORA-12541: TNS: 无监听程序

非常多时候为了优化我们的启动项把oracle的服务禁止了。但是重新启动启动之后使用PLSQL登陆oracle时会出现无监听程序,这说明我们有一些服务没有启动。我们先查看一下oracle的服务是否启动,查看方法是计算机-->>管理-->>服务和应用程序-->>服务,进行查找oracle的启动服务, 进入之后详细情况例如以...

oracle中去掉回车换行空格的方法详解

函数: 1.translate语法:TRANSLATE(char, from, to)用法:返回将出现在from中的每个字符替换为to中的相应字符以后的字符串。            若from比to字符串长,那么在from中比to中多出的字符将会被删除。            三个参数中有一个是空,返回值也将是空值。 举例:SQL> select...

php 访问java接口数据

$header = []; $header[] = 'Accept:application/json'; $header[] = 'Content-Type:application/json;charset=utf-8'; $data = $_GPC['mobile']; $ch = curl_init();...

2020 Java开发者数据分析:中国已成为 Java 第一大国

最近知名开发工具供应商Jetbrains在Java 25周年之际,对开发群体做了一次有意思的数据分析。 全文内容可见:https://blog.jetbrains.com/idea/2020/09/a-picture-of-java-in-2020/ 通过这次的分析,得出了非常多意思的结论,接下来我们一起来快速看看,都有哪些有意思的现象出现! 有多少Jav...