如何管理我的 Amazon RDS for Oracle 数据库实例中的存储?

3 分钟阅读
0

我想使用最佳实践来管理我的 Amazon Relational Database Service (Amazon RDS) for Oracle 数据库实例的存储。

简短描述

您可以采取许多步骤来避免 Amazon RDS for Oracle 数据库实例的 storage-full 状态。当数据库实例遇到 storage-full 状态时,您的实例登录将冻结,数据库会停止增长。在您增加空闲存储空间之前,任何要占用空闲存储空间的扩展都会失败,并出现与以下类似的错误消息:

“ORA-27061:waiting for async I/O failed
Error: Linux-x86_64 Error: 28: No space left on device”

解决方法

监控 FreeStorageSpace 指标

FreeStorageSpace 的快速下降表明您的数据库使用量增加了,可能进入 storage-full 状态。如果 FreeStorageSpace 下降并且您的数据库实例使用了 90% 以上的已分配存储空间,则数据库会遇到 LOW_STORAGE 事件。如果您开启了自动扩展,则您的实例会增加存储空间。

创建 Amazon CloudWatch 告警以监控 FreeStorageSpace 指标,并在存储空间达到阈值时通知您。

查看所有自动扩展的表空间

RDS for Oracle 数据库实例的默认表空间类型是 bigfile 并会开启 AUTOEXTENDbigfile 表空间的最大大小为 16 TiB。表空间增加的上限是表空间的最大配额或为数据库实例分配的存储空间。如果您分配的存储空间已满,则您的实例将切换为 storage-full 状态,并且您的表空间无法扩展。有关更多信息,请参阅 Oracle 网站上的自动扩展表空间

最佳实践是根据应用程序的需求来规划表空间扩展。为避免在批量加载之前出现 storage-full 问题,请调整表空间大小分配更多空间。如果您对存储进行扩展,则数据库实例的性能通常不会受到影响,也不会发生中断。修改存储大小后,您的数据库实例处于 stroage-optimization 状态

**注意:**在修改数据库实例之前,请参阅处理 Amazon RDS 数据库实例的存储

查看 Amazon RDS 的 Oracle 文件大小配额

RDS for Oracle 数据库实例中单个文件的最大大小为 16 TiB。如果您在 bigfile 表空间中调整的数据文件的大小超出此配额,则会收到与以下类似的错误消息:

“ORA-01237:cannot extend datafile 6
ORA-01110:data file 6:'/rdsdbdata/db/mydir/datafile/myfile.dbf' ORA-27059:
could not reduce file size Linux-x86_64 Error: 27:
File too largeAdditional information: 2”

解决 “Storage quota exceeded” 错误

如果您的 AWS 账户级别分配的存储空间达到配额,并且您尝试创建新的 RDS 数据库实例,则会出现与以下类似的错误消息:

“Storage quota exceeded by <x>;<x>requested size:<x> <x>

要解决此错误,则请求增加配额或删除未使用的备份,以立即释放账户中的空间。

管理占用 BDUMP 目录的大型跟踪文件

有时,会在 BDUMP 目录中创建大型跟踪文件。这些文件会占用存储空间并根据保留策略进行清除。它们还可能导致您的数据库实例出现 storage-full 的情况。

跟踪文件会不断积累,从而占用大量磁盘空间。默认情况下,Amazon RDS 会清除超过 7 天的跟踪文件和日志文件。要设置跟踪文件的保留期,请使用 show_configuration。要查看配置结果,请运行 SET SERVEROUTPUT 命令。

有关如何管理跟踪文件的更多信息,请参阅 Oracle 数据库日志文件

要按大小对 BDUMP 目录中的文件进行排序,请运行与以下示例类似的命令:

