【问题标题】:Oracle datafile defragmentationOracle 数据文件碎片整理
【发布时间】:2013-05-16 11:18:33
【问题描述】:

在我的系统中,永久数据与一些临时数据(如日志)是分开的。这是通过将日志表(用户定义的程序日志,不要与系统日志混淆)存储在与主表不同的表空间中来完成的。

所以有两个表空间MAINLOG。每个表空间对应一个数据文件。两个数据文件的 maxsize 都设置为 4GB,它们的初始大小是 8MB,并且它们会在接下来的 8MB 时自动扩展。

由于我使用的是 oracle 的 express 版本,所以我需要它们的总和不超过 4GB。

当我需要减小 LOG 数据文件的大小以便为必要的数据腾出一些空间时,有时会发生这种情况。

现在我这样做:

truncate table schema_name.log_table;
alter database datafile '/path/to/the/log/datafile/log1.dbf' resize 128M;

它有效,因为truncate 删除了数据文件中的所有信息。

但是,如果我遇到需要从 MAIN 表空间释放一些 LOG 表空间大小的情况,该怎么办。我在那里截断了几个表(或者我知道数据文件中有很多可用空间,它已分配但未被数据占用,之前用于某些操作),现在需要对 MAIN 表空间的数据文件进行碎片整理以减小其大小。没有碎片整理我得到一个异常:

ORA-03297: file contains used data beyond requested RESIZE value

那么我能否以某种方式对数据文件执行碎片整理操作?

【问题讨论】:

标签: oracle oracle10g


【解决方案1】:

基本上需要考虑三个级别的空间分配。

  1. 表和索引段中的行使用的空间。删除行通常足以为该段中的新数据释放空间,但这不会释放段在数据文件中占用的空间。

  2. 段用完数据文件中的空间。默认情况下,截断表会缩小段,或者如果段中有大量可用空间,您可以移动表和/或重建索引。这也将改变数据文件中段的位置,这可能与 ...

  3. 数据文件在存储上使用的空间。缩小文件是可能的,但文件中段的位置很关键。您只能缩小到最后一段的末尾。如果您有时间和资源,您可以将段移动/重建到不同的表空间,然后缩小数据文件并再次移动/重建它们。

这 (3) 是您面临的问题。完整的移动和重建不是唯一的选择......您可以导出所有内容或尝试仅移动/重建数据文件末尾的段,但这相当复杂。尽量避免。

【讨论】:

  • 这里的关键事实是 XE 中 DB 的最大大小是为数据文件分配的空间(第三点)。这就是为什么截断表或删除其中的行/索引是不可接受的。重新创建一些段 - 我不明白 - 我可以指望在数据文件中的第一个空闲块开始的新段中创建新表的事实吗?我不这么认为..
  • 如果您想避开出口-进口路线,值得一试,这可能最终成为您唯一可行的选择。
  • @ZZa 您还可以使用以下链接中的 maxshrink.sql 脚本来确定可以将每个数据文件缩小到多小。 AskTom link
猜你喜欢
  • 1970-01-01
  • 2014-04-09
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多