(转) 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/ ...
随机推荐
- LeetCode 409——最长回文串
1. 题目 2. 解答 我们先来看一看回文子串的规律,如果回文子串的长度为偶数,那么其中所有的每个元素都出现了偶数次:如果回文子串的长度为奇数,那么有一个元素出现了奇数次而其余每个元素都出现了偶数次. ...
- Vs code工具汉化
官网为:https://code.visualstudio.com/ 看到中间有一些提示的命令 选择第一条,即Ctrl+shift+P,弹出命令行,选择"Configure Display ...
- nodejs 之简单web服务器
1.service.js var http=require('http');//引入http模块 var fs=require('fs');//fs模块 var path=require('path' ...
- 慕课网_文件传输基础——Java IO流
第1章 文件的编码 1-1 文件的编码 (15:07) 第2章 File 类的使用 2-1 File 类常用 API 介绍 (10:50) import java.io.File; import ja ...
- Delphi中的Free和Nil和freeandnil函数
Delphi中的Free和Nil 在Delphi中释放对象资源时一般用Obj.Free(Obj为一个实例名),不过程Delphi中还有一个FreeAndNil(对象名)函数,那么用哪个好呢?Free和 ...
- [LeetCode] 373. Find K Pairs with Smallest Sums 找和最小的K对数字
You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...
- 对于富文本编辑器中使用lazyload图片懒加载
使用lazyload.js图片懒加载的作用是给用户一个好的浏览体验,同时对服务器减轻了压力,当用户浏览到该图片的时候再对图片进行加载,项目中使用lazyload的时候需要将图片加入data-orgin ...
- vue-loader介绍和单页组件介绍
$ \es6\sing-file> npm install vue-loader@14.1.1 -D vue-template-compiler@2.5.17 -D npm install v ...
- CF 1140B Good String
Description You have a string ss of length nn consisting of only characters > and <. You may d ...
- python基础之迭代器生成装饰器
基本概念 1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元 ...