【问题标题】:oracle 10G shrink datafilesoracle 10G 收缩数据文件
【发布时间】:2008-12-24 11:35:29
【问题描述】:

如何在 oracle 10G 中压缩数据文件?

【问题讨论】:

    标签: oracle oracle10g


    【解决方案1】:

    警告:我不是 Oracle 系统管理员,除了个人安装。用一大粒盐来接受我所说的一切。

    我假设您创建了具有自动扩展功能的数据文件,并且它们的扩展超出了您认为它们应该包含的内容。 ALTER DATABASE 有一个子句可以调整文件大小,这是 Oracle SQL 参考中的示例:

    ALTER DATABASE
    DATAFILE 'diskb:tbs_f5.dat' RESIZE 10 M;
    

    但是,我真的不认为您想盲目地这样做。IMO 更好的方法是使用 export 命令转储该数据文件中的表,然后重新创建表空间。

    【讨论】:

      【解决方案2】:

      这是一种方法,由 Tom Kyte 提供,用于获取您的数据库的块大小,列出您可以回收多少空间,并构建 alter... 命令以实际执行数据库收缩。希望这会有所帮助,

      http://cglendenningoracle.blogspot.com/2009/08/how-do-i-shrink-datafiles-to-reclaim.html

      克雷格·格伦登宁

      【讨论】:

      【解决方案3】:

      ALTER TABLESPACE....RESIZE 只允许超出 HWM。所以你可能在它下面有许多未使用的 segmnet。在此操作之前,发出:

      ALTER TABLE .. .SHRINK SPACE 在该表空间/数据文件的某些表上,以便重新组织数据文件的内容。

      可能是一项漫长的任务,但您可以使用 SQL 生成命令。

      【讨论】:

        【解决方案4】:

        @Dave关于导出和导入的回答是正确的,是释放空间的最佳选择。 同样在 Oracle 中没有收缩命令,@Dave 是正确的,但是存在 resize 命令,正如 @David 所说“数据文件可以调整到最后使用的块”但是有一件值得一提的事情,数据文件中的空闲块可以这样分配

        0101000001111000000000000000000001110000000000
                                            |---------
        

        在哪里: 0-是空闲块 1-被使用的块

        通过调整数据文件的大小直到最后使用的块,它将变成这样:

        010100000111100000000000000000000111
                                            |---------     
        

        但是数据文件中的其他空闲块呢?它们不适用于其他数据文件或系统本身。

        如果数据文件是这样的:

        1111111111111100000000000000000
        

        然后调整大小会很有用,但在以前的变体中没有。

        无论如何要确定你可以调整数据文件的大小,这里是脚本:

            select 'alter database '||a.name||' datafile '''||b.file_name||'''' ||
        ' resize '||greatest(trunc(bytes_full/.7)
        ,(bytes_total-bytes_free))||chr(10)||
        '--tablespace was '||trunc(bytes_full*100/bytes_total)||
        '% full now '||
        trunc(bytes_full*100/greatest(trunc(bytes_full/.7)
        ,(bytes_total-bytes_free)))||'%'
        from v$database a
        ,dba_data_files b
        ,(Select tablespace_name,sum(bytes) bytes_full
        From dba_extents
        Group by tablespace_name) c
        ,(Select tablespace_name,sum(bytes) bytes_total
        From dba_data_files
        Group by tablespace_name) d
        ,(Select a.tablespace_name,a.file_id,b.bytes bytes_free
        From (select tablespace_name,file_id
        ,max(block_id) max_data_block_id 
        from dba_extents
        group by tablespace_name,file_id) a
        ,dba_free_space b
        where a.tablespace_name = b.tablespace_name
        and a.file_id = b.file_id
        and b.block_id > a.max_data_block_id) e
        Where b.tablespace_name = c.tablespace_name
        And b.tablespace_name = d.tablespace_name
        And bytes_full/bytes_total < .7
        And b.tablespace_name = e.tablespace_name
        And b.file_id = e.file_id
        

        不用担心这个脚本不会从数据文件中删除任何使用过的块。

        【讨论】:

          【解决方案5】:

          对于 Oracle 中的标准数据文件,您无法缩小它们。您必须执行以下操作:

          1. 将段移动到另一个表空间,或导出并删除它们
          2. 删除数据文件
          3. 创建一个新的更小的数据文件
          4. 将段移回第一个表,或从转储文件中导入它们

          对于“大文件”表空间——意味着使用 CREATE BIGFILE TABLESPACE 创建它——您可以使用 ALTER TABLESPACE .. RESIZE ...

          【讨论】:

          • 不正确。数据文件可以缩小到最后使用的块,这可以从 dba_extents 数据字典视图中确定。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-08
          相关资源
          最近更新 更多