测试:

建表空间

CREATE TABLESPACE TESTTBS DATAFILE '/oradata01/dfhdb/testtbs01.dbf' SIZE 2G;

在表空间上建表

CREATE TABLE TESTTAB TABLESPACE TESTTBS AS SELECT * FROM DBA_OBJECTS;

查找数据文件的编号

SELECT FILE_ID FROM DBA_DATA_FILES WHERE FILE_NAME='/oradata01/dfhdb/testtbs01.dbf';

查找数据文件上面的数据库对象

/* Formatted on 2020/5/19 下午 02:48:46 (QP5 v5.163.1008.3004) */
SELECT E.SEGMENT_TYPE AS SEGMENT_TYPE,
E.OWNER || '.' || E.SEGMENT_NAME AS SEGMENT_NAME,
F.FILE_NAME AS FILE_NAME,
SUM (E.BYTES) / 1024 / 1024/1024 AS SEGMENT_SIZE_GB
FROM DBA_EXTENTS E INNER JOIN DBA_DATA_FILES F ON E.FILE_ID = F.FILE_ID
WHERE F.FILE_ID = 7
GROUP BY E.SEGMENT_TYPE,
E.OWNER,
E.SEGMENT_NAME,
F.FILE_NAME
ORDER BY 4 DESC;

向表中插入数据,查看数据文件的变化

/* Formatted on 2020/5/19 下午 04:31:24 (QP5 v5.163.1008.3004) */
DECLARE
BEGIN
FOR I IN 1 .. 6
LOOP
INSERT INTO TESTTAB
SELECT * FROM TESTTAB; COMMIT;
END LOOP;
END;

查看数据文件的变化

/* Formatted on 2020/5/19 下午 04:14:28 (QP5 v5.163.1008.3004) */
SELECT E.SEGMENT_TYPE AS SEGMENT_TYPE,
E.OWNER || '.' || E.SEGMENT_NAME AS SEGMENT_NAME,
F.FILE_NAME AS FILE_NAME,
SUM (E.BYTES) / 1024 / 1024 / 1024 AS SEGMENT_SIZE_GB
FROM DBA_EXTENTS E INNER JOIN DBA_DATA_FILES F ON E.FILE_ID = F.FILE_ID
WHERE F.FILE_ID = 7
GROUP BY E.SEGMENT_TYPE,
E.OWNER,
E.SEGMENT_NAME,
F.FILE_NAME
ORDER BY 4 DESC;

从这里可以看出,此时如果要resize数据文件,最小应该是0.609375G,因为这以下已经被使用

对表收集统计信息

execute dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'TESTTAB' ,estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'for all  columns size auto' ,cascade => true ,degree=>6);

查看表占用了多少个数据块

SELECT TABLE_NAME,
NUM_ROWS,
BLOCKS,
empty_blocks,
LAST_ANALYZED
FROM dba_tables where owner='SYS' and table_name='TESTTAB';

查看表使用的实际块数

SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) USED_BLOCK FROM  SYS.TESTTAB;

通过对比,实际使用的块数和统计信息的差不多,没有多少空块

删除一部分数据,再次查看

DELETE FROM TESTTAB WHERE ROWNUM < 4000000;

再次收集统计信息

查看表实际使用的块数

也就是说总共79457个数据块中只使用了21167,表中存在着大量的空块,同时,也因为这些空块的存在,导致数据文件无法RESIZE。而且,这些空块在全表扫描的时候也会被扫到,影响数据库的性能

消除空块,即降低高水位线

ALTER TABLE SYS.TESTTAB ENABLE ROW MOVEMENT;
ALTER TABLE SYS.TESTTAB SHRINK SPACE;
/*也可以使用MOVE或导入导出,MOVE会导致索引失效,但是比SHRINK快*/

此时再次收集统计信息

可以看到,表占用的数据块数已经降下来了

再次查看数据文件的变化

此时,我们就可以RESIZE数据文件了

通过上述实验,我们可以得出结论,只要我们将数据文件上面的数据库对象的高水位降低(表通过move等,索引通过重建),即可将数据文件的实际使用量缩小,即可释放到OS

找到要操作的数据文件

找到空间不足的目录---》找到目录里面的数据文件---》找到这些数据文件含有的数据库对象个数---》找到数据文件中数据库对象最少的或者只有索引的数据文件(这个就是我们要操作的数据文件)

