【问题标题】:Need to clean users01.dbf in Oracle 12c需要在 Oracle 12c 中清理 users01.dbf
【发布时间】:2020-02-17 13:49:29
【问题描述】:

我在 docker 容器中有 Oracle Database 12c。有一次,表空间中的空间扩大了(users01.dbf 文件的大小变成了 32GB),我为这个表空间创建了一个新文件 - users02.dbf。我分析了占用空间最多的表和索引,并将它们截断。我看到最大的表和索引的大小已经减小,但 users01.dbfusers02.dbf 文件的大小保持不变:

  • users01.dbf32G
  • users02.dbf8.8G

这是截图:

截断命令之前、之后的左侧大小。如何清理或减小 users01.dbfusers02.dbf 文件的大小而不破坏数据库。

【问题讨论】:

标签: database oracle tablespace


【解决方案1】:

我正在使用一个查询来找出可以从数据文件中缩小的实际大小。

我已经使用它将近 4 年了,我不知道我从哪里得到它,但是是的,我从 oracle 的一个优秀博客中得到了那个脚本。

以下脚本将生成一系列命令,这些命令可以在 DB 上执行以缩小数据文件,或者我们可以说从数据文件中回收可用空间(仅当可以回收超过 1 MB 时)到完美大小而无需任何错误。

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 为 ON 的数据文件

希望对你有所帮助。

干杯!!

【讨论】:

    【解决方案2】:

    alter database datafile 'path_to_datafile/users01.dbf' resize 150M;

    对 02 重复相同的操作。确保路径和文件名正确。

    由于您截断了表,它应该完全删除了段,因此文件应该能够缩小。如果你得到 ORA-03297: file contains used data beyond requested RESIZE value 那么这意味着你有 150M 标记的数据,所以你应该尝试更多地增加调整大小限制,直到错误消失。

    与往常一样,您不应该直接在生产环境中进行操作,而是进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2020-10-17
      • 2017-01-26
      • 1970-01-01
      • 2020-07-31
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多