我想知道通常删除 Oracle 9i DBMS 中的数据会释放多少磁盘空间。过去,我们遇到过清除 100-200 万行数据不会减少磁盘空间使用量的情况。
设想:
sqlplus > delete from audit_log where date_created between today and the day before;
sqlplus > 2 million records deleted.
bash$: du -sh (after issuing the delete above)
磁盘空间使用情况没有变化。
这也让我想到了一个问题,是否需要刷新更多表以便 Oracle 完全删除所有由删除 DML 删除的数据
答案1
在 Oracle 中,从表中删除行不会自动释放任何磁盘空间。可以释放磁盘空间,但要做到这一点,您必须找出表在数据文件中的物理位置。一旦数据文件末尾有空块,您就可以将数据文件的大小调整为较小的大小。只有在此操作成功后,您才能获得真正的磁盘空间。如果数据文件中有很多空块,但末尾没有,最简单的方法可能是将表从数据文件所属的表空间移动到新表空间并删除旧表空间。这不适用于 SYSTEM 表空间,您不能将 SYS 对象移动到其他表空间。
有时您很幸运,因为您只能移动一个小表,而这个表恰好因为位于数据文件的末尾而阻止释放空间。在这种情况下,一个简单的方法alter table thesmalltable move;
将重新定位该表并在数据文件的末尾腾出可回收的空间。之后,alter database datafile '/your/df/name.dbf' resize the_new_size;
释放磁盘空间。
逻辑上,表位于表空间中。表空间至少包含 1 个数据文件,多数情况下包含多个数据文件。
答案2
为了补充其他答案,清除诊断日志可以帮助您释放一些重要的磁盘空间(最多几 GB)。
基本上,你将运行adrci
Oracle 命令行实用程序,然后执行:
adrci> set homepath diag/rdbms/yourinstance/yourinstance
adrci> purge -age 10080
上面的例子将删除超过一周的诊断痕迹。
另外,检查您是否有本地管理的表空间(LMT)或目录管理表空间(DMT)。前者应该能更好地处理碎片(尽管远非完美)。检查:http://www.orafaq.com/node/3
答案3
尝试以下命令来恢复一些空间:
DUMP TRAN <database name> WITH NO_LOG
我认为恢复硬盘空间的最佳方法是从硬盘中删除任何其他不再使用的文件。
从数据库中删除数据的通常方法是执行删除命令,但这不一定会释放磁盘空间。
答案4
EPADMRT > @resizea
CURRENT_MEG SAVINGS ID TABLESPACE_NAME RESIZE_COMMAND
----------- ---------- ----- --------------- ---------------------------------------------------------------------------------------
30000 -1 3 UNDO_TS alter database datafile '/var/oradata03/PADMRT/PADMRT_UNDO_01.dbf' resize 30001m;
30000 -1 19 UNDO_TS alter database datafile '/var/oradata04/PADMRT/PADMRT_UNDO_02.dbf' resize 30001m;
20000 -1 11 OPLA_DATA alter database datafile '/var/oradata01/PADMRT/OPLA_DATA01.dbf' resize 20001m;
15360 -1 8 AGILEODM_INDX alter database datafile '/var/oradata01/PADMRT/AGILEODM_INDX_DATA02.dbf' resize 15361m;
20480 -1 13 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA04.dbf' resize 20481m;
5120 -1 7 AGILEODM_INDX alter database datafile '/var/oradata01/PADMRT/AGILEODM_INDX_DATA01.dbf' resize 5121m;
20480 -1 14 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA05.dbf' resize 20481m;
32767.1875 -.8125 6 AGILEODM alter database datafile '/var/oradata01/PADMRT/AGILEODM_DATA01.dbf' resize 32768m;
13236 0 5 AGILEODI alter database datafile '/var/oradata01/PADMRT/AGILEODI_DATA01.dbf' resize 13236m;
22784 6 9 AGILEODI alter database datafile '/var/oradata02/PADMRT/AGILEODI_DATA02.dbf' resize 22778m;
32767 30 10 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA02.dbf' resize 32737m;
10240 42 20 AGILEODI alter database datafile '/var/oradata01/PADMRT/AGILEODI_DATA03.dbf' resize 10198m;
3000 51 16 VQA_DATA alter database datafile '/var/oradata03/PADMRT/VQA_DATA02.dbf' resize 2949m;
3000 72 15 VQA_DATA alter database datafile '/var/oradata01/PADMRT/VQA_DATA01.dbf' resize 2928m;
3000 79 18 VQA_DATA alter database datafile '/var/oradata04/PADMRT/VQA_DATA04.dbf' resize 2921m;
1335 151 4 USERS alter database datafile '/var/oradata01/PADMRT/users01.dbf' resize 1184m;
10240 202 21 AGILEODI alter database datafile '/var/oradata01/PADMRT/AGILEODI_DATA04.dbf' resize 10038m;
6144 938 2 SYSAUX alter database datafile '/var/oradata02/PADMRT/PLMDM_SYSAUX_DATA1_01.dbf' resize 5206m;
4096 1058 1 SYSTEM alter database datafile '/var/oradata02/PADMRT/PLMDM_SYS_DATA1_01.dbf' resize 3038m;
32767 1391 22 OPLA_DATA alter database datafile '/var/oradata01/PADMRT/OPLA_DATA02.dbf' resize 31376m;
10000 7053 17 VQA_DATA alter database datafile '/var/oradata03/PADMRT/VQA_DATA03.dbf' resize 2947m;
32767 7492 12 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA03.dbf' resize 25275m;
32767 8749 23 AGILEODM alter database datafile '/var/oradata03/PADMRT/AGILEODM_DATA06.dbf' resize 24018m;
完整的resizea.sql如下:
set termout off drop table alan99; set pages 50 set wrap off col resize_command for a180 col id for 9999 create table alan99 as select max(block_id+blocks) block_id,file_id from dba_extents group by file_id; column tablespace_name format a15 column pct format 999.99 set wrap off set lines 320 set trunc off column file_id format 999 set termout on select b.bytes/1024/1024 CURRENT_meg,b.bytes/1024/1024-trunc(c.block_id*8192/1024/1024+1) savings, b.file_id id,b.tablespace_Name,'alter database datafile '''||b.file_name||''' resize ' ||trunc(c.block_id*8192/1024/1024+1)||'m;' resize_command from dba_data_files b, alan99 c where b.file_id=c.file_id order by 2; set termout off drop table alan99; set termout on