select FILENAME, FILESIZE/1024/1024/1024"GB",MTIME from TABLE  
 (rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP')) order by 3 desc

确定未使用的文件后,使用 fremove dbms 软件包来删除跟踪文件保留期内的大文件:

exec UTL_FILE.FREMOVE ('BDUMP',' <TRACEFILENAME');

以下示例显示了当前的跟踪文件保留期,然后设置了新的跟踪文件保留期:

# Show the current tracefile retentionSQL> EXEC rdsadmin.rdsadmin_util.show_configuration;  
NAME:tracefile retentionVALUE:10080  
DESCRIPTION:tracefile expiration specifies the duration in minutes before tracefiles in bdump are automatically deleted.  

# Set the tracefile retention to 24 hours:SQL> EXEC rdsadmin.rdsadmin_util.set_configuration('tracefile retention',1440);SQL> commit;  

#show the new tracefile retentionSQL> EXEC rdsadmin.rdsadmin_util.show_configuration;  
NAME:tracefile retentionVALUE:1440  
DESCRIPTION:tracefile expiration specifies the duration in minutes before tracefiles in bdump are automatically deleted.

管理使用 DATA_PUMP_DIR 目录的大型 Data Pump Directory

如果您使用 Oracle Data Pump 来移动数据,则可能会复制大型转储文件,导致空闲存储空间减少。要解决此问题,请将 Amazon RDS for Oracle 与 Amazon Elastic File System (Amazon EFS) 进行集成。使用此设置时,您在进行数据库刷新时无需使用 DATA_PUMP_DIR

检查您的归档日志保留情况

Amazon RDS 会根据备份保留将归档日志备份到内部存储,用于 PITR 目的。根据 RDS for Oracle 的归档日志保留设置,本地存储在 RDS 存储上的归档日志会占用分配的存储使用量。

保留归档的重做日志,请使用以下参数运行 rdsadmin.rdsadmon_util.set_configuration

begin  
    rdsadmin.rdsadmin_util.set_configuration(  
        name  => 'archivelog retention hours',  
        value => '24');  
end;  
/  
commit;
NAME:archivelog retention hours  
VALUE:24  
DESCRIPTION:ArchiveLog expiration specifies the duration   
in hours before archive/redo log files are automatically deleted.

要检查您的数据库实例在特定时间段内使用了多少空间,请运行以下查询。将 X 替换为要查询的小时数:

SELECT SUM(BLOCKS * BLOCK_SIZE) bytes   
  FROM V$ARCHIVED_LOG  
 WHERE FIRST_TIME >= SYSDATE-(X/24) AND DEST_ID=1;

要查看保留的归档日志,请运行以下命令创建 ARCHIVELOG_DIR目录对象:

EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR'));

检查数据库中是否存在碎片化对象

碎片会导致数据库变慢并占用不必要的存储空间。要识别碎片化且占用最多空间的对象,请运行与以下示例类似的命令:

select  owner,table_name,round((blocks8),2)/1024 "size (mb)" ,  
round((num_rowsavg_row_len/1024/1024),2) "actual_data (mb)",  
(round((blocks8),2) - round((num_rowsavg_row_len/1024/1024),2)) "wasted_space (mb)"  
from  dba_tables  
where (round((blocks8),2) > round((num_rowsavg_row_len/1024/1024),2)) and owner='&schema_name'  
order by 4 desc;

要移除碎片,可以使用导出和导入、重新创建表或将表移动到新的表空间。

**注意:**仅当您在清空碎片化对象并将碎片化对象移至新表空间后删除碎片化表空间时,空闲存储空间指标才会受到影响。

使用 AWR 来分析数据库实例的增长趋势

在 Oracle Enterprise 版中,您可以使用 AWR Explorer 来查询历史信息并分析数据库的增长趋势。要检查每种对象类型的数据库架构在特定天数内的增长情况,请运行以下命令:

title "Total Disk Used by Object Type"  
select c.segment_type, sum(space_used_delta) / 1024 / 1024 "Space used (M)", sum(c.bytes) / 1024 / 1024 "Total Space (M)",  
round(sum(space_used_delta) / sum(c.bytes) * 100, 2) || '%' "Percent of Total Disk Usage"  
from  
dba_hist_snapshot sn,  
dba_hist_seg_stat a,  
dba_objects b,  
dba_segments c  
where end_interval_time > trunc(sysdate) - &days_back  
and sn.snap_id = a.snap_id  
and b.object_id = a.obj#  
and b.owner = c.owner  
and b.object_name = c.segment_name  
and space_used_delta > 0  
and c.owner = '&schema_name'  
group by rollup(segment_type);

实施其他方法

实施以下方法以防止您的实例出现 storage-full 的情况:

相关内容

如何减少 Amazon RDS 数据库实例的总预置存储大小?

为什么我的 Amazon RDS for Oracle 数据库实例使用的存储超出预期?