梁恒
骑士
骑士
  • UID232
  • 粉丝0
  • 关注0
  • 发帖数23
阅读:4882回复:0

oracle释放表空间资源,降低高水位

楼主#
更多 发布于:2020-07-29 14:39


场景描述


Oracle数据库中因历史数据越来越多,数据表空间已自动扩展占满了磁盘空间,无法继续扩展存储数据,需要删除部分历史数据。
但是由于oracle存储机制影响,delete语句删除数据没法自动释放空间,需要采用truncate语句来截断表并释放存储空间,将表空间的水位(介绍信息:
https://www.cnblogs.com/linjiqin/archive/2012/01/15/2323030.html)降低下来,这样才能真正的释放数据释放空间

操作过程


1、 先建立一个中间表"TME_AWS_ST_back0507"

CREATE TABLE
  "METEOGZ"."TME_AWS_ST_back0507"
  
  (  "ID" VARCHAR2(32)
  NOT NULL ENABLE,
 "STATIONNUM"
  CHAR(5) NOT NULL ENABLE,
 "STORETIME"
  DATE DEFAULT sysdate,
 "OBSTIME"
  DATE NOT NULL ENABLE,
 "COMPTIME"
  DATE,
 "LONGITUDEX"
  NUMBER(16,13),
 "LATITUDEY"
  NUMBER(16,13),
 "COUNTYCODE"
  VARCHAR2(9),
 "CITYCODE"
  VARCHAR2(9),
 "PROVCODE"
  CHAR(2),
 "WINDDIRECT"
  VARCHAR2(6),
 "WINDVELOCITY"
  NUMBER(4,1),
 "WINDD10MS"
  VARCHAR2(6),
 "WINDV10MS"
  NUMBER(4,1),
 "MAXWINDD10MS"
  VARCHAR2(6),
 "MAXWINDV10MS"
  NUMBER(4,1),
 "TIMEHMAXWIND10MS"
  VARCHAR2(6),
 "INSTANTWINDD"
  VARCHAR2(6),
 "INSTANTWINDV"
  NUMBER(4,1),
 "HEXMAXWINDD"
  VARCHAR2(6),
 "HEXMAXWINDV"
  NUMBER(4,1),
 "TIMEHEXMAXWIND"
  VARCHAR2(6),
 "PRECIPITATIONAMOUNT"
  NUMBER(4,1),
 "TEMP"
  NUMBER(4,1),
 "MAXTEMP"
  NUMBER(4,1),
 "TIMEHMAXTEMP"
  VARCHAR2(6),
 "MINTEMP"
  NUMBER(4,1),
 "TIMEHMINTEMP"
  VARCHAR2(6),
 "RELHUMIDITY"
  NUMBER(3,0),
 "MINRELHUMIDITY"
  NUMBER(3,0),
 "TIMEHMINRELHUMIDITY"
  VARCHAR2(6),
 "VAPOURPRESS"
  NUMBER(4,1),
 "DEWTEMP"
  NUMBER(4,1),
 "STATIONPRESS"
  NUMBER(6,1),
 "MAXSTATIONPRESS"
  NUMBER(6,1),
 "TIMEHOURMAXPSTA"
  VARCHAR2(6),
 "MINSTATIONPRESS"
  NUMBER(6,1),
 "TIMEHOURMINPSTA"
  VARCHAR2(6),
 "GRASSLANDTEMP"
  NUMBER(4,1),
 "GRASSLANDMAXTEMP"
  NUMBER(4,1),
 "TIMEHGRASSMAXT"
  VARCHAR2(6),
 "GRASSLANDMINTEMP"
  NUMBER(4,1),
 "TIMEHGRASSMINT"
  VARCHAR2(6),
 "SURFACETEMP"
  NUMBER(4,1),
 "SURFACEMAXTEMP"
  NUMBER(4,1),
 "TIMEHSURFMAXT"
  VARCHAR2(6),
 "SURFACEMINTEMP"
  NUMBER(4,1),
 "TIMEHSURFMINT"
  VARCHAR2(6),
 "TEMP5CM"
  NUMBER(4,1),
 "TEMP10CM"
  NUMBER(4,1),
 "TEMP15CM"
  NUMBER(4,1),
 "TEMP20CM"
  NUMBER(4,1),
 "TEMP40CM"
  NUMBER(4,1),
 "TEMP80CM"
  NUMBER(4,1),
 "TEMP160CM"
  NUMBER(4,1),
 "TEMP320CM"
  NUMBER(4,1),
 "EVAPGAUGE"
  NUMBER(4,1),
 "SEALEVELPRESS"
  NUMBER(5,1),
 "VISIBILITY"
  NUMBER(6,1),
 "VISIMIN"
  NUMBER(6,1),
 "TIMEHVISIMIN"
  VARCHAR2(6),
 "MINPRECIPITATION"
  CHAR(120),
 "MAXPRECIPITATION10"
  VARCHAR2(10),
 "TIMEMAXPRECIPITATION10"
  VARCHAR2(6),
 "WEATHERPHENOMENONNOW"
  VARCHAR2(64),
 "WEATHERPHENOMENON1"
  VARCHAR2(64),
 "WEATHERPHENOMENON2"
  VARCHAR2(64),
 "WEATHERPHENOMENONCONTINUOUS"
  VARCHAR2(64),
 "TOTALCLOUD"
  VARCHAR2(10),
 "LOWCLOUD"
  VARCHAR2(10),
 "LOWCLOUDHEIGHT"
  VARCHAR2(10),
 "CLOUDFORM"
  VARCHAR2(24),
 "SNOWDEPTH"
  VARCHAR2(10),
 "WIREICEDIAMETER"
  VARCHAR2(10),
 "HAILDIAMETER"
  VARCHAR2(10),
 "TEMPCHANGE24H"
  NUMBER(4,1),
 "PRESSCHANGE3H"
  NUMBER(5,1),
 "PRESSCHANGE24H"
  NUMBER(5,1),
 "PRECIPITATION3H"
  NUMBER(5,1),
 "PRECIPITATION6H"
  NUMBER(5,1),
 "PRECIPITATION12H"
  NUMBER(6,1),
 "PRECIPITATION24H"
  NUMBER(6,1),
 "TEMPMAX24H"
  NUMBER(4,1),
 "TEMPMIN24H"
  NUMBER(4,1),
 "TEMPAVG24H"
  NUMBER(4,1),
 "TEMPMAX12H"
  NUMBER(4,1),
 "TEMPMIN12H"
  NUMBER(4,1),
 "TEMPAVG12H"
  NUMBER(4,1),
 "VISIBILITY1M"
  NUMBER(5,0),
 "VISIBILITY10M"
  NUMBER(5,0),
 "HEXMAXWINDV6"
  VARCHAR2(10),
 "HEXMAXWINDD6"
  VARCHAR2(3),
 "HEXMAXWINDV12"
  VARCHAR2(10),
 "HEXMAXWINDD12"
  VARCHAR2(3),
 "SURFACEMINTEMP12"
  VARCHAR2(10),
 "TEMPMAX3H"
  NUMBER(4,1),
 "TEMPMIN3H"
  NUMBER(4,1),
 "TEMPAVG3H"
  NUMBER(4,1),
 "TEMPMAX6H"
  NUMBER(4,1),
 "TEMPMIN6H"
  NUMBER(4,1),
 "TEMPAVG6H"
  NUMBER(4,1),
 "TEMPCHANGE3H"
  NUMBER(4,1),
 "TEMPCHANGE6H"
  NUMBER(4,1),
 "TEMPCHANGE12H"
  NUMBER(4,1),
 "VISIBMIN1"
  VARCHAR2(10),
 "VISIBMIN10"
  VARCHAR2(10),
 "CLOUDAMOUNTCOMP"
  VARCHAR2(3),
 "CLOUDFORM1"
  VARCHAR2(3),
 "CLOUDFORM2"
  VARCHAR2(3),
 "CLOUDFORM3"
  VARCHAR2(3),
 "CLOUDFORM5"
  VARCHAR2(3),
 "CLOUDFORM6"
  VARCHAR2(3),
 "LOWCLOUDFORMCOMP"
  VARCHAR2(1),
 "MIDCLOUDFORMCOMP"
  VARCHAR2(1),
 "HIGHCLOUDFORMCOMP"
  VARCHAR2(1),
 "CLOUDFORM4"
  VARCHAR2(3),
 "CLOUDFORM7"
  VARCHAR2(3),
 "CLOUDFORM8"
  VARCHAR2(3),
 "FLAGCC"
  CHAR(3),
 "IS_CALC"
  CHAR(1) DEFAULT 'F',
 "STFLAG"
  CHAR(1),
 "ISDRAWCONTOUR"
  CHAR(1) DEFAULT 'N',
 "IS_AUDIT"
  CHAR(1) DEFAULT 'F',
 "TEMPBALL"
  VARCHAR2(10),
 "IS_EDIT"
  CHAR(1) DEFAULT 'F',
 "LAST_UPDATE_DATE"
  DATE DEFAULT sysdate,
 "LAST_UPDATE_BY"
  VARCHAR2(20),
 "LAST_UPDATE_IP"
  VARCHAR2(128),
 "IS_CALC_HOUR"
  CHAR(1) DEFAULT 'F',
 "IS_CALC_MINUTE"
  CHAR(1) DEFAULT 'F',
 "IS_HOUR"
  CHAR(1),
 "SNOWPRESS"
  NUMBER(3,1),
 "ROADCONDITION1"
  VARCHAR2(6),
 "ROADCONDITION2"
  VARCHAR2(6),
 "ROADCONDITION3"
  VARCHAR2(6),
 "WATERDEPTH"
  NUMBER(5,1),
 "ICEDEPTH"
  NUMBER(5,1),
 "ICETEMP"
  NUMBER(5,1),
 "SNOWMELTAGENT"
  NUMBER(5,1),
 "LASTUPDATEBY"
  VARCHAR2(64),
 "LASTUPDATEDATE"
  DATE,
 "UPDATECNT"
  NUMBER,
 "SUNSHINE"
  NUMBER(5,1),
 "CONTENT"
  CLOB,
 "FILEPATH"
  VARCHAR2(200)
  
  ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
 
  TABLESPACE "JFIDS"
 LOB ("CONTENT") STORE AS (
 
  TABLESPACE "JFIDS" ENABLE STORAGE IN ROW CHUNK 8192
  PCTVERSION 10
 
  NOCACHE LOGGING
 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT))

 
2、 将需要留下的数据迁移到中间表,使用如下语句:

INSERT INTO
  "TME_AWS_ST_back0507"
 SELECT
*
FROM
"TME_AWS_ST"  
WHERE
OBSTIME >= TO_DATE ( '20200501',
  'yyyy/mm/dd' )

3、 为了安全起见,备份原表所有的触发器、建表语句、分区等信息
4、 使用truncate语句将原表TME_AWS_ST的数据删除并将水位降低

 
truncate table "TME_AWS_ST "



扩展知识


以前总结的truncate,delete,drop的异同点
注意:这里说的delete是指不带where子句的delete语句
相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据
不同点:
1. truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是ddl, 操作立即生效,原数据不放到rollback
segment中,不能回滚. 操作不触发trigger.
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据
游客

返回顶部