(转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化
硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放。
【delete后用:alter table table_name move truncate后用:alter table table_name deallocate unused 均不可解决】
解决方法:
--delete/truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化汇总
--查询DBF文件、数据库空间、高水位线占用情况
select /*+ ordered use_hash(a,b,c) */
a.file_id,
a.file_name,
a.tablespace_name,
a.filesize,
b.freesize,
(a.filesize - b.freesize) usedsize,--使用空间
c.hwmsize,
c.hwmsize - (a.filesize - b.freesize) unsedsize_belowhwm,--未使用空间
a.filesize - c.hwmsize canshrinksize--文件大小
from (select tablespace_name,file_id, file_name, round(bytes / 1024 / 1024) filesize
from dba_data_files) a,
(select file_id, round(sum(dfs.bytes) / 1024 / 1024) freesize
from dba_free_space dfs
group by file_id) b,
(select file_id, round(max(block_id) * 8 / 1024) HWMsize--高水位线
from dba_extents
group by file_id) c
where a.file_id = b.file_id
and a.file_id = c.file_id
order by unsedsize_belowhwm desc
--查询【各用户】【表空间】数据存储空间占用大小(用户与表空间对应关系)
select owner,tablespace_name ,sum(bytes)/1024/1024 from dba_segments group by owner,tablespace_name
--查询当前用户【表】数据存储空间占用大小
select segment_name, bytes/1024/1024
from user_segments
where segment_type = 'TABLE';
--查询当前用户【所有对象】数据存储空间占用大小
select segment_type, Segment_Name, Sum(bytes) / 1024 / 1024
From User_Extents
Group By Segment_Name, segment_type
--查询【表空间】与【DBF】对应关系与存储情况
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
--删除表数据
truncate table ZW_FZHSZD
TRUNCATE TABLE JC_ASSETS_ADD --DROP STORAGE
--分析(不分析,会导致下面步骤查询表的高水位线时候数值会不准)
ANALYZE TABLE ZW_FZHSZD ESTIMATE STATISTICS;
--查询表的水位分配情况
SELECT blocks, empty_blocks, num_rows
FROM user_tables
WHERE table_name = 'ZW_FZHSZD';
--TRUNCATE后可释放表数据库空间,表默认把TRUNCATE数据前的空间大小作为初始空间大小,表的高水位线不会降低,需要Shring收缩表的大小(下面详解)后方可降低表的水位线
--释放/收缩表数据库空间
--alter table tablename move --选择性操作,delete后可通过此方法释放数据库空间,但此操作MOVE时需要双倍的表空间,大表有可能会导致高水位线提高,而且如果表上有索引的
话,需要重构索引,不建议使用
alter table tablename deallocate unused keep 0;--成功释放数据库空间,但高水位线不降低(表的高水位线降低,表空间的不降低??) alter table JC_ASSETS_CHANGE enable row movement;--开启movement功能
alter index xx rebuild--movement后需要重建索引(未验证可行性)
ALTER TABLE USERS SHRINK SPACE --cascade --成功收缩表的数据库空间为最小值,但【表空间】水位有时降低、有时不降低,原因不详
--回缩索引为最小值(选择性操作)
ALTER INDEX INDEXINDEX1_FZHSZD SHRINK SPACE
--查询最大可resize空间
select a.file#,
a.name,
a.bytes / 1024 / 1024 CurrentMB,
ceil(HWM * a.block_size / 1024 / 1024) Resizeto,
(a.bytes - HWM * a.block_size) / 1024 / 1024 releaseMB,
'alter database datafile ''' || a.name || ''' resize ' ||
ceil(HWM * a.block_size / 1024 / 1024) || 'M;' ResizeCmd
from v$datafile a,
(select file_id, max(block_id + blocks - 1) HWM
from dba_extents
group by file_id) b
where a.file# = b.file_id(+)
and (a.bytes - HWM * a.block_size) > 0
order by 5
--Resize释放硬盘空间(resize值必须大于高水位线,所以降低水位线非常重要)
ALTER DATABASE DATAFILE 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' resize 1000M;
--释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置.
Alter table table_name deallocate unused
终极方法:把表空间A内所有对象(表、索引)移动到表空间B,然后Resize 表空间A为最少值(表空间内所有对象移走后高水位线会降到最低),然后再把对象从表空间B移回表空间A(测试可用,但不知道有没副作用)
PS:
【清理临时表空间方法】
ALTER TABLESPACE 临时表空间名 SHRINK SPACE KEEP 512M
EMP:ALTER TABLESPACE TEMP_FMMS2 SHRINK SPACE KEEP 512M
--表空间DBF文件大小
select bytes/1024/1024 free_size from dba_data_files where tablespace_name='USERS';
--表空间空闲空间
select SUM(BYTES/1024/1024) total_size from dba_free_space where tablespace_name='USERS';
--表空间水位线
select max(block_id)*8/1024 "m size" from dba_extents where tablespace_name='USERS'
(转) Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化的更多相关文章
- INITIAL参数设置导致TRUNCATE TABLE不能降低高水位线案例
在一个数据库使用下面SQL找出了一批需要降低高水位线的表,其中有几个表没有数据,于是我打算用TRUNCATE来降低高水位线HWM SELECT a.owner, a.segment_na ...
- oracle优化:避免全表扫描(高水位线)
如果我们查询了一条SQL语句,这条SQL语句进行了全表扫描,那到底是扫描了多少个数据块呢?是表有多少数据,就扫描多少块吗?不是的.而是扫描高水位线一下的所有块.有的时候有人经常说,我的表也不大呀,怎么 ...
- 【重新挂载磁盘空间】Linux系统/home的磁盘空间重新挂载给/root
以下是在centos7版本上做测试 使用如下命令查看磁盘使用情况 ls -lh 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.9 ...
- AUL恢复truncate删除的表
背景 接到用户申告,新毕业的兄弟不小心把数据库中的3个关键表给truncate了,由于这个业务还在测试阶段,系统没有任何形式的备份. 客户的OS平台是windows平台,数据库是Oracle9207 ...
- Oracle 高水位说明和释放表空间,加快表的查询速度
高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表 ...
- Oracle 执行报错表空间或临时表空间不足,降低水位线方法
Oracle 执行语句插入临时表报表空间不足,在增加表空间到最大后依然报错,经分析应该为创建的临时表水位线未清除导致,查询降低水位线方法如下: 原文地址:http://blog.itpub.net/2 ...
- mysql----快速删除数据表(drop,truncate.delete)
概念: 三者均可删除数据表 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...
- 为什么delete后磁盘空间没有释放而truncate会释放?
背景 因项目需求,需要清理一批旧数据,腾出空间给新数据,让同事负责这件事.料想会很顺利,但很快找到我,并告知在postgresql中把一张大的数据表删除掉了,查询表的size并没有改变. 我震惊了,问 ...
- mysql使用硬链接配合truncate 删除2.2T的表 --杨奇龙
http://blog.csdn.net/wyzxg/article/details/8626814 http://blog.itpub.net/22664653/viewspace-750408/ ...
随机推荐
- D4下午
开始学图论辣 图的基本模型 图是点和边组成的集合体,G = <V, E> v是点集,e是边集 还有就是有向图无向图啥的 算了太水了不写了 提几个没大见过的吧 环 环上任意两点间可以随意到达 ...
- Application 使用分析
一. Application 分析 1. Application 简介 (1) Application 概念 Application 概念 : Application 属于组件范畴; -- 本质 : ...
- vue问题四:富文本编辑器上传图片
vue使用富文本编辑器上传图片: 我是用的是wangEditor 富文本编辑器 demo:http://www.wangeditor.com/ 1).安装依赖:npm install wangedit ...
- java的引用传递
public class T{ static class Node{ int value; Node left = null; Node right = null; public Node(int v ...
- 阶段3 2.Spring_06.Spring的新注解_8 spring整合junit完成
Junit的核心Runner在执行的时候不会创建容器.同时它字节码文件,也改不了 spring整合junit 想办法把junit里面的不能加载容器的main方法换掉.从而实现创建容器.有了容器就可以实 ...
- 慕课网_Java Socket应用---通信是这样练成的
第1章 网络基础知识 1-1 网络基础简介 (10:21) 第2章 Java 中网络相关 API 的应用 2-1 Java 中的 InetAddress 的应用 (08:10) import java ...
- getApplication()和getApplicationContext()区别
二者使用结果相同,我们写个代码分别打印二者返回结果,发现两个方法获取的是同一个对象. public class MainActivity extends Activity { @Override pr ...
- UML_2_浅谈UML的概念和模型之UML九种图
转载:https://my.oschina.net/zhumenzhongren/blog/667353 上文我们介绍了,UML的视图,在每一种视图中都包含一个或多种图.本文我们重点讲解UML每种图的 ...
- Synchronized知道这些就可以了
Synchronized关键字算是Java的元老级锁了,一开始它撑起了Java的同步任务,其用法简单粗暴容易上手.但是有些与它相关的知识点还是需要我们开发者去深入掌握的.比如,我们都知道通过Synch ...
- 自动部署脚本-bash
from here !/bin/bash Check if user is root if [ $(id -u) != "0" ]; then Echo_Red "Err ...