

# 执行 Oracle 数据库实例的其他任务
<a name="Appendix.Oracle.CommonDBATasks.Misc"></a>

下文中介绍了如何在运行 Oracle 的 Amazon RDS 数据库实例上执行其他 DBA 任务。为了提供托管服务体验，Amazon RDS 不允许通过 shell 访问数据库实例，而仅限访问某些需要高级权限的系统过程和表。

**Topics**
+ [在主数据存储空间中创建和删除目录](#Appendix.Oracle.CommonDBATasks.NewDirectories)
+ [列出数据库实例目录中的文件](#Appendix.Oracle.CommonDBATasks.ListDirectories)
+ [读取数据库实例目录中的文件](#Appendix.Oracle.CommonDBATasks.ReadingFiles)
+ [访问 Opatch 文件](#Appendix.Oracle.CommonDBATasks.accessing-opatch-files)
+ [管理顾问任务](#Appendix.Oracle.CommonDBATasks.managing-advisor-tasks)
+ [传输表空间](rdsadmin_transport_util.md)

## 在主数据存储空间中创建和删除目录
<a name="Appendix.Oracle.CommonDBATasks.NewDirectories"></a>

要创建目录，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.create_directory`。您可以创建最多 10000 个目录 (全部位于主数据存储空间中)。要删除目录，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.drop_directory`。

`create_directory` 和 `drop_directory` 过程具有以下必需参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_directory_name`  |  VARCHAR2  |  —  |  是  |  目录的名称。  | 

以下示例创建一个名为 `PRODUCT_DESCRIPTIONS` 的新目录。

```
EXEC rdsadmin.rdsadmin_util.create_directory(p_directory_name => 'product_descriptions');
```

数据字典以大写形式存储目录名称。您可以通过查询 `DBA_DIRECTORIES` 列出目录。系统将自动选择实际主机路径名称。以下示例获取名为 `PRODUCT_DESCRIPTIONS` 的目录的目录路径：

```
SELECT DIRECTORY_PATH 
  FROM DBA_DIRECTORIES 
 WHERE DIRECTORY_NAME='PRODUCT_DESCRIPTIONS';
        
DIRECTORY_PATH
----------------------------------------
/rdsdbdata/userdirs/01
```

数据库实例的主用户名在新目录中拥有读取和写入权限，可以向其他用户授予访问权限。`EXECUTE` 权限不可用于数据库实例上的目录。目录在您的主数据存储空间中创建，将占用空间和 I/O 带宽。

以下示例删除名为 `PRODUCT_DESCRIPTIONS` 的目录。

```
EXEC rdsadmin.rdsadmin_util.drop_directory(p_directory_name => 'product_descriptions');
```

**注意**  
还可以使用 Oracle SQL 命令 `DROP DIRECTORY` 删除目录。

删除目录不会删除其内容。由于 `rdsadmin.rdsadmin_util.create_directory` 过程可重用路径名称，因此，删除的目录中的文件会显示在新创建的目录中。在您删除目录之前，我们建议您使用 `UTL_FILE.FREMOVE` 从目录中删除文件。有关更多信息，请参阅 Oracle 文档中的 [FREMOVE 过程](https://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS70924)。

## 列出数据库实例目录中的文件
<a name="Appendix.Oracle.CommonDBATasks.ListDirectories"></a>

要列出目录中的文件，请使用 Amazon RDS 过程 `rdsadmin.rds_file_util.listdir`。Oracle 副本不支持此过程。`listdir` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_directory`  |  varchar2  |  —  |  是  |  要列出的目录的名称。  | 

以下示例将目录 `PRODUCT_DESCRIPTIONS` 的读/写权限授予用户 `rdsadmin`，然后列出此目录中的文件。

```
GRANT READ,WRITE ON DIRECTORY PRODUCT_DESCRIPTIONS TO rdsadmin;
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'PRODUCT_DESCRIPTIONS'));
```

## 读取数据库实例目录中的文件
<a name="Appendix.Oracle.CommonDBATasks.ReadingFiles"></a>

要读取文本文件，请使用 Amazon RDS 过程 `rdsadmin.rds_file_util.read_text_file`。`read_text_file` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_directory`  |  varchar2  |  —  |  是  |  包含文件的目录的名称。  | 
|  `p_filename`  |  varchar2  |  —  |  是  |  要读取的文件的名称。  | 

以下示例在 `rice.txt` 目录中创建 `PRODUCT_DESCRIPTIONS` 文件。

```
declare
  fh sys.utl_file.file_type;
begin
  fh := utl_file.fopen(location=>'PRODUCT_DESCRIPTIONS', filename=>'rice.txt', open_mode=>'w');
  utl_file.put(file=>fh, buffer=>'AnyCompany brown rice, 15 lbs');
  utl_file.fclose(file=>fh);
end;
/
```

以下示例读取目录 `rice.txt` 中的文件 `PRODUCT_DESCRIPTIONS`。

```
SELECT * FROM TABLE
    (rdsadmin.rds_file_util.read_text_file(
        p_directory => 'PRODUCT_DESCRIPTIONS',
        p_filename  => 'rice.txt'));
```

## 访问 Opatch 文件
<a name="Appendix.Oracle.CommonDBATasks.accessing-opatch-files"></a>

Opatch 是一个 Oracle 实用程序，可用于将修补程序应用和回滚到 Oracle 软件。用于确定哪些修补程序已应用于数据库的 Oracle 机制是 `opatch lsinventory` 命令。为了向自带许可 (BYOL) 客户打开服务请求，Oracle 支持部门会请求 `lsinventory` 文件，有时还请求由 Opatch 生成的 `lsinventory_detail` 文件。

为提供托管服务体验，Amazon RDS 未提供对 Opatch 的 Shell 访问权限。相反，`lsinventory-dbv.txt` 包含与当前引擎版本相关的修补程序信息。当您执行次要或主要升级时，Amazon RDS 会在应用补丁后的一小时内更新 `lsinventory-dbv.txt`。要验证应用的补丁，请参阅`lsinventory-dbv.txt`。该操作类似于运行 `opatch lsinventory` 命令。

**注意**  
本节中的示例假定 BDUMP 目录名为 `BDUMP`。在只读副本上，BDUMP 目录名称不同。要了解如何通过对只读副本查询 `V$DATABASE.DB_UNIQUE_NAME` 来获取 BDUMP 名称，请参阅[列出文件](USER_LogAccess.Concepts.Oracle.md#USER_LogAccess.Concepts.Oracle.WorkingWithTracefiles.ViewingBackgroundDumpDest)。

清单文件使用 Amazon RDS 命名约定 `lsinventory-dbv.txt` 和 `lsinventory_detail-dbv.txt`，其中 *dbv* 是数据库版本的全名。`lsinventory-dbv.txt` 文件在所有数据库版本上均可用。对应的 `lsinventory_detail-dbv.txt` 在 19.0.0.0、ru-2020-01.rur-2020-01.r1 或更高版本上可用。

例如，如果您的数据库版本为 19.0.0.0.ru-2021-07.rur-2021-07.r1，则您的清单文件具有以下名称。

```
lsinventory-19.0.0.0.ru-2021-07.rur-2021-07.r1.txt
lsinventory_detail-19.0.0.0.ru-2021-07.rur-2021-07.r1.txt
```

确保下载与当前版本的数据库引擎匹配的文件。

### 控制台
<a name="Appendix.Oracle.CommonDBATasks.accessing-opatch-files.console"></a>

**使用控制台下载清单文件**

1. 通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.amazonaws.cn/rds/)。

1. 在导航窗格中，选择 **Databases (数据库)**。

1. 选择要查看其日志文件的数据库实例的名称。

1. 选择 **Logs & events (日志和事件)** 选项卡。

1. 向下滚动到**日志**部分。

1. 在**日志**部分中，搜索 `lsinventory`。

1. 选择要访问的文件，然后选择**下载**。

### SQL
<a name="Appendix.Oracle.CommonDBATasks.accessing-opatch-files.sql"></a>

要在 SQL 客户端中读取 `lsinventory-dbv.txt`，您可以使用 `SELECT` 语句。对于此技术，请使用以下任一 `rdsadmin` 函数：`rdsadmin.rds_file_util.read_text_file` 或 `rdsadmin.tracefile_listing`。

在下面的示例查询中，将 *dbv* 替换为您的 Oracle 数据库版本。例如，您的数据库版本可能是 19.0.0.0.ru-2020-04.rur-2020-04.r1。

```
SELECT text
FROM   TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'lsinventory-dbv.txt'));
```

### PL/SQL
<a name="Appendix.Oracle.CommonDBATasks.accessing-opatch-files.plsql"></a>

要在 SQL 客户端中读取 `lsinventory-dbv.txt`，您可以编写 PL/SQL 程序。此程序使用 `utl_file` 读取文件，并使用 `dbms_output` 打印文件。这些是 Oracle 提供的程序包。

在下面的示例程序中，将 *dbv* 替换为您的 Oracle 数据库版本。例如，您的数据库版本可能是 19.0.0.0.ru-2020-04.rur-2020-04.r1。

```
SET SERVEROUTPUT ON
DECLARE
  v_file              SYS.UTL_FILE.FILE_TYPE;
  v_line              VARCHAR2(1000);
  v_oracle_home_type  VARCHAR2(1000);
  c_directory         VARCHAR2(30) := 'BDUMP';
  c_output_file       VARCHAR2(30) := 'lsinventory-dbv.txt';
BEGIN
  v_file := SYS.UTL_FILE.FOPEN(c_directory, c_output_file, 'r');
  LOOP
    BEGIN
      SYS.UTL_FILE.GET_LINE(v_file, v_line,1000);
      DBMS_OUTPUT.PUT_LINE(v_line);
    EXCEPTION
      WHEN no_data_found THEN
        EXIT;
    END;
  END LOOP;
END;
/
```

或者，查询 `rdsadmin.tracefile_listing`，并将输出后台打印到一个文件。以下示例将输出后台打印到 `/tmp/tracefile.txt`。

```
SPOOL /tmp/tracefile.txt
SELECT * 
FROM   rdsadmin.tracefile_listing 
WHERE  FILENAME LIKE 'lsinventory%';
SPOOL OFF;
```

## 管理顾问任务
<a name="Appendix.Oracle.CommonDBATasks.managing-advisor-tasks"></a>

Oracle 数据库中包含许多顾问。每个顾问都支持自动化任务和手动任务。您可以使用 `rdsadmin.rdsadmin_util` 程序包中的过程来管理一些顾问任务。

以下引擎版本中提供了顾问任务过程：
+ Oracle Database 21c (21.0.0)
+ 版本 19.0.0.0.ru-2021-01.rur-2021-01.r1 及更高 Oracle Database 19c 版本 

  有关更多信息，请参阅《Amazon RDS for Oracle 发布说明》中的[版本 19.0.0.0.ru-2021-01.rur-2021-01.r1](https://docs.amazonaws.cn/AmazonRDS/latest/OracleReleaseNotes/oracle-version-19-0.html#oracle-version-RU-RUR.19.0.0.0.ru-2021-01.rur-2021-01.r1)**。

**Topics**
+ [设置顾问任务参数](#Appendix.Oracle.CommonDBATasks.setting-task-parameters)
+ [禁用 AUTO\$1STATS\$1ADVISOR\$1TASK](#Appendix.Oracle.CommonDBATasks.dropping-advisor-task)
+ [重新启用 AUTO\$1STATS\$1ADVISOR\$1TASK](#Appendix.Oracle.CommonDBATasks.recreating-advisor-task)

### 设置顾问任务参数
<a name="Appendix.Oracle.CommonDBATasks.setting-task-parameters"></a>

要为某些顾问任务设置参数，请使用 Amazon RDS 程序 `rdsadmin.rdsadmin_util.advisor_task_set_parameter`。`advisor_task_set_parameter` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_task_name`  |  varchar2  |  —  |  是  |  要更改其参数的顾问任务的名称。有效值有： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/Appendix.Oracle.CommonDBATasks.Misc.html)  | 
|  `p_parameter`  |  varchar2  |  —  |  是  |  任务参数的名称。要查找顾问任务的有效参数，请运行以下查询。将 *p\$1task\$1name* 替换为 `p_task_name` 的有效值： <pre>COL PARAMETER_NAME FORMAT a30<br />COL PARAMETER_VALUE FORMAT a30<br />SELECT PARAMETER_NAME, PARAMETER_VALUE<br />FROM DBA_ADVISOR_PARAMETERS<br />WHERE TASK_NAME='p_task_name'<br />AND PARAMETER_VALUE != 'UNUSED'<br />ORDER BY PARAMETER_NAME;</pre>  | 
|  `p_value`  |  varchar2  |  —  |  是  |  任务参数的值。要查找任务参数的有效值，请运行以下查询。将 *p\$1task\$1name* 替换为 `p_task_name` 的有效值： <pre>COL PARAMETER_NAME FORMAT a30<br />COL PARAMETER_VALUE FORMAT a30<br />SELECT PARAMETER_NAME, PARAMETER_VALUE<br />FROM DBA_ADVISOR_PARAMETERS<br />WHERE TASK_NAME='p_task_name'<br />AND PARAMETER_VALUE != 'UNUSED'<br />ORDER BY PARAMETER_NAME;</pre>  | 

对于 `ACCEPT_PLANS`，以下 PL/SQL 程序可将 `FALSE` 设置为 `SYS_AUTO_SPM_EVOLVE_TASK`。SQL Plan Management 自动化任务可验证计划并生成其调查结果的报告，但不会自动发展计划。您可以使用报告来识别新的 SQL 计划基准并手动接受它们。

```
BEGIN 
  rdsadmin.rdsadmin_util.advisor_task_set_parameter(
    p_task_name => 'SYS_AUTO_SPM_EVOLVE_TASK',
    p_parameter => 'ACCEPT_PLANS',
    p_value     => 'FALSE');
END;
```

对于 `EXECUTION_DAYS_TO_EXPIRE`，以下 PL/SQL 程序可将 `10` 设置为 `AUTO_STATS_ADVISOR_TASK`。预定义的任务 `AUTO_STATS_ADVISOR_TASK` 每天在维护时段自动运行一次。该示例将任务执行的保留周期设置为 10 天。

```
BEGIN 
  rdsadmin.rdsadmin_util.advisor_task_set_parameter(
    p_task_name => 'AUTO_STATS_ADVISOR_TASK',
    p_parameter => 'EXECUTION_DAYS_TO_EXPIRE',
    p_value     => '10');
END;
```

### 禁用 AUTO\$1STATS\$1ADVISOR\$1TASK
<a name="Appendix.Oracle.CommonDBATasks.dropping-advisor-task"></a>

要禁用 `AUTO_STATS_ADVISOR_TASK`，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.advisor_task_drop`。`advisor_task_drop` 过程接受以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_task_name`  |  varchar2  |  —  |  是  |  要禁用的顾问任务的名称。唯一有效值为 `AUTO_STATS_ADVISOR_TASK`。  | 

以下命令可删除 `AUTO_STATS_ADVISOR_TASK`。

```
EXEC rdsadmin.rdsadmin_util.advisor_task_drop('AUTO_STATS_ADVISOR_TASK')
```

您可以使用 `rdsadmin.rdsadmin_util.dbms_stats_init` 重新启用 `AUTO_STATS_ADVISOR_TASK`。

### 重新启用 AUTO\$1STATS\$1ADVISOR\$1TASK
<a name="Appendix.Oracle.CommonDBATasks.recreating-advisor-task"></a>

要重新启用 `AUTO_STATS_ADVISOR_TASK`，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.dbms_stats_init`。`dbms_stats_init` 过程不需要任何参数。

以下命令可重新启用 `AUTO_STATS_ADVISOR_TASK`。

```
EXEC rdsadmin.rdsadmin_util.dbms_stats_init()
```