0021-Oracle释放表及表空间大小
- 格式:doc
- 大小:27.50 KB
- 文档页数:2
oracle修改表空间大小的方法一、引言Oracle数据库是广泛应用于企业级应用系统的数据库管理系统,表空间是Oracle数据库中最基本的数据存储单位。
为了满足业务需求或应对数据增长,常常需要对表空间的大小进行调整。
本篇文章将详细介绍如何修改Oracle数据库中的表空间大小。
二、准备工作1. 确认具有足够的权限:修改表空间大小需要具有足够的权限,通常需要具有DBA(数据库管理员)角色或与之相关的权限。
2. 了解表空间状态:在修改表空间大小之前,需要确保表空间处于正确的状态,例如是否打开了,是否是只读状态等。
3. 备份数据:修改表空间大小可能会对数据库中的数据产生影响,因此在执行此操作之前,强烈建议进行数据备份。
1. 使用ALTER TABLESPACE命令:使用ALTER TABLESPACE命令可以动态地增加或减少表空间中的存储空间。
以下是基本语法:```sqlALTER TABLESPACE tablespace_name ADD SPACE[ ( space_number ) ] [ DATAFILE 'file_path' [ SIZE{ file_size | next_autoextend } ] ] ;```* `tablespace_name`:要修改的表空间名称。
* `space_number`:要添加的空间编号(可选)。
* `file_path`:新数据文件的路径和文件名。
* `file_size`:新数据文件的大小(可选)。
* `next_autoextend`:自动扩展的最小大小(可选)。
2. 使用ALTER TABLE命令:通过修改表的数据块大小来间接调整表空间的大小。
这种方法适用于调整单个表的大小。
以下是基本语法:```sqlALTER TABLE table_name MODIFY (data_block_size =new_size);```* `table_name`:要修改的表的名称。
4.扩展表空间,表空间扩展有两种方法:增加数据文件;调整当前数据文件的大小或扩展的大小。
(1)增加数据文件ALTER TABLESPACE TESTTBSADD DATAFILE 'D:/ora/datafile/users.ora' SIZE 500MAUTOEXTEND ONNEXT 50MMAXSIZE 2000M;增加了一个500M的数据文件,并且可以自动扩展到2G,每次扩展50M。
(2)增加当前数据文件的大小ALTER DATABASEDATAFILE 'D:/ora/datafile/users.ora'RESIZE 50000M;或者使用file_idALTER DATABASEDATAFILE 10RESIZE 50000M;(3)在使用过程中,如果想改变某个数据文件的最大大小,可以ALTER DATABASEDATAFILE 'D:/ora/datafile/users.ora'AUTOEXTEND ONMAXSIZE 10240M;---------------------------------------------------------------------------------- Oracle中压缩数据节省空间和提高速度添加时间:2007-4-22使用表压缩来节省空间并提高查询性能很多决策支持系统通常都涉及到存储于几个特大表中的大量数据。
随着这些系统的发展,对磁盘空间的需求也在快速增长。
在当今的环境下,存储着数百TB(太字节)的数据仓库已经变得越来越普遍。
为了帮助处理磁盘容量问题,在Oracle9i第2版中引入了表压缩特性,它可以极大地减少数据库表所需要的磁盘空间数量,并在某些情况下提高查询性能。
在本文中,我将向你说明表压缩是如何工作的,以及在构建和管理数据库时如何配置表空间。
我还将基于一些示例测试结构讨论一些性能问题,以帮助你了解使用表压缩预计能获得多大好处。
Oracle数据库表空间扩展
现在企业数据量越来越大,在数据库选择上大多选择了Oracle数据库。
在使用的过程中,表空间容量占满或即将被完全利用时,对应的应用程序将无法使用或反应速度异常的慢.下面是店铺收集整理的Oracle数据库表空间扩展,希望对大家有帮助~~
Oracle数据库表空间扩展
工具/原料
局域网电脑
数据库管理工具Toad
Oracle数据库访问权限
方法/步骤
打开Toad For Oracle数据库工具;
输入数据库管理员帐号密码连接数据库<因为管理员有权限看见不同用户的表及表空间,这样比较方便>。
点击 Database Browser 图标
展开数据库,找到T ablespaces,点击T ablespaces,在右边就会看见当前数据库的所有表空间。
选择需要扩展的表空间文件,点击 Alter Datafile 按钮
6在弹出对话框中修改datafile size 大小,建议按最初建表空间的倍数去递增,如初始值是1G,第一次建议扩展为2G,依次类推。
最后别忘记了执行操作(Execute)哦。
oracle 删除数据后释放数据文件大小的方法(原创版3篇)篇1 目录1.Oracle 简介2.数据删除与数据文件大小的关系3.删除数据后释放数据文件大小的方法4.结论篇1正文1.Oracle 简介Oracle 是一款广泛应用于企业级数据管理的关系型数据库管理系统。
其出色的性能、高度可扩展性和稳定性赢得了众多用户的信赖。
在 Oracle 数据库中,数据以表空间为单位进行存储和管理,表空间又分为数据文件和日志文件。
数据文件用于存储数据,而日志文件用于记录数据库的操作。
2.数据删除与数据文件大小的关系在 Oracle 数据库中,当我们删除数据时,被删除的数据并不会立即从数据文件中移除,而是被移动到回收站(Recycle Bin)中。
只有在回收站中的数据被彻底删除后,数据文件的大小才会减小。
因此,在删除数据后,数据文件大小并不会立即释放,需要通过特定的操作才能实现。
3.删除数据后释放数据文件大小的方法(1)使用 DELETE 语句要使用 DELETE 语句释放数据文件大小,需要先将回收站中的数据彻底删除。
可以使用以下语句:```DELETE FROM RECYCLEBIN;```执行该语句后,回收站中的数据将被永久删除,数据文件大小得到释放。
(2)使用 DBMS_RECYCLEBIN.DELETE_EXPIRED_RECORDS 过程该过程用于删除回收站中过期的记录,可以自动执行,无需手动干预。
过期记录的定义是:在回收站中存放超过 RECYCLEBIN_TIME 限制的时间。
可以通过以下语句创建一个名为“cleanup_recyclebin”的作业:```BEGINDBMS_RECYCLEBIN.DELETE_EXPIRED_RECORDS(TO_CHAR(SYSTIMESTAMP, "YYYYMMDDHH24MISS"));END;```其中,"YYYYMMDDHH24MISS"表示过期时间的截止点。
oracle删除数据后释放数据文件大小的方法释放Oracle数据文件的空间是一种优化数据库存储和性能的常见操作。
当我们从表中删除数据后,数据文件的大小不会立即减小,因为Oracle会将空间标记为可重用,以备将来存储新的数据。
这种方法称为空间回收。
然而,我们可以采取一些措施来主动减小数据文件的大小并回收空间。
以下是在Oracle数据库中删除数据后释放数据文件大小的几种方法:1.压缩表:使用`ALTERTABLE...MOVE`语句重新组织数据存储,以压缩表的空间。
这会导致数据文件的大小减小,从而释放了被删除数据占用的空间。
例如:```ALTER TABLE table_name MOVE;```2.重新建立索引:删除大量数据后,可以使用`ALTER INDEX ... REBUILD`语句或Oracle提供的`DBMS_REBUILD`包重新建立索引。
这将重新组织索引,从而减小索引所占用的空间。
例如:```ALTER INDEX index_name REBUILD ONLINE;```3.分区表重新组织:如果使用分区表,可以使用`ALTERTABLE...MOVEPARTITION`语句重新组织特定分区的数据存储,从而减小数据文件的大小并释放空间。
例如:```ALTER TABLE table_name MOVE PARTITION partition_name;```4.重新创建表:如果删除了大量数据,并且对表不再有其他操作,可以考虑备份并重新创建整个表。
这将释放所有相关数据文件的空间。
首先,通过`CREATETABLE...ASSELECT`语句创建一个新的表。
然后,将新表重命名为原始表名,并丢弃原始表。
例如:```CREATE TABLE new_table_name AS SELECT * FROM table_name;ALTER TABLE table_name RENAME TO old_table_name;ALTER TABLE new_table_name RENAME TO table_name;DROP TABLE old_table_name;```5.关闭和重新打开数据库:关闭数据库并重新打开可以释放未使用的空间,并使数据文件的大小减小。
Oracle中查询表的⼤⼩、表的占⽤情况和表空间的⼤⼩有两种含义的表⼤⼩。
⼀种是分配给⼀个表的物理空间数量,⽽不管空间是否被使⽤。
可以这样查询获得字节数:select segment_name, bytesfrom user_segmentswhere segment_type = 'TABLE';或者Select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name另⼀种表实际使⽤的空间。
这样查询:analyze table emp compute statistics;select num_rows * avg_row_lenfrom user_tableswhere table_name = 'EMP';查看每个表空间的⼤⼩Select Tablespace_Name,Sum(bytes)/1024/1024 From Dba_Segments Group By Tablespace_Name1.查看剩余表空间⼤⼩SELECT tablespace_name 表空间,sum(blocks*8192/1000000) 剩余空间M FROM dba_free_space GROUP BY tablespace_name;2.检查系统中所有表空间总体空间select ,sum(a.bytes/1000000)总空间 from v$datafile a,v$tablespace b where a.ts#=b.ts# group by ; 1、查看Oracle数据库中表空间信息的⼯具⽅法: 使⽤oracle enterprise manager console⼯具,这是oracle的客户端⼯具,当安装oracle服务器或客户端时会⾃动安装此⼯具,在windows操作系统上完成oracle安装后,通过下⾯的⽅法登录该⼯具:开始菜单——程序——Oracle-OraHome92——Enterprise Manager Console(单击)——oracle enterprise manager console登录——选择‘独⽴启动’单选框——‘确定’ —— ‘oracle enterprise manager console,独⽴’ ——选择要登录的‘实例名’ ——弹出‘数据库连接信息’ ——输⼊’⽤户名/⼝令’ (⼀般使⽤sys⽤户),’连接⾝份’选择选择SYSDBA——‘确定’,这时已经成功登录该⼯具,选择‘存储’ ——表空间,会看到如下的界⾯,该界⾯显⽰了表空间名称,表空间类型,区管理类型,以”兆”为单位的表空间⼤⼩,已使⽤的表空间⼤⼩及表空间利⽤率。
Oracle增加表空间大小的方法作者:雨竹清风改变表空间大小的方法总体有3种:1.改变数据文件的大小。
改变数据文件大小的又分为创建表空间时和创建表空间后。
♣创建表空间时使用autoextend on自动的改变数据文件的大小。
♣创建表空间后需要使用如下的命令:Alter database datafile‘数据文件名(包含路径)’autoextend on next n M;//n是代表数字几,可变,根据自己的需要来即可,如:可以填写1,2等等,以下红色的n意义相同。
2.使用增加数据文件的方法来扩大表空间的大小,这就需要使用如下命令:Alter tablespace表空间名Add datafile‘数据文件名(包含路径)’Size n M;3.使用手工重置的方法来改变表空间的大小。
命令如下:Alter database datafile‘数据文件名(包含路径)’resize n M;示例如下:方法1(创建表空间后):1)查看dba_data_files结构SQL>desc dba_data_files;名称是否为空?类型-----------------------------------------------------------------------------FILE_NAME VARCHAR2(513) FILE_ID NUMBER TABLESPACE_NAME VARCHAR2(30) BYTES NUMBERBLOCKS NUMBERSTATUS VARCHAR2(9) RELATIVE_FNO NUMBER AUTOEXTENSIBLE VARCHAR2(3) MAXBYTES NUMBER MAXBLOCKS NUMBER INCREMENT_BY NUMBERUSER_BYTES NUMBERUSER_BLOCKS NUMBERONLINE_STATUS VARCHAR2(7)2)查询表空间XUANXUAN是否是自动扩展。
truncate table 后,有可能表空间仍没有释放,可以使用如下语句:alter table 表名称deallocateunused keep 0;注意如果不加keep 0的话,表空间是不会释放的我在oracle 中创建建一个用户usera , 导入备份的数据,表空间占了50g磁盘空间,使用完后不想用这些数据了,就想删除了,再导入其他数据库文件当我删除这个用户时,表空间还是占用磁盘50g,没有释放请问如何操作可以彻底删除这些数据并释放磁盘空间(不想直接在磁盘删除表空间),操作说明要详细到可以直接用,(在网上找了些不会用,或用不上)一、drop表执行drop table xx 语句drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉这样,回收站里的表信息就可以被恢复,或彻底清除通过查询回收站user_recyclebin获取被删除的表信息,然后使用语句flashback tableto before drop [rename to ];将回收站里的表恢复为原名称或指定新名称,表中数据不会丢失若要彻底删除表,则使用语句:drop tablepurge;清除回收站里的信息清除指定表:purge table ;清除当前用户的回收站:purge recyclebin;清除所有用户的回收站:purge dba_recyclebin;不放入回收站,直接删除则是:drop table xx purge;举例如下:sql> select * from test1;a b c-- -- ----------11 511 102 rows selectedsql> create table test2 as select * from test1;table createdsql> select * from test2;a b c-- -- ----------11 511 102 rows selectedsql> drop table test2;table droppedsql> select object_name, original_name, operation, type from user_recyclebin;object_name original_name operation type------------------------------ -------------------------------- --------- -------------------------bin$vqwemdg4r9mk9fyjndyzvg==$0 test2 drop tablesql> flashback table test2 to before drop rename to test3;--【to test3】将表重命名donesql> select * from test3;a b c-- -- ----------11 511 102 rows selectedsql> select * from test2ora-00942: 表或视图不存在--彻底删除表sql> drop table test3 purge;table dropped二、清除表中的数据truncate操作同没有where条件的delete操作十分相似,只是把表里的信息全部删除,但是表依然存在例如:truncate tablexxtruncate不支持回滚,并且不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除例如:alter table f_minute_td_net_fho_b7 deallocateunused keep 0;或者:truncate table (schema)table_name drop(reuse) storage才能释放表空间例如: truncate tabletest1 drop storage;三、查询分区表存在哪些分区:查询分区表的情况,可以在user_tab_partitions中查询例如:select 'alter table '||t.table_name ||' truncatepartition ' || t.partition_name from user_tab_partitions t where t.table_name like 'f_%'清除指定某个分区表的分区数据:altertable表名称truncatepartition分区名称;四、清除分区表占用的空间:alter table 表名称droppartition 分区名称;例如:alter table f_hour_td_net_mpvoicedroppartition p_09121913;五、查询表空间信息可以利用如下语句查询各表在存储空间的使用分情况:selecttablespace_name,to_char(sum(bytes)/(1024*1024),'999g999d999')cnt_mbfromdba_extentsw hereowner='。
测试的时候向数据库中插入了大量的数据,测试完成后删除了测试用户以及其全部数据,但是数据文件却没有缩小。
经查阅资料之后发现这是Oracle “高水位”所致,那么怎么把这些数据文件的大小降下来呢?解决办法如下:概念:表空间的相关知识请见这里,详细的介绍了Oracle 数据库的存储结构。
高水位:High Water Mark (HWM),是段(Segment)的一个指标,界定了段(Segment)曾经配置过的block 水位。
据说,随着数据的insert,所使用段(Segment)的数据块(data block)也不断增加,这时候高水位(HWM)也随着上升。
当数据被删除后(无论是delete 还是truncate table)虽然被占用的数据块(data block)已经相应减少,但是高水位(HWM)并不会随之下降。
当高水位(HWM)下存在大量的空白数据块(data block)时,如果发生全表扫描(Full Table Scan, FTS)就会造成很多额外的IO。
因为全表扫描(FTS)的时候读取段(Segment)中的数据块(data block)会一直读取到高水位(HWM)才结束。
高水位(HWM)就是段(Segment)中数据块(data block)有没有使用的分界线,所以全表扫描(FTS)所花费的时间不但不会因为数据的删除而减少,反而会增加。
(关于此段查询效率的内容有待验证,笔者未亲自验证。
不过可以确定的是高水位确实不会随着数据的删除而下降。
)降低高水位的正确做法是先降低HWM,再确定实际占有大小,再resize数据文件。
数据文件比较多,我们用其中一个较大的文件做为Demo,其它数据文件如法炮制即可。
我选择的文件是:D:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF 1.4GB 左右。
1.登录sqlplus:语法:sqlplus username/password@hostname:port/sid例:sqlplus system/orcl@localhost:1521/orcl2.查询这个数据文件的编号:SQL> select file#, name from v$datafile;FILE# NAME------------------------------------------------------------------------------------------1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF可以看到,我们要操作的数据文件的编号是4。
Oracle释放表及表空间大小
1.查看一个表所占的空间大小:
SELECT bytes/1024/1024 ||'MB' TABLE_SIZE ,u.* FROM USER_SEGMENTS U WHERE U.SEGMENT_NAME='JK_TEST';
2.查看一个表空间所占的实际大小:
SELECT SUM(BYTES) / 1024 / 1024 ||'MB' FROM USER_SEGMENTS U WHERE TABLESPACE_NAME = 'DATA01';
3.查看一个表空间对应的数据文件:
SELECT * FROM DBA_DATA_FILES D WHERE D.TABLESPACE_NAME = 'DATA01';
4.查看表空间的使用情况:
SELECT A.TABLESPACE_NAME,
FILENUM,
TOTAL "TOTAL (MB)",
F.FREE "FREE (MB)",
TO_CHAR(ROUND(FREE * 100 / TOTAL, 2), '990.00') "FREE%",
TO_CHAR(ROUND((TOTAL - FREE) * 100 / TOTAL, 2), '990.00') "USED%",
ROUND(MAXSIZES, 2) "MAX (MB)"
FROM (SELECT TABLESPACE_NAME,
COUNT(FILE_ID) FILENUM,
SUM(BYTES / (1024 * 1024)) TOTAL,
SUM(MAXBYTES) / 1024 / 1024 MAXSIZES
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) A,
(SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / (1024 * 1024))) FREE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE A.TABLESPACE_NAME = F.TABLESPACE_NAME
5.查看数据文件的实际使用情况:
SELECT CEIL(MAX_BLOCK * BLOCK_SIZE / 1024)
FROM (SELECT MAX(BLOCK_ID) MAX_BLOCK
FROM DBA_EXTENTS
WHERE FILE_ID IN (SELECT FILE_ID
FROM DBA_DATA_FILES D
WHERE D.TABLESPACE_NAME = 'USERS')) M,
(SELECT VALUE / 1024 BLOCK_SIZE
FROM V$PARAMETER
WHERE NAME = 'db_block_size') B
一、创建一个有十万条记录的测试表jk_test ,查看其所占空间大小3873M
delete jk_test。
再次查看大小不会变,此时执行select * from jk_test会发现速度超极慢,查询结果却是空,查看其COST,发现是10万多。
很难理解吧,其实是其所占空间没有释放的缘故。
执行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; ---移动表到其它表空间。