Назад | Перейти на главную страницу

Как удалить данные и освободить место на диске в СУБД 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)

Не приводит к изменению использования дискового пространства.

Это также подводит меня к вопросу, нужно ли очищать больше таблиц, чтобы oracle полностью удалил все данные, которые предположительно были удалены с помощью delete DML

В Oracle удаление строк из таблицы не освобождает автоматически дисковое пространство. Можно освободить дисковое пространство, но для этого вам нужно выяснить, как таблицы физически размещаются в файлах данных. Как только файл данных будет содержать пустые блоки на конце, вы можете изменить размер файла данных до меньшего размера. Только после этой - успешной - операции вам вернется реальное дисковое пространство. Если у вас есть много пустых блоков в файле данных, но их нет в конце, может быть проще всего переместить таблицы из табличного пространства, которому принадлежит файл данных, в новое табличное пространство и отбросить старое табличное пространство. Это не сработает для табличного пространства SYSTEM, вам не разрешено перемещать объекты SYS в другое табличное пространство.

Иногда вам повезло, когда вы можете переместить только одну небольшую таблицу, которая заблокировала освобождение места, потому что она была помещена в конец файла данных. В этом случае простой alter table thesmalltable move; переместит эту таблицу и освободит место в конце файла [файлов] данных. После этого, alter database datafile '/your/df/name.dbf' resize the_new_size; освобождает место на диске.

Таблица логически помещается в табличное пространство. Табличное пространство состоит как минимум из 1 файла данных, во многих случаях из нескольких файлов данных.

Чтобы заполнить другие ответы, очистка журналов диагностики может помочь вам освободить значительное дисковое пространство (до нескольких ГБ).

Проверь это : http://www.databasejournal.com/features/oracle/article.php/3875896/Purging-Oracle-Databases-Alert-Log-with-ADRCI---Usage-and-Warning.htm

По сути, вы запустите 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