alter table 表名 move和alter table 表名 shrink space都可以用来进行段收缩,降低高水位HWM,
成都创新互联专注于通化县企业网站建设,响应式网站开发,购物商城网站建设。通化县网站建设公司,为通化县等地区提供建站服务。全流程按需求定制设计,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务
也都可以用来消除行链接(Row Chaining)和行迁移(Row Migration),估计效果不明显,看你的数据库用途是干什么的(如果是数据仓库肯定是不明显的)。
解决方案
执行
alter table jk_test move
或
alter table jk_test move storage(initial 64k)
或
alter table jk_test deallocate unused
或
alter table jk_test shrink space.
注意:因为alter table jk_test move 是通过消除行迁移,清除空间碎片,删除空闲空间,实现缩小所占的空间,但会导致此表上的索引无效(因为ROWID变了,无法找到),所以执行 move 就需要重建索引。
找到表对应的索引
select index_name,table_name,tablespace_name,index_type,status from dba_indexes where table_owner='SCOTT'
根据status 的值,重建无效的就行了。sql='alter index '||index_name||' rebuild'; 使用存储过程执行,稍微安慰。
还要注意alter table move过程中会产生锁,应该避免在业务高峰期操作!
另外说明:truncate table jk_test 会执行的更快,而且其所占的空间也会释放,应该是truncate 语句执行后是不会进入oracle回收站(recylebin)的缘故。如果drop 一个表加上purge 也不会进回收站(在此里面的数据可以通过flashback找回)。
不管是delete还是truncate 相应数据文件的大小并不会改变,如果想改变数据文件所占空间大小可执行如下语句:
alter database datafile 'filename' resize 8g
重定义数据文件的大小(不能小于该数据文件已用空间的大小)。
另补充一些PURGE知识
Purge操作:
1). Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定表空间的Recycle Bin中指定用户的对象
3). Purge recyclebin: 删除当前用户的Recycle Bin中的对象。
4). Purge dba_recyclebin: 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限
5). Drop table table_name purge: 删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
6). Purge index recycle_bin_object_name: 当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。 因为索引是可以重建的。
二、如果某些表占用了数据文件的最后一些块,则需要先将该表导出或移动到其他的表空间中,然后删除表,再进行收缩。不过如果是移动到其他的表空间,需要重建其索引。
1、
SQL alter table t_obj move tablespace t_tbs1; ---移动表到其它表空间
也可以直接使用exp和imp来进行
2、
SQLalter owner.index_name rebuild; --重建索引
3、删除原来的表空间
很大可能是原来表是压缩过的,再导进去就没有压缩了,要重新压缩下
--找出目前TEST表空间最大的block_id
SELECT MAX(block_id)FROM dba_extentsWHERE tablespace_name = 'TEST';
MAX(BLOCK_ID)
-------------
136
--计算目前最大块的段所占用的空间(该数据库的block大小是8192)
show parameter db_block_size ;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
SELECT 136*8192/1024/1024 "MAX(M)" FROM dual;
MAX(M)
----------
1.0625
--查看表空间物理文件的名称及大小
set line 200
col file_name for a50
select
tablespace_name, file_id, file_name,round(bytes/(1024*1024),0)
"total_space(M)"from dba_data_fileswhere tablespace_name ='TEST' ;
TABLESPACE_NAME FILE_ID FILE_NAME total_space(M)
------------------------------ ---------- -------------------------------------------------- --------------
TEST 6 /u01/oradata/source/test01.dbf 100
4
--resize表空间
SQL ALTER DATABASE DATAFILE '/u01/oradata/source/test01.dbf' RESIZE 1M;
ALTER DATABASE DATAFILE '/u01/oradata/source/test01.dbf' RESIZE 1M*ERROR at line 1:
ORA-03214: File Size specified is smaller than minimum required
SQL ALTER DATABASE DATAFILE '/u01/oradata/source/zfl01.dbf' RESIZE 2M;
Database altered.
给您提供建议如下:
(1)如果表空间的数据没存满,可以考虑执行表空间收缩操作。
(2)如果表空间的数据存满了,可以考虑建多个表空间文件。
(3)从业务的角度考虑,是否可以考虑将部分数据进行剥离,存放在历史库。
(4)从业务角度进行分析,该表空间中最大的几张表中的数据都是必须、有用的吗?是否可以将部分无用数据备份后执行清理操作。
(5)如果是undo表空间,可以执行undo表空间收缩操作。
(6)如果是temp表空间,可以将原表空间文件drop掉后重建表空间文件。
删除数据不能缩小表空间,只是可再利用的多了.
要实际缩小,让操作系统可以利用,需要先把表move tablespace
也可以在原来的tablespace上move一遍,再缩小tablespace就可以了.
例如:
alter table your_table move tablespace yourtablespace;