Нужно почистить users01.dbf в Oracle 12c - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть Oracle База данных 12 c в контейнере docker. В какой-то момент пространство в табличном пространстве расширилось (размер файла users01.dbf стал 32 ГБ), и я создал новый файл для этого табличного пространства - users02.dbf. Я проанализировал таблицы и индексы, которые занимают больше всего места, и сделал их усеченными. Я вижу, что размер самых больших таблиц и индексов уменьшился, но файлы users01.dbf и users02.dbf остались прежнего размера:

  • users01.dbf 32G
  • users02.dbf 8,8G

Вот скриншот:

screenshot

Размер слева до, сразу после команды усечения. Как можно очистить или уменьшить размер файлов users01.dbf и users02.dbf и не сломать базу данных.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Я использую один запрос, чтобы узнать фактический размер, который можно сжать из файла данных.

Я использую его почти 4 года, и я не знаю, откуда я его получил, но Да, я получил этот скрипт из одного из хороших блогов oracle.

. Следующий скрипт сгенерирует серию команд, которые могут быть выполнены в БД для сокращения файла данных, или мы можем сказать, освободить свободный пространство от файла данных (только если можно восстановить более 1 МБ) до идеального размера без каких-либо ошибок.

set linesize 1000 pagesize 0 feedback off trimspool on
with
 hwm as (
  -- get highest block id from each datafiles ( from x$ktfbue as we don't need all joins from dba_extents )
  select /*+ materialize */ ktfbuesegtsn ts#,ktfbuefno relative_fno,max(ktfbuebno+ktfbueblks-1) hwm_blocks
  from sys.x$ktfbue group by ktfbuefno,ktfbuesegtsn
 ),
 hwmts as (
  -- join ts# with tablespace_name
  select name tablespace_name,relative_fno,hwm_blocks
  from hwm join v$tablespace using(ts#)
 ),
 hwmdf as (
  -- join with datafiles, put 5M minimum for datafiles with no extents
  select file_name,nvl(hwm_blocks*(bytes/blocks),5*1024*1024) hwm_bytes,bytes,autoextensible,maxbytes
  from hwmts right join dba_data_files using(tablespace_name,relative_fno)
 )
select
 case when autoextensible='YES' and maxbytes>=bytes
 then -- we generate resize statements only if autoextensible can grow back to current size
  '/* reclaim '||to_char(ceil((bytes-hwm_bytes)/1024/1024),999999)
   ||'M from '||to_char(ceil(bytes/1024/1024),999999)||'M */ '
   ||'alter database datafile '''||file_name||''' resize '||ceil(hwm_bytes/1024/1024)||'M;'
 else -- generate only a comment when autoextensible is off
  '/* reclaim '||to_char(ceil((bytes-hwm_bytes)/1024/1024),999999)
   ||'M from '||to_char(ceil(bytes/1024/1024),999999)
   ||'M after setting autoextensible maxsize higher than current size for file '
   || file_name||' */'
 end SQL
from hwmdf
where
 bytes-hwm_bytes>1024*1024 -- resize only if at least 1MB can be reclaimed
order by bytes-hwm_bytes desc
/

Он будет генерировать команды примерно так:

/* reclaim    1934M from    2048M */ alter database datafile 'C:\APP\TEJASH\VIRTUAL\ORADATA\ORCL\DATAFILE\TEJASH_DATAFILE_01.DBF' resize 115M;
/* reclaim     158M from     200M */ alter database datafile 'C:\APP\TEJASH\VIRTUAL\ORADATA\ORCL\DATAFILE\UNDO_DF_02.DBF' resize 43M;
/* reclaim      59M from    1060M */ alter database datafile 'C:\APP\TEJASH\VIRTUAL\ORADATA\ORCL\DATAFILE\O1_MF_SYSAUX_G9K5LYTT_.DBF' resize 1002M;
/* reclaim       3M from     840M */ alter database datafile 'C:\APP\TEJASH\VIRTUAL\ORADATA\ORCL\DATAFILE\O1_MF_SYSTEM_G9K5KK2J_.DBF' resize 838M;

Вы можете напрямую выполнить их все, и вам не нужно беспокоиться о том, чтобы что-то вычислить самостоятельно.

Обратите внимание, что этот скрипт будет работать с файлами данных, для которых autoextensible ВКЛ.

Я надеюсь, что это поможет вам.

Ура !!

0 голосов
/ 17 февраля 2020

изменить файл данных базы данных 'path_to_datafile / users01.dbf' изменить размер 150M;

Повторите то же самое для 02. Убедитесь, что путь и имена файлов указаны правильно.

Поскольку вы усекали таблицы, они должны были полностью удалить сегменты, поэтому файл должен иметь возможность сжиматься. Если вы получаете ORA-03297: файл содержит использованные данные сверх запрошенного значения RESIZE, то это означает, что у вас есть данные на отметке 150M, поэтому вы должны попытаться увеличить предел изменения размера до исчезновения ошибки.

Как всегда, вы не должны делать что-то непосредственно в Production, а проверять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...