Как удалить данные и освободить место на диске в СУБД Oracle 9i
Я хотел бы знать, как обычно можно удалить данные из СУБД Oracle 9i, которая фактически освобождает дисковое пространство. В прошлом сценарии у нас были случаи, когда очистка 1-2 миллионов строк данных не приводила к уменьшению использования дискового пространства.
Сценарий:
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)
Не приводит к изменению использования дискового пространства.
Это также подводит меня к вопросу, нужно ли больше очищать таблицы, чтобы оракул полностью удалил все данные, которые предположительно были удалены при удалении DML
4 ответа
В Oracle удаление строк из таблицы не приведет к автоматическому освобождению дискового пространства. Можно освободить дисковое пространство, но для этого вам необходимо выяснить, как таблицы физически размещаются в файлах данных. Как только файл данных в конце содержит пустые блоки, вы можете изменить размер файла данных до меньшего размера. Только после этой успешной операции вы получаете реальное дисковое пространство. Если у вас есть много пустых блоков в файле данных, но не в конце, может быть проще всего переместить таблицы из табличного пространства, которому принадлежит файл данных, в новое табличное пространство и удалить старое табличное пространство. Это не будет работать для табличного пространства SYSTEM, вам не разрешено перемещать объекты SYS в другое табличное пространство.
Иногда вам повезло, когда вы можете переместить только одну маленькую таблицу, которая блокировала освобождение пространства, потому что она была помещена в конец файла данных. В этом случае простой alter table thesmalltable move;
переместит эту таблицу и освободит место для восстановления в конце файла данных. После этого, alter database datafile '/your/df/name.dbf' resize the_new_size;
освобождает место на диске.
Таблица логически размещается в табличном пространстве. Табличное пространство состоит из минимального 1 файла данных, во многих случаях нескольких файлов данных.
Чтобы завершить другие ответы, очистка журналов diag может помочь вам освободить существенное дисковое пространство (до нескольких ГБ).
В основном вы будете запускать adrci
Утилита командной строки Oracle, затем выполните:
adrci> set homepath diag/rdbms/yourinstance/yourinstance
adrci> purge -age 10080
В приведенном выше примере будут удалены следы диагноза старше 1 недели.
Также проверьте, есть ли у вас локально управляемые табличные пространства (LMT) или управляемые табличными пространствами каталога (DMT). Первый должен лучше обрабатывать фрагментацию (хотя и далек от совершенства). Проверьте: http://www.orafaq.com/node/3
Попробуйте эту команду, чтобы вернуть немного места:
DUMP TRAN <database name> WITH NO_LOG
Я думаю, что лучший способ вернуть свободное место на жестком диске - это удалить с вашего жесткого диска любые другие файлы, которые больше не используются.
Обычным способом удаления данных из базы данных является выполнение команды удаления, однако это не обязательно освобождает дисковое пространство.
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