使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何调整我的 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 实例具有以下限制:

  • 由于 RDS for Oracle 中不支持 ALTER DATABASE 命令,因此您无法运行 ALTER DATABASE 查询来调整数据文件的大小或更改数据文件配置。有关详细信息,请参阅 Oracle DBA 权限的限制
  • 必须手动管理 db_files 参数以定义数据库中数据文件的最大数量。当数据文件的数量接近此限制时,请更改 db_files 参数。

如果未指定数据文件大小,则在创建表空间时,将默认启用 AUTOEXTEND ONbigfile 表空间的最大大小为 16 TiB(太字节)。当将数据插入表空间时,表空间将增加到表空间所需的配置的最大限制。或者,表空间将增加到为 RDS 实例分配的存储空间的最大限制。

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

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

解决方法

要调整 RDS for Oracle 实例的表空间大小,请完成以下步骤。

检查表空间的配置

完成以下步骤:

  1. 要确定表空间类型,请运行与以下示例类似的查询:
    SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;
    请注意,表空间类型可以是永久undo临时smallfilebigfile
  2. 要检查数据文件的大小和配置的最大限制,并检查自动扩展功能是否已启用,请运行以下查询。对于永久表空间和 undo 表空间,请运行以下查询:
    SQL> 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;
    对于临时表空间,请运行以下查询:
    SQL> 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 的值将取决于用于创建表空间的块大小。例如,如果使用的块大小为 8K,则 MAX_GB 的值为 32 GB。有关详细信息,请参阅 Oracle 网站上的非标准块大小
  • 如果表空间类型为 bigfile,则 MAX_GB 的值显示为 32 TB。RDS for Oracle 数据库实例中单个文件的最大大小为 16 TiB。

要检索表空间的数据描述语言 (DDL),请运行以下查询:

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

您可以从返回的 DDL 中检索有关表空间的所需信息。

增加表空间的大小

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

但是,当您启用自动扩展功能,然后调整表空间大小时,必须满足以下要求。

对于 bigfile 表空间,要调整表空间的大小,请运行 ALTER TABLESPACE 命令:

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

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

对于 smallfile 表空间,请添加数据文件以增加表空间的大小:

SQL> ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;

要调整 smallfile 表空间中原始数据文件的大小,请运行 rdsadmin_util.resize_datafile

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      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 表空间的大小,请完成以下步骤:

  1. 减小 smallfile 表空间的大小,请运行 rdsadmin_util.resize_datafile
    **注意:**您无法将数据文件的大小减小到数据文件高水位以下的值。
  2. 创建新的表空间并根据需要配置空间。然后,手动将所有数据移动到新的表空间。

如果您的表空间为 bigfile,要根据您的表空间类型减小表空间的大小,请选择以下方法之一。

对于永久表空间,您无法将永久表空间的大小减小到表空间高水印以下的值。当尝试调整永久表空间的大小时,调整大小操作会失败。然后,您会看到以下错误:

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

但是,要在表空间大小为 50 GB 且高水印为 40 GB 时将表空间大小减小到 40 GB,请运行以下查询:

SQL> ALTER TABLESPACE example-tablespace RESIZE 40G;

如果您无法将表空间的大小减小到高水印以下的值,请考虑以下选项:

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

对于临时表空间,要减小临时表空间的大小,请运行 SHRINK 命令:

SQL> ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

要调整只读副本中的临时表空间大小,请运行 rdsadmin.rdsadmin_util.resize_temp_tablespace

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

-or-

创建另一个临时表空间并配置所需的大小。然后,将新的临时表空间设置为默认临时表空间。

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

    SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

    有关详细信息,请参阅 Oracle 网站上的查看有关表空间的信息

  2. 创建新的临时表空间,请运行以下查询:

    SQL> CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;
  3. 将新的临时表空间设置为默认临时表空间,请运行以下查询:

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

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

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

    SQL>  SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';
  2. 更改用户的默认临时表空间,请运行以下查询:

    SQL> ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

对于 undo 表空间,请使用 ALTER TABLESPACE 命令来减小 undo 表空间的大小。

要确定当前正在使用的 undo 表空间,请运行以下查询:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

减小 undo 表空间的大小,请运行与以下示例查询类似的查询:

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

  1. 创建新的 undo 表空间:

    SQL> CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;
  2. 将新创建的表空间设置为默认的 undo 表空间

    UNDO_TABLESPACE = example-new-tablespace

    在参数组中设置 UNDO_TABLESPACE 初始化参数以指向新创建的表空间。
    有关详细信息,请参阅使用参数组
    UNDO_TABLESPACE 初始化参数是一个动态参数,在您应用修改时不会导致停机。但是,最佳做法是在进行更改后重启数据库实例。有关详细信息,请参阅 Oracle 网站上的管理 Undo
    要验证新的 undo 表空间是否为默认表空间,请运行以下查询:

    SQL> SHOW PARAMETER UNDO_TABLESPACE;
  3. 删除旧的 undo 表空间,请运行删除表空间查询:

    SQL> DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;

相关信息

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

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

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