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

上次更新日期:2021 年 11 月 3 日

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

简短描述

Amazon RDS for Oracle 数据库实例的原定设置表空间类型为大文件。大文件表空间使数据文件对用户透明。因此,您可以直接对表空间执行操作,而不必管理每个底层数据文件。大文件表空间无需添加新数据文件或处理多个文件,从而简化了数据文件管理。最佳实践是避免为 RDS for Oracle 实例使用小文件表空间

如果 RDS for Oracle 实例使用小文件表空间,则存在以下限制:

  • 无法调整数据文件的大小。但是,可以通过在表空间中添加新数据文件来调整表空间的大小。
  • 无法运行 ALTER DATABASE 查询来调整数据文件的大小或更改数据文件配置。这是因为 RDS for Oracle 中不支持 ALTER DATABASE 命令。有关更多信息,请参阅 RDS for Oracle 的局限性
  • 必须手动管理 db_files 参数,定义数据库中的最大数据文件数量。当数据文件的数量达到此限制时,可能需要调整 db_files。

原定设置情况下,RDS for Oracle 中的表空间是大文件,并启用了 AUTOEXTEND大文件表空间的最大大小为 16 TiB。在将数据插入表空间时,表空间会根据需要增加,达到为该表空间配置的大小上限或者为 RDS 实例配置的已分配存储空间,以较小者为准。如果为 RDS 实例分配的存储空间已全部使用,则该实例将切换到 STORAGE_FULL 状态,并且表空间无法扩展。要解决此问题,您必须向实例添加存储空间。有关更多详细信息,请参阅如何解决在 Amazon RDS 数据库实例存储用尽时出现的问题?

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

解决方法

要调整 RDS for Oracle 实例的表空间大小,请执行以下操作:

  1. 检查表空间的配置。
  2. 根据使用场景增加或缩减表空间的大小。

检查表空间的配置

1.    运行类似于以下内容的查询来确定表空间的属性:

  • 永久、还原或临时
  • 小文件或大文件
SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

2.    运行类似于以下内容的查询来检查自动扩展功能是否已开启、当前的数据文件大小以及配置上限:

对于永久表空间和还原表空间:

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。
  • 如果表空间是小文件,则 MAX_GB 的值取决于用于创建表空间的数据块的大小。例如,如果使用的数据块大小为 8K,则 MAX_GB 的值为 32 GB。有关更多信息,请参阅 Oracle 有关非标准数据块大小的文档。
  • 如果表空间是大文件,则 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 中获取有关表空间的所需信息。

增加表空间的大小

如果已打开自动扩展功能,则无论表空间的类型如何,都无需增加表空间的大小。在这种情况下,表空间会根据需要自动调整大小。

如果尚未打开自动扩展功能并想调整表空间的大小,请执行以下操作:

对于大文件表空间:使用 ALTER TABLESPACE 命令调整表空间的大小。您可以指定以千字节 (K)、兆字节 (M)、千兆字节 (G) 或太字节 (T) 为单位的大小。大文件表空间只有一个数据文件,此命令可调整与该表空间关联的底层单个数据文件的大小。

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

对于小文件表空间:只能通过向表空间添加更多数据文件来调整表空间的大小。您无法调整当前数据文件的大小或修改配置。

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

缩减表空间的大小

如果表空间是小文件,则无法管理底层数据文件。要增加表空间大小,请添加新的数据文件。添加新数据文件时,请确保为 AUTOEXTEND、SIZE 和 MAXSIZE 选择了正确的值。这些值以后无法更改。要缩减小文件表空间的大小,请新建一个具有所需空间的表空间,然后将所有数据手动移动到新的表空间中。

如果表空间是大文件,请根据表空间的数据类型,选择以下一种方法来缩减表空间的大小:

永久表空间:永久表空间的大小不能缩减到小于表空间高水位线的值。如果尝试这样做,调整大小操作将失败,并返回以下错误:

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');

有关更多信息,请参阅调整只读副本中临时表空间的大小

-或者-

您可以用自己选择大小来创建另一个临时表空间,然后将这个新的临时表空间设置为原定设置临时表空间。

1.    运行以下查询来查看当前的原定设置临时表空间:

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

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;

还原表空间:首先,尝试使用 ALTER TABLESPACE 命令缩小还原表空间的大小。

运行以下查询来确定当前正在使用的还原表空间:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

运行类似于以下内容的查询来缩小还原表空间的大小:

SQL> ALTER TABLESPACE example-tablespace RESIZE 500M;

如果存储中没有必须删除的还原段,则此查询会成功运行。

如果上述查询未成功运行,请执行以下操作:

1.    创建新的还原表空间:

运行类似于以下内容的查询来创建新的还原表空间:

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

2.    将新创建的表空间设置为原定设置还原表空间:

将参数组中的 UNDO_TABLESPACE 初始化参数设置为指向新创建的表空间。有关更多信息,请参阅修改数据库参数组中的参数

示例:

UNDO_TABLESPACE = example-new-tablespace

此参数为动态参数,应用更改时完全不会产生停机时间。但是,最佳实践是在进行此更改后重启数据库实例。有关更多信息,请参阅管理还原

运行以下查询,验证新的还原表空间是否为原定设置表空间:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

3.    删除旧的还原表空间:

运行类似于以下内容的查询来删除旧的还原表空间:

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