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