在专用 Exadata 基础结构上的自治 AI 数据库上使用 SQL 跟踪

您可以将 SQL 跟踪与专用 Exadata 基础结构上的自治 AI 数据库结合使用,以帮助您确定过多数据库工作负载的来源,例如应用中的高负载 SQL 语句。

关于 SQL 跟踪

当应用程序操作花费的时间比预期长时,获取在此操作过程中执行的所有 SQL 语句的跟踪信息,以及该 SQL 语句在语法分析、执行和提取阶段花费的时间等详细信息,将有助于您确定和解决性能问题的原因。您可以在自治 AI 数据库上使用 SQL 跟踪来实现此目的。

在自治 AI 数据库中,SQL 跟踪默认处于禁用状态。您必须启用它才能开始收集 SQL 跟踪数据。要跟踪 SQL 语句,请以 ADMIN 用户身份执行以下任务:

在自治 AI 数据库上配置 SQL 跟踪

要为自治 AI 数据库配置 SQL 跟踪,请执行以下操作:

  1. 创建存储桶以在云对象存储中存储跟踪文件。

    要保存 SQL 跟踪文件,存储桶可以位于自治 AI 数据库支持的任何云对象存储中。例如,要在 Oracle Cloud Infrastructure Object Storage 中创建存储桶,请参阅创建存储桶

    提示:在 Oracle Cloud Infrastructure Object Storage 中创建存储桶时,请确保选择标准作为存储层,因为仅在标准存储层中创建的存储桶支持 SQL 跟踪文件。有关标准对象存储层的信息,请参阅了解存储层

  2. 使用 DBMS_CLOUD.CREATE_CREDENTIAL 为您的云对象存储账户创建身份证明。

    例如:

     BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL(
         credential_name => 'DEF_CRED_NAME',
         username => 'adb_user@example.com',
         password => 'password'
     );END;
     /
    

    有关不同对象存储服务的 usernamepassword 参数的参数的详细信息,请参见 CREATE_CREDENTIAL Procedure

  3. 设置初始化参数以指定用于 SQL 跟踪文件的存储桶的云对象存储 URL,并指定用于访问云对象存储的身份证明。

    1. 设置数据库属性 DEFAULT_LOGGING_BUCKET 以指定云对象存储上的日志记录存储桶。

      例如,如果您使用 Oracle Cloud Infrastructure (OCI) 对象存储创建存储桶:

       SET DEFINE OFF;
       ALTER DATABASE PROPERTY SET
          DEFAULT_LOGGING_BUCKET = 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/namespace-string/b/bucket_name/o/';
      

      其中 namespace-string 是 OCI 对象存储名称空间,bucket_name 是您之前创建的存储桶的名称。有关详细信息,请参阅了解对象存储名称空间

      有关区域列表,请参见 Regions and Availability Domain

      用于 SQL 跟踪文件的云对象存储可以是自治 AI 数据库支持的任何云对象存储。

    2. 将数据库属性 DEFAULT_CREDENTIAL 设置为在步骤 2 中创建的身份证明。

      例如:

       ALTER DATABASE PROPERTY SET DEFAULT_CREDENTIAL = 'ADMIN.DEF_CRED_NAME';
      

      需要包括具有身份证明的方案名称。在此示例中,方案为 ADMIN

在自治 AI 数据库上启用 SQL 跟踪

注:启用 SQL 跟踪可能会降低启用跟踪收集时的会话应用程序性能。由于收集和保存跟踪数据的开销,预计会产生这种性能影响。

要为数据库会话启用 SQL 跟踪,请执行以下操作:

  1. (可选)为应用程序设置客户机标识符。此步骤是可选的,但建议使用此步骤。将跟踪文件写入云对象存储时,SQL 跟踪使用客户机标识符作为跟踪文件名的组件。

    例如:

     BEGIN
       DBMS_SESSION.SET_IDENTIFIER('sqlt_test');
     END;
     /
    
  2. (可选)为应用程序设置模块名称。此步骤是可选的,但建议使用此步骤。将跟踪文件写入云对象存储时,SQL 跟踪使用模块名称作为跟踪文件名的组件。

    例如:

     BEGIN
       DBMS_APPLICATION_INFO.SET_MODULE('modname', null);
     END;
     /
    
  3. 启用 SQL Trace 工具。

     ALTER SESSION SET SQL_TRACE = TRUE;
    
  4. 运行工作量。

    此步骤涉及运行整个应用程序或应用程序的特定部分。在数据库会话中运行工作量时,将收集 SQL 跟踪数据。

  5. 禁用“SQL 跟踪”。

    禁用 SQL 跟踪时,会话收集的数据将写入会话中的表以及设置 SQL 跟踪时配置的存储桶中的跟踪文件。

