温馨提示×

Ubuntu上Oracle数据库空间如何管理

小樊
37
2025-12-18 18:34:37
栏目: 云计算

Ubuntu上Oracle数据库空间管理

一 日常巡检与容量评估

  • 操作系统层:使用命令查看磁盘剩余空间,避免因磁盘满导致数据文件无法扩展。示例:df -h。当使用率超过**90%**时应优先清理或扩容磁盘。
  • 数据库层:查看表空间总体使用率(包含临时表空间),快速识别风险对象。示例:
    select * from (
      Select a.tablespace_name,
             (a.bytes- b.bytes) "表空间使用大小(BYTE)",
             a.bytes/(1024*1024*1024) "表空间大小(GB)",
             b.bytes/(1024*1024*1024) "表空间剩余大小(GB)",
             (a.bytes- b.bytes)/(1024*1024*1024) "表空间使用大小(GB)",
             to_char((1 - b.bytes/a.bytes)*100,'99.99999') || '%' "使用率"
      from (select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespace_name) a,
           (select tablespace_name,sum(bytes) bytes from dba_free_space group by tablespace_name) b
      where a.tablespace_name = b.tablespace_name
      union all
      select c.tablespace_name,
             d.bytes_used "表空间使用大小(BYTE)",
             c.bytes/(1024*1024*1024) "表空间大小(GB)",
             (c.bytes-d.bytes_used)/(1024*1024*1024) "表空间剩余大小(GB)",
             d.bytes_used/(1024*1024*GB) "表空间使用大小(GB)",
             to_char(d.bytes_used*100/c.bytes,'99.99999') || '%' "使用率"
      from (select tablespace_name,sum(bytes) bytes from dba_temp_files group by tablespace_name) c,
           (select tablespace_name,sum(bytes_cached) bytes_used from v$temp_extent_pool group by tablespace_name) d
      where c.tablespace_name = d.tablespace_name
    )
    order by tablespace_name;
    
    同时检查数据文件是否启用自动扩展、当前大小与上限:select file_name,autoextensible,increment_by,maxbytes from dba_data_files where tablespace_name='YOUR_TS';

二 扩容表空间与数据文件

  • 自动扩展:为现有数据文件开启自动扩展,减少人工介入。示例:
    ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/users03.dbf' 
    AUTOEXTEND ON NEXT 512K MAXSIZE 250M;
    
    也可在创建表空间或新增数据文件时直接指定自动扩展。
  • 增加数据文件:当单文件上限或磁盘分布需要分散IO时,给表空间新增数据文件。示例:
    ALTER TABLESPACE <tablespace_name>
    ADD DATAFILE '/data/oracle/orcl/ts_data_02.dbf'
    SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
    EXTENT MANAGEMENT LOCAL;
    
    对于BIGFILE表空间,可用ALTER TABLESPACE ... ADD DATAFILEALTER TABLESPACE ... RESIZE进行管理(BIGFILE仅支持单个数据文件)。
  • 调整现有数据文件大小:直接把数据文件“拉大”。示例:
    ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/users03.dbf' RESIZE 20G;
    
    注意:执行RESIZE前确保操作系统目录有足够空间,且尽量在非高峰时段进行。
  • 容量上限提示:在非BIGFILE表空间中,单个数据文件的理论上限约为4194304 × DB_BLOCK_SIZE。例如DB_BLOCK_SIZE=8KB时约32GB;使用BIGFILE可显著放大单文件上限(如128TB级别,取决于块大小与平台)。

三 空间回收与碎片整理

  • 回收站清理:删除表/索引后空间不会立刻归还给表空间,需清理回收站。示例:
    PURGE RECYCLEBIN;            -- 当前用户
    PURGE DBA_RECYCLEBIN;        -- DBA权限,全库
    
  • 段收缩与空间回收:对高水位线(HWM)较高的表进行在线收缩,合并碎片并释放高水位线以上空间。示例:
    ALTER TABLE <owner>.<table_name> ENABLE ROW MOVEMENT;
    ALTER TABLE <owner>.<table_name> SHRINK SPACE [CASCADE];
    ALTER TABLE <owner>.<table_name> DISABLE ROW MOVEMENT;
    
    适用前提:表需在本地管理表空间(LMT)且启用自动段空间管理(ASSM);不适用于IOT、基于ROWID的物化视图基表、函数索引SECUREFILE LOB压缩表等对象。
  • 识别可回收对象:使用Segment Advisor识别可收缩的段并给出建议(可自动运行或手动按需运行)。
  • 无法收缩时的替代:对不适用的对象,可使用**在线重定义(Online Redefinition)**进行重组,以在回收空间的同时调整逻辑/物理属性(需要额外磁盘空间)。

四 常见应急与最佳实践

  • 归档日志导致空间告警(ORA-00257):先释放磁盘空间再恢复归档。示例(RMAN):
    RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
    
    清理后确认ARCHIVE LOG LIST;df -h恢复正常。
  • 大对象导入/迁移:提前准备足够容量的表空间临时表空间,必要时增加UNDO表空间,避免导入中途因空间不足失败。示例:
    CREATE BIGFILE TABLESPACE bigdata2
    DATAFILE '/u01/oradata/orcl/bigdata2.dbf' SIZE 2G
    AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
    LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
    
    CREATE BIGFILE TEMPORARY TABLESPACE bigdata2temp
    TEMPFILE '/u01/oradata/orcl/bigdata2temp.dbf' SIZE 1G
    AUTOEXTEND ON NEXT 512M MAXSIZE UNLIMITED
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
    
    导入大量数据时,可结合并行与DIRECTORY对象提升效率。
  • 日常最佳实践:
    • 为数据文件设置合理的AUTOEXTEND增量与上限,避免“无限增长”;定期巡检使用率并规划扩容。
    • 结合分区表按时间/业务键管理历史数据,定期DROP PARTITION清理过期分区,回收空间最快速。
    • 对高变更表定期执行Segment Advisor评估并执行SHRINK(或在线重定义),控制HWM与碎片。
    • 生产变更在低峰期进行,变更前做好RMAN备份可回退方案

0