AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 192625
Accepted
r0tt
r0tt
Asked: 2017-12-08 06:08:46 +0800 CST2017-12-08 06:08:46 +0800 CST 2017-12-08 06:08:46 +0800 CST

Oracle 收缩/回收空闲表空间空间

  • 772

我有一个大小为 90GB 的 Oracle 12c 表空间。近 40GB 是免费的。

TB1 54 %    90880   41383   49497   46  98304   50 %    ONLINE  PERMANENT

表空间有 3 个数据文件。

E:\ORACLE\ORADATA\xx\TB1.DBF    33554416    True    100 
F:\ORACLE\ORADATA\xx\TB1_2.DBF  33554416    True    100 
G:\ORACLE\ORADATA\xx\TB1_3.DBF  25344000    True    100

如何缩小表空间以回收可用的 40GB(磁盘上的数据文件)?我不能有一个停机时间。

oracle oracle-12c
  • 6 6 个回答
  • 74767 Views

6 个回答

  • Voted
  1. Best Answer
    Mark Stewart
    2017-12-09T10:05:23+08:002017-12-09T10:05:23+08:00

    我同意 EdStevens 的评论,但这里有一些其他的想法:

    AskTom 网站有一个脚本,该 脚本将准确列出您可以缩小现有数据文件的程度。

    如果这不能节省太多,您可以在该表空间上找到最大的索引并重建它们;这是一个临时解决方案,索引最终会再次变大,但如果预算现在不允许更多磁盘空间,请尝试以下查询:

    select segment_name, sum(bytes)/1024/1024 as mb 
    from dba_segments 
    where tablespace_name='TB1' and segment_type like 'INDEX%'
    group by segment_name
    order by mb;
    

    那么如果你发现一个名为 ind_big_stuff巨大的索引,那么

    alter index ind_big_stuff rebuild online;
    

    此外,如果您的应用程序是商业应用程序,则可能有多个零行表。或者如果你有分区表,你可能有一些零行的分区。您可以删除分配给他们的空间

    exec dbms_space_admin.drop_empty_segments(schema_name=>'HR');
    

    您可以将segment creation deferredalter table 语句中的子句用于分区表或您知道不会有任何行的表。

    • 9
  2. r0tt
    2017-12-12T07:34:22+08:002017-12-12T07:34:22+08:00

    我认为有五种方法可以处理这个预言机维护问题:

    • Online reorg - Oracle 在线表重组包 (dbms_redefinition) 用于在表接受更新时对其进行重组。它保留索引和约束定义。(仅限企业版)。没有停机时间。
    • Alter table shrink space - 使用 alter table shrink space compact 命令将重新打包行,向下移动 HWM,并释放未使用的扩展区。收缩只会压缩数据。它不能保证块会放在数据文件的前面,因此数据文件的末尾可能会有块,这意味着数据文件不能被调整为更小。它保留索引和约束定义。没有停机时间。
    • 数据泵 (expdp, impdp) – 传输数据和重组表的离线方法。它保留索引和约束定义。需要停机。
    • Alter table move - alter table move 命令将行向下移动到未使用的空间并调整 HWM 但不调整段范围,并且表大小保持不变。alter table move 语法还保留索引和约束定义。需要调整数据文件大小。需要停机。
    • Create table As Select (CTAS) - 这会将表行复制到一个干净的区域,降低高水位线,密集地打包行(由 PCTFREE 指示)并释放可用空间。需要调整数据文件大小。需要停机。
    • 4
  3. David Balažic
    2018-06-02T07:31:21+08:002018-06-02T07:31:21+08:00

    我搜索了这个问题的答案,终于找到了:

    • (可选)从表空间中删除未使用的(删除的)表:PURGE TABLESPACE table_space_name;
    • 清理表空间:ALTER TABLESPACE table_space_name COALESCE;
    • 最后,调整数据文件的大小:ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/file1.dbf' RESIZE 100M;

    PS:不确定停机时间,请有人检查。

    PPS:对于 TEMP 表空间,请使用:

    • ALTER TABLESPACE TEMP SHRINK SPACE ;(可选添加KEEP 512M或类似)
    • 调整数据/临时文件的大小:ALTER DATABASE TEMPFILE '/u02/oracle/rbdb1/temp01.dbf' RESIZE 512M;
    • 2
  4. r0tt
    2021-03-02T07:12:37+08:002021-03-02T07:12:37+08:00

    非常有效的是将所有内容在线移动到另一个新表空间:

    ## Lobs
    select 'ALTER TABLE '||s.owner||'.'||l.table_name||' MOVE LOB('||l.column_name||') STORE AS (TABLESPACE USERNAME) online;' 
      from dba_segments s, dba_lobs l
     where s.segment_name = l.segment_name
       and s.tablespace_name = 'USERNAME'
       and segment_type='LOBSEGMENT'
       and partition_name is null;
    
    ## Tables move
    select 'ALTER TABLE '||owner||'.'||table_name||' move tablespace '||'USERNAME online;' from dba_tables where tablespace_name='USERS'and Owner='USERNAME';
    
    
    ## Move / rebuild indexes 
    select 'ALTER INDEX '||owner||'.'||index_name||' REBUILD TABLESPACE '||'USERNAME_INDEX parallel 8 online;' 
    from dba_indexes where tablespace_name='USERS';
    
    
    ## Lob Index move 
    select 'alter table '||owner||'.'||table_name||' move lob ('||column_name||') store as '||SEGMENT_NAME||' (tablespace USERNAME_INDEX);'from dba_lobs where OWNER='USERNAME' and tablespace_name='USERS';
    
    ##
    Check Lob indexes
    select index_name,index_type, table_name,table_type, tablespace_name from dba_indexes where tablespace_name='USERNAME' order by 3;
    select index_name,index_type, table_name,table_type, tablespace_name from dba_indexes where owner='USERNAME' and index_type='LOB' and tablespace_name='USERS' order by 3;
    
    • 1
  5. Santosh Tiwary
    2019-08-19T00:17:46+08:002019-08-19T00:17:46+08:00

    运行以下脚本,它将从相应表空间的数据文件中释放未使用的空间。

    column value new_val blksize
    select value from v$parameter where name = 'db_block_size'
    /
    
    set pages 0
    set lines 300
    column cmd format a300 word_wrapped
    
    select 'alter database datafile '''||file_name||''' resize ' ||
           ceil( (nvl(hwm,1)*&&blksize)/1024/1024 )  || 'm;' cmd
    from dba_data_files a, 
         ( select file_id, max(block_id+blocks-1) hwm
             from dba_extents
            group by file_id ) b
    where a.file_id = b.file_id(+) 
      and ceil( blocks*&&blksize/1024/1024) -
          ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
    /
    

    在https://orahow.com/reclaiming-unused-space-in-datafiles/查看详细信息

    • 0
  6. user219764
    2020-12-05T07:19:59+08:002020-12-05T07:19:59+08:00

    https://orahow.com/reclaim-unused-space-in-oracle/ 有两种方法来识别和回收空间。

    • -4

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve