跳至内容

如何调整我的 Amazon RDS for Oracle 数据库实例的表空间大小?

3 分钟阅读
0

我想知道如何管理我的 Amazon Relational Database Service (Amazon RDS) for Oracle 数据库实例的表空间或调整其大小。

简短描述

Amazon RDS for Oracle 数据库实例的默认表空间类型为 bigfile。为 RDS for Oracle 实例使用 smallfile 表空间并不是最佳实践。

使用 smallfile 表空间的 RDS for Oracle 数据库实例具有以下限制:

  • 您不能运行 ALTER DATABASE 命令来调整数据文件的大小或更改数据文件配置。有关详细信息,请参阅 RDS for Oracle 中 DBA 权限的限制
  • 必须手动管理 db_files 参数以定义数据库中数据文件的最大数量。如果数据文件的数量接近其配额,则必须更改 db_files 参数。

当您创建表空间且未指定数据文件大小时,Amazon RDS 会默认开启 AUTOEXTEND ONbigfile 表空间的最大大小为 16 TiB。当您将数据插入表空间时,表空间的大小会增加到您配置的最大配额或分配的存储空间的最大配额。

如果为 RDS for Oracle 数据库实例分配的存储空间已满,则该实例将切换到 STORAGE_FULL 状态,且表空间无法扩展。要解决此问题,必须向实例添加存储空间。有关详细信息,请参阅如何解决 Amazon RDS 数据库实例用尽存储空间时出现的问题?

当您从表空间删除数据时,表空间的大小不会减小。当您插入新数据时,您可以重复使用空闲数据块。必须手动调整表空间的大小才能回收未使用的空间。

解决方法

**注意:**在以下命令中,将 TABLESPACE_NAMEexample-tablespace 替换为您的表空间的名称。

检查表空间的配置

要确定表空间类型,请运行以下查询:

SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

前面的命令可能会返回以下输出:

  • 对于 BIGFILEBIGFILE 列的值可以是 YES,对于 SMALL FILE,其对应列的值可以是 NO
  • CONTENTS 列可以是 permanent(永久)、undo(撤销)或 temporary(临时)。

要检查数据文件的大小、您配置的最大配额以及自动扩展功能是否已启用,请运行以下查询之一。

对于永久表空间和撤销表空间,请运行以下查询:

SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

对于临时表空间,请运行以下查询:

SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

前面的命令可能会返回以下输出:

  • 如果未启用自动扩展功能,则 MAX_GB 的值等于 0。
  • 如果表空间类型为 smallfile,则 MAX_GB 的值将取决于用于创建表空间的块大小。例如,如果块大小为 8 K,则 MAX_GB 的值为 32 GB。有关详细信息,请参阅 Oracle 网站上的 Nonstandard block sizes(非标准块大小)
  • 如果表空间类型为 bigfile,则 MAX_GB 的值显示为 32 TB。RDS for Oracle 数据库实例中单个文件的最大大小为 16 TiB。

要从数据描述语言 (DDL) 检索有关表空间的所需信息,请运行以下命令:

SET LINESIZE 400;
SET LONG 99999;
SELECT DBMS_METADATA.GET_DDL('TABLESPACE','example-tablespace') FROM DUAL;

增加表空间的大小

如果您启用自动扩展功能,则无需增加表空间的大小。

但是,如果您打开自动扩展功能,然后调整表空间的大小,则在调整大小时必须执行以下操作:

  • 对于 bigfile 表空间,运行以下命令来调整表空间的大小:

    ALTER TABLESPACE example-tablespace RESIZE 50G;

    **注意:**以千字节、兆字节、千兆字节或兆兆字节为单位指定大小。bigfile 表空间只有一个数据文件,且 ALTER TABLESPACE 命令可调整属于该表空间的数据文件的大小。有关详细信息,请参阅 Oracle 网站上的 ALTER TABLESPACE

  • 对于 smallfile 表空间,运行以下命令添加数据文件以增加表空间的大小:

    ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;
  • 对于 smallfile 表空间,运行以下命令以使用 rdsadmin_util.resize_datafile 过程来调整原始数据文件的大小:

    select file_id,file_name, bytes/1024/1024/1024 gb from dba_data_files where tablespace_name='TEST';

    **注意:**将 TEST 替换为表空间的名称。

    过程输出示例:

    FILE_ID FILE_NAME                                                   GB  
    =======================================================================  
    6      /rdsdbdata/db/TESTDB_A/datafile/o1_mf_test_m03xlfq8_.dbf      1  
    SQL> exec rdsadmin.rdsadmin_util.resize_datafile(6,'2G')  
    PL/SQL procedure successfully completed.  
    SQL> select file_id,file_name, bytes/1024/1024/1024 gb from dba_data_files where tablespace_name='TEST';  
    FILE_ID FILE_NAME                                                     GB  
    =========================================================================  
     6      /rdsdbdata/db/TESTDB_A/datafile/o1_mf_test_m03xlfq8_.dbf      2