/* Formatted on 2020/5/19 下午 05:39:26 (QP5 v5.163.1008.3004) */
CREATE TABLE MONKEY.MONKEY_TABLESPACE_RESIZE
(
FILE_ID VARCHAR2 (100 BYTE),
TABLE_COUNT NUMBER,
INDEX_COUNT NUMBER,
TABLE_PAT_COUNT NUMBER,
INDEX_PAT_COUNT NUMBER
); /* Formatted on 2020/5/19 下午 06:00:26 (QP5 v5.163.1008.3004) */
DECLARE
CURSOR FIDS
IS
SELECT FILE_ID
FROM DBA_DATA_FILES
WHERE FILE_NAME LIKE '/ora21data04%'; TABLE_COUNT NUMBER;
TABLE_PAT_COUNT NUMBER;
INDEX_COUNT NUMBER;
INDEX_PAT_COUNT NUMBER;
BEGIN
FOR FID IN FIDS
LOOP
WITH RES
AS ( SELECT E.SEGMENT_TYPE AS SEGMENT_TYPE,
E.OWNER || '.' || E.SEGMENT_NAME AS SEGMENT_NAME,
F.FILE_ID AS FILE_ID
FROM DBA_EXTENTS E
INNER JOIN
DBA_DATA_FILES F
ON E.FILE_ID = F.FILE_ID
WHERE F.FILE_ID = FID.FILE_ID
GROUP BY E.SEGMENT_TYPE,
E.OWNER,
E.SEGMENT_NAME,
F.FILE_ID)
SELECT COUNT (*)
INTO TABLE_COUNT
FROM RES
WHERE SEGMENT_TYPE = 'TABLE'; WITH RES
AS ( SELECT E.SEGMENT_TYPE AS SEGMENT_TYPE,
E.OWNER || '.' || E.SEGMENT_NAME AS SEGMENT_NAME,
F.FILE_ID AS FILE_ID
FROM DBA_EXTENTS E
INNER JOIN
DBA_DATA_FILES F
ON E.FILE_ID = F.FILE_ID
WHERE F.FILE_ID = FID.FILE_ID
GROUP BY E.SEGMENT_TYPE,
E.OWNER,
E.SEGMENT_NAME,
F.FILE_ID)
SELECT COUNT (*)
INTO TABLE_PAT_COUNT
FROM RES
WHERE SEGMENT_TYPE = 'TABLE PARTITION'; WITH RES
AS ( SELECT E.SEGMENT_TYPE AS SEGMENT_TYPE,
E.OWNER || '.' || E.SEGMENT_NAME AS SEGMENT_NAME,
F.FILE_ID AS FILE_ID
FROM DBA_EXTENTS E
INNER JOIN
DBA_DATA_FILES F
ON E.FILE_ID = F.FILE_ID
WHERE F.FILE_ID = FID.FILE_ID
GROUP BY E.SEGMENT_TYPE,
E.OWNER,
E.SEGMENT_NAME,
F.FILE_ID)
SELECT COUNT (*)
INTO INDEX_COUNT
FROM RES
WHERE SEGMENT_TYPE = 'INDEX'; WITH RES
AS ( SELECT E.SEGMENT_TYPE AS SEGMENT_TYPE,
E.OWNER || '.' || E.SEGMENT_NAME AS SEGMENT_NAME,
F.FILE_ID AS FILE_ID
FROM DBA_EXTENTS E
INNER JOIN
DBA_DATA_FILES F
ON E.FILE_ID = F.FILE_ID
WHERE F.FILE_ID = FID.FILE_ID
GROUP BY E.SEGMENT_TYPE,
E.OWNER,
E.SEGMENT_NAME,
F.FILE_ID)
SELECT COUNT (*)
INTO INDEX_PAT_COUNT
FROM RES
WHERE SEGMENT_TYPE = 'INDEX PARTITION'; INSERT INTO MONKEY.MONKEY_TABLESPACE_RESIZE
VALUES (FID.FILE_ID,
TABLE_COUNT,
INDEX_COUNT,
TABLE_PAT_COUNT,
INDEX_PAT_COUNT); COMMIT;
END LOOP;
END;

通过上面的SQL可以查到此目录下的数据文件上的数据库对象个数,进而判断可以RESIZE的数据文件和可操作的数据库对象

89号数据文件上面只有6个普通索引和16个分区索引,没有表,因此可以通过重建这些索引达到RESIZE数据文件的目的

查看89号文件上面的对象.

/* Formatted on 2020/5/19 上午 11:35:38 (QP5 v5.163.1008.3004) */
SELECT E.SEGMENT_TYPE AS SEGMENT_TYPE,
E.OWNER || '.' || E.SEGMENT_NAME AS SEGMENT_NAME,
F.FILE_NAME AS FILE_NAME,
SUM (E.BYTES) / 1024 / 1024 AS SEGMENT_SIZE
FROM DBA_EXTENTS E INNER JOIN DBA_DATA_FILES F ON E.FILE_ID = F.FILE_ID
WHERE F.FILE_ID = 89
GROUP BY E.SEGMENT_TYPE,
E.OWNER,
E.SEGMENT_NAME,
F.FILE_NAME
ORDER BY 4 DESC;

重建或move上面的索引,之后RESIZE数据文件即可。

move索引请参考:https://www.cnblogs.com/monkey6/p/11221643.html

oracle释放空间到OS的更多相关文章

  1. 如何让Oracle释放undo表空间

    如何让Oracle释放undo表空间   最佳答案   在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间 ...

  2. 7个高级技巧帮助你释放大量Mac OS X硬盘空间

    7个高级技巧帮助你释放大量Mac OS X硬盘空间 https://blog.csdn.net/hu434587115/article/details/72874811/

  3. linux删除文件后没有释放空间

    转载 http://blog.csdn.net/wyzxg/article/details/4971843 今天发现一台服务器的home空间满了,于是要清空无用的文件,当我删除文件后,发现可用空间没有 ...

  4. 【转】Oracle 表空间与数据文件

    --============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...

  5. Oracle 表空间与数据文件

    -============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或多 ...

  6. ORACLE临时表空间

    ORACLE临时表空间总结 2014-10-05 11:35 by 潇湘隐者, 临时表空间概念 临 时表空间用来管理数据库排序操作以及用于存储临时表.中间排序结果等临时对象,当ORACLE里需要用到S ...

  7. oracle表空间不足相关问题解决办法

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  8. Oracle表空间管理

    oracle表空间相关常用命令小结: 1.ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;              //修改表空间数据文件类型 2.ALT ...

  9. ORACLE 临时表空间清理

    Oracle临时表空间主要用来做查询和存放一些缓冲区数据.临时表空间消耗的主要原因是需要对查询的中间结果进行排序.临时表空间的主要作用: 索引create或rebuildOrder by 或 grou ...

随机推荐

  1. DHCP spooping非法获取地址设置原理

    一.DHCP概述 DHCP(动态主机配置协议)是一个局域网的网络协议.指的是由服务器控制一段IP地址范围,客户机登录服务器时就 可以自动获得服务器分配的IP地址和子网掩码.默认情况下,DHCP作为Wi ...

  2. 网站配置Gittalk教程和解决gittalk的Error: Not Found.问题

    想把网站增加gittalk的评论功能,按照其他教程配置后,出现了 Error: Not Found. 的错误.截图如下: 网上找了很多解决方案,现在贴出来完整的配置Gittalk的教程. 01.新建评 ...

  3. 弱肉强食——《哆啦A梦:大雄的新恐龙》观后感

    观看大雄的新恐龙不是在电影院观看的,由于时间的问题无法去电影院观看,是在家通过梦蓝字幕组翻译好的观看的,这个翻译好的视频已经由于版权原因没有发布了. 故事的开始与以往的情节十分相似:大雄因为不想被胖虎 ...

  4. Python处理邮件内容和提取邮件里的url地址

    最近在搞一个邮箱验证账号注册和登录的模块.总结一下.就当记载.文章中涉及到域名和邮箱等都经过处理. 需求是这样子的,注册某个网站的账号,然后注册需要邮件内容激活,登录的时候如果不是常用设备的话也需要认 ...

  5. NET 5使用gRPC

    gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. https://grpc.io/docs/guides/ https://github.com/grpc/grpc-dotnet h ...

  6. mssql不存在便插入存在不执行操作

    前言 参考:https://www.jb51.cc/mssql/76911.html 在mssql中,在记录不存在时插入记录,如果存在则不执行操作 数据库 相关语句 --创建表 CREATE TABL ...

  7. frp杀毒软件报毒?

    原文地址:https://wuter.cn/1909.html/ 部分用户下载frp之后,windows defender可能会报毒,并且自动删除内网穿透主程序,导致无法穿透. 首先看一下报毒的原理是 ...

  8. alibaba-sentinel-1.8变化

    maven最新坐标 <dependencies> <dependency> <groupId>org.springframework.boot</groupI ...

  9. 【mybatis-plus】条件查询

    用mp也可以方便的实现稍复杂点的条件查询,当然了很复杂的就还是要xml编写sql了. 一.wapper介绍 先看下mp的条件构造抽象类的结构: Wrapper: 条件构造抽象类,最顶端父类 Abstr ...

  10. python对离散数据进行编码

    机器学习中会遇到一些离散型数据,无法带入模型进行训练,所以要对其进行编码,常用的编码方式有两种: 1.特征不具备大小意义的直接独热编码(one-hot encoding) 2.特征有大小意义的采用映射 ...