禁用 SQL 追踪

要禁用 SQL 跟踪,请执行以下操作:

  1. 禁用 SQL Trace 工具。

     ALTER SESSION SET SQL_TRACE = FALSE;
    
  2. (可选)根据您的环境需要,您可能需要重置数据库属性 DEFAULT_LOGGING_BUCKET 以清除云对象存储上日志记录存储桶的值。

    例如:

     ALTER DATABASE PROPERTY SET DEFAULT_LOGGING_BUCKET = '';
    

禁用 SQL 跟踪时,在启用跟踪的情况下运行会话时收集的跟踪数据将复制到表,并发送到云对象存储上的跟踪文件。

在自治 AI 数据库上查看保存到云对象存储的跟踪文件

您可以使用 SQL 跟踪文件数据来分析自治 AI 数据库上的应用性能。在数据库会话中禁用 SQL 跟踪时,数据将写入配置有 DEFAULT_LOGGING_BUCKET 的云对象存储存储桶。

SQL Trace 工具按以下格式将会话中收集的跟踪数据写入云对象存储:

default_logging_bucket/sqltrace/clientID/moduleName/sqltrace_numID1_numID2.trc

文件名的组成部分包括:

例如,将客户机标识符设置为 "sql_test",将模块名称设置为 "modname" 时,以下是生成的跟踪文件名样例:

sqltrace/sqlt_test/modname/sqltrace_5415_56432.trc

可以运行 TKPROF 将跟踪文件转换为可读输出文件。

  1. 将跟踪文件从对象存储复制到本地系统。

  2. 导航到保存跟踪文件的目录。

  3. 使用以下语法从操作系统提示符运行 TKPROF 实用程序:

     tkprof filename1 filename2 [waits=yes|no] [sort=option] [print=n]
      [aggregate=yes|no] [insert=filename3] [sys=yes|no] [table=schema.table]
      [explain=user/password] [record=filename4] [width=n]
    

    输入和输出文件是唯一的必需参数。

  4. 要查看联机帮助,请调用不带参数的 TKPROF

    有关使用 TKPROF 实用程序的信息,请参阅 Oracle Database 19c SQL Tuning GuideOracle Database 26ai SQL Tuning Guide 中的 Tools for End-to-End Application Tracing

在自治 AI 数据库上的 SESSION_CLOUD_TRACE 视图中查看跟踪数据

启用 SQL 跟踪时,在启用了跟踪的会话的 SESSION_CLOUD_TRACE 视图中会提供保存到云对象存储上的跟踪文件的相同跟踪信息。

仍在数据库会话中时,可以在 SESSION_CLOUD_TRACE 视图中查看 SQL 跟踪数据。SESSION_CLOUD_TRACE 视图包含两列:ROW_NUMBERTRACE

DESC SESSION_CLOUD_TRACE

Name       Null? Type
---------- ----- ------------------------------
ROW_NUMBER       NUMBER
TRACE            VARCHAR2(32767)

ROW_NUMBER 指定在 TRACE 列中找到的跟踪数据的排序。写入跟踪文件的每一行跟踪输出将成为表中的一行,可在 TRACE 列中找到。

对会话禁用 SQL 跟踪后,可以对 SESSION_CLOUD_TRACE 视图运行查询。

例如:

SELECT trace FROM SESSION_CLOUD_TRACE ORDERBY row_number;

SESSION_CLOUD_TRACE 中的数据在会话期间持续存在。注销或关闭会话后,数据将不再可用。

如果在同一会话中多次启用和禁用 SQL Trace,则 SESSION_CLOUD_TRACE 会累计显示所有迭代的跟踪数据。因此,在之前禁用跟踪之后在会话中重新启用跟踪不会删除由早期迭代生成的跟踪数据。