减小 smallfile 表空间的大小

要减小 smallfile 表空间的大小,请完成以下步骤:

  1. 使用 rdsadmin_util.resize_datafile 过程。
    **注意:**您无法将数据文件的大小减小到数据文件高水位以下的值。
  2. 创建新的表空间,然后根据您的要求配置该空间。
  3. 手动将所有数据移动到新的表空间。

减小 bigfile 表空间的大小

如果您使用 bigfile 表空间,请选择以下方法之一来减小表空间的大小

永久表空间

当您尝试将永久表空间大小减小到小于表空间高水位线的值时,调整大小操作将失败。然后,您会收到以下错误消息:

“ORA-03297: file contains used data beyond requested RESIZE value.”

如果表空间的大小大于水位线,则可以将永久表空间的大小减小至水位线值。

例如,如果高水位线为 40 GB,表空间的大小为 50 GB,请将表空间减小到 40 GB。

调整表空间大小的命令示例:

ALTER TABLESPACE example-tablespace RESIZE 40G;

如果您无法将表空间的大小减小至等于高水位线的值,请执行以下操作:

  • 重新组织表空间中的对象。
  • 创建新的表空间并将所有对象移动到新的表空间。然后,删除旧表空间。

临时表空间

运行以下命令以减少临时表空间

ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

要调整只读副本中临时表空间的大小,请在以下命令中加入 rdsadmin.rdsadmin_util.resize_temp_tablespace

EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('example-tablespace','100M');

或者,创建另一个临时表空间并将新表空间设置为默认表空间。

完成以下步骤:

  1. 运行以下查询以查看当前的默认临时表空间:

    SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

    **注意:**有关详细信息,请参阅 Oracle 网站上的 Viewing information about tablespaces(查看有关表空间的信息)

  2. 运行以下命令以创建另一个临时表空间并配置所需的大小:

    CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;
  3. 运行以下命令以将新的临时表空间设置为默认临时表空间

    EXEC RDSADMIN.RDSADMIN_UTIL.ALTER_DEFAULT_TEMP_TABLESPACE(TABLESPACE_NAME => 'example-tablespace');

要修改特定用户的临时表空间,请完成以下步骤:

  1. 运行以下查询以查看用户当前的默认临时表空间:

    SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';
  2. 运行以下命令以更改默认临时表空间

    ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

撤消表空间

完成以下步骤:

  1. 运行以下查询以确定当前正在使用的撤消表空间:

    SHOW PARAMETER UNDO_TABLESPACE;
  2. 运行以下命令以减小撤消表空间的大小:

    `ALTER TABLESPACE example-tablespace RESIZE 40G;`

如果查询未运行,请完成以下步骤:

  1. 运行以下命令以创建新的撤消表空间

    CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;

    **注意:**将 example-new-tablespace 替换为新撤消表空间的名称。

  2. 运行以下命令以将撤消表空间设置为参数组中的默认表空间:

    UNDO_TABLESPACE = example-new-tablespace

    **注意:**由于 UNDO_TABLESPACE 是一个动态参数,因此修改时不会发生停机。但是,最佳做法是在修改参数后重启数据库实例。有关详细信息,请参阅 Oracle 网站上的 Managing undo(管理撤销)

  3. 运行以下查询以验证新的撤销表空间是否为默认表空间:

    SHOW PARAMETER UNDO_TABLESPACE;
  4. 运行以下命令以删除旧的撤消表空间:

    DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;

相关信息

如何创建 CloudWatch 警报来监控 Amazon RDS 的可用存储空间并防止出现存储已满问题?

使用 Amazon RDS 存储自动扩展功能自动管理容量

我的 Amazon RDS for Oracle 数据库实例的存储空间使用量为何超出预期?