查询并清理紧张的表空间

1.通过下面sql,查询比较紧张的表空间
SELECT ts.tablespace_name,
            NVL(ROUND (total_d.total_bytes/1024/ 1024,0 ),0)total_m,
            NVL(ROUND (free_d.free_bytes/1024/ 1024,0 ),0)free_m,
             ROUND (NVL(free_d.free_bytes,0 )/(NVL(total_d.total_bytes, 0)+0.000001 ),4)* 100  pct_free
     FROM (SELECT tablespace_name,SUM(bytes) total_bytes
            FROM dba_data_files ddf
          GROUP BY ddf.tablespace_name) total_d,
          ( SELECT  tablespace_name,SUM (bytes) free_bytes
            FROM dba_free_space dfs
          GROUP BY dfs.tablespace_name) free_d,
          dba_tablespaces ts
    WHERE ts.tablespace_name=total_d.tablespace_name(+)
    AND ts.tablespace_name=free_d.tablespace_name(+)
    AND ts.Contents<>'TEMPORARY'
  ORDER BY ROUND (NVL(free_d.free_bytes,0 )/(NVL(total_d.total_bytes, 0)+0.000001 ),4)* 100 asc
 ;
 

2.找出表空间中比较大的索引
select t.owner,
       t.segment_name,
       t.segment_type,
       t.tablespace_name,
      -- t.BYTES
       sum(t.bytes) / 1024 / 1024 / 1024 GB
  from dba_segments t
 where t.tablespace_name = 'XXX'
   and t.segment_type = 'INDEX'
   group by t.owner,t.segment_name,t.segment_type,t.tablespace_name
   order by sum (t.bytes) / 1024 / 1024 / 1024 desc ;
;
3.重建索引
--alter index XXX rebuild tablespace tbs_name;
alter index yyy.xxx rebuild;
4.如果重建索引效果不大,可以将表迁移到别的表空间,例如
 alter TABLE  HR.PER_IMAGES  MOVE tablespace APPS_TS_MEDIA ;
 
select * from dba_indexes t where upper(t.table_name)='PER_IMAGES' ;
alter index hr.PER_IMAGES_PK rebuild ;
alter index hr.PER_IMAGES_UK2 rebuild ;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23169974/viewspace-754732/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23169974/viewspace-754732/

在 Oracle 数据库中,清理表数据释放表空间通常涉及多个步骤和考虑因素。以下是一些关键方法和注意事项: ### 删除表数据释放空间 1. **使用 `DELETE` 语句** `DELETE` 语句可以从表中删除数据,但不会立即释放表空间[^1]。这是因为 Oracle 数据库在删除数据后不会自动回收空间,除非显式地执行空间回收操作。 ```sql DELETE FROM table_name; COMMIT; ``` 2. **使用 `TRUNCATE` 语句** `TRUNCATE` 语句可以快速删除表中的所有数据,且会立即释放表空间[^1]。 ```sql TRUNCATE TABLE table_name; ``` 3. **重建表** 如果表中存在大量碎片,可以考虑重建表以优化存储空间。重建表的过程包括导出数据、删除原表、重新创建表以及导入数据。 ```sql CREATE TABLE new_table AS SELECT * FROM old_table; DROP TABLE old_table; RENAME new_table TO old_table; ``` 4. **收缩表** Oracle 提供了 `ALTER TABLE ... SHRINK SPACE` 命令,可以在线收缩表释放未使用的空间[^3]。该操作需要表所在的表空间支持自动段空间管理(ASSM)。 ```sql ALTER TABLE table_name ENABLE ROW MOVEMENT; ALTER TABLE table_name SHRINK SPACE CASCADE; ``` ### 表空间管理 1. **本地管理的表空间** 在本地管理的表空间中,Oracle 会自动管理扩展区的大小,用户提供的 `NEXT` 值会被忽略[^2]。如果启用了自动分配扩展区(autoallocate extent management),则扩展区的大小由 Oracle 动态决定。 2. **统一管理的表空间** 在统一管理的表空间中,扩展区的大小由创建表空间时指定的 `UNIFORM` 参数决定。 ### 行目录空间管理 当删除表中的行时,Oracle 数据库不会立即回收行目录中分配的空间[^3]。这部分空间只有在插入新行时才会被重新利用。如果表中有大量删除操作,建议定期执行表收缩或重建操作以优化存储。 ### 示例:清理表数据释放空间 以下是一个完整的示例,展示如何清理表数据释放表空间: ```sql -- 使用 TRUNCATE 快速删除数据释放空间 TRUNCATE TABLE employees; -- 或者使用 DELETE 删除数据,但需要手动收缩表以释放空间 DELETE FROM employees; COMMIT; -- 启用行移动收缩表以释放空间 ALTER TABLE employees ENABLE ROW MOVEMENT; ALTER TABLE employees SHRINK SPACE CASCADE; ``` ### 归档与备份 在执行数据清理操作之前,建议先进行数据库备份以防止数据丢失。可以使用 RMAN(Recovery Manager)执行冷备或热备操作[^4]。 ```bash # 使用 RMAN 执行冷备 rman target / SHUTDOWN IMMEDIATE; STARTUP MOUNT; BACKUP DATABASE; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; # 使用 RMAN 执行热备 BACKUP DATABASE PLUS ARCHIVELOG; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值