oracle释放空间到OS
测试:
建表空间
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的更多相关文章
- 如何让Oracle释放undo表空间
如何让Oracle释放undo表空间 最佳答案 在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间 ...
- 7个高级技巧帮助你释放大量Mac OS X硬盘空间
7个高级技巧帮助你释放大量Mac OS X硬盘空间 https://blog.csdn.net/hu434587115/article/details/72874811/
- linux删除文件后没有释放空间
转载 http://blog.csdn.net/wyzxg/article/details/4971843 今天发现一台服务器的home空间满了,于是要清空无用的文件,当我删除文件后,发现可用空间没有 ...
- 【转】Oracle 表空间与数据文件
--============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...
- Oracle 表空间与数据文件
-============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或多 ...
- ORACLE临时表空间
ORACLE临时表空间总结 2014-10-05 11:35 by 潇湘隐者, 临时表空间概念 临 时表空间用来管理数据库排序操作以及用于存储临时表.中间排序结果等临时对象,当ORACLE里需要用到S ...
- oracle表空间不足相关问题解决办法
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- Oracle表空间管理
oracle表空间相关常用命令小结: 1.ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE; //修改表空间数据文件类型 2.ALT ...
- ORACLE 临时表空间清理
Oracle临时表空间主要用来做查询和存放一些缓冲区数据.临时表空间消耗的主要原因是需要对查询的中间结果进行排序.临时表空间的主要作用: 索引create或rebuildOrder by 或 grou ...
随机推荐
- CVE-2019-2618任意文件上传漏洞复现
CVE-2019-2618任意文件上传漏洞复现 漏洞介绍: 近期在内网扫描出不少CVE-2019-2618漏洞,需要复测,自己先搭个环境测试,复现下利用过程,该漏洞主要是利用了WebLogic组件中的 ...
- EF Core 封装方法Expression<Func<TObject, bool>>与Func<TObject, bool>区别
unc<TObject, bool>是委托(delegate) Expression<Func<TObject, bool>>是表达式 Expression编译后就 ...
- python初学者-判断今天是今年的第几天代码
判断今天是今年的第几天源代码 import time date =time.localtime() year,month,day=date[:3] day_month=[31,28,31,30,31, ...
- MySQL、DM 行转列及字段去重(Group_Concat())
最近在使用数据库迁移适配,由MySQL 库迁移到达梦数据库,其中进行行转列时,MySQL转换达梦sql语法有些问题,特记录. 在MySQL 下有Group_Concat(expr) ,在达梦及神通数 ...
- 【Flutter 1-16】Flutter手把手教程UI布局和Widget——容器控件Container
作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) Container 我们先来看一下Container初始化的参数: Container({ Key key, // 位置 居左.居右. ...
- 什么是可变参数?如何创建不可变集合?Steam三类方法是什么?获取流方法特点?流中间方法特点?终结流方法特点?
==知识梳理== ==重难点梳理== ==今日目标== 1.能够了解什么是可变参数 2.能够了解如何去创建不可变集合 3.能够掌握Stream流的使用 ==知识点== 1.可变参数 2.Stream流 ...
- 发起一个开源项目:基于 .NET 的博客引擎 fluss
今天我们发起一个开源项目,它的名字叫 fluss,fluss 是 river 的德语. 百川归海,每一个博客就如一条河流,输入的是文字,流出的是知识,汇入的是知识的汪洋大海. 川流不息,fluss 是 ...
- JAVA初始化及类的加载
在许多传统语言中,程序是作为启动过程的一部分被加载的.然后是初始化,紧接着程序开始运行.这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦.例如C++期望一个s ...
- Redis基础篇(七)哨兵机制
上一篇文章介绍了高可靠方案:主从集群模式.通过主从库的读写分离,来保证服务的可靠性. 当某个从库出现故障时,不影响服务的使用,主库仍然可以处理写命令,其他从库可以处理读命令.但主库发生故障,就不能处理 ...
- vue uni-app项目中的tabbar
由于公司要求开发百度小程序,所以我们采用uni-app开发的方式,一套代码多个小程序都可以用,在开发小程序的时候我们也经常会使用到tabbar.当然自己写出来也是不错的.这个就来介绍uni-app中的 ...