在专用 Exadata 基础结构上的 Autonomous Database 上使用 SQL 跟踪

您可以将 SQL 跟踪与 Autonomous Database on Dedicated Exadata Infrastructure 一起使用,以帮助您确定过度数据库工作负载的来源,例如应用中的高负载 SQL 语句。

关于 SQL 跟踪

当应用程序操作花费的时间比预期的要长时,获取在此操作过程中执行的所有 SQL 语句的跟踪以及详细信息(例如,该 SQL 语句在语法分析、执行和提取阶段所花费的时间)将帮助您确定并解决性能问题的原因。您可以在 an Autonomous Database 上使用 SQL 跟踪来实现此目的。

默认情况下,在 Autonomous Database 中禁用 SQL 跟踪。必须启用它才能开始收集 SQL 跟踪数据。要跟踪 SQL 语句,请以 ADMIN 用户身份实施以下任务:

Autonomous Database 上配置 SQL 跟踪

要为 Autonomous Database 配置 SQL 跟踪,请执行以下操作:
  1. 创建存储桶以在云对象存储中存储跟踪文件。
    要保存 SQL 跟踪文件,存储桶可以位于 Autonomous Database 支持的任何云对象存储中。例如,要在 Oracle Cloud Infrastructure Object Storage 中创建存储桶,请参阅创建存储桶

    提示:

    在 Oracle Cloud Infrastructure Object Storage 中创建存储桶时,请确保选择标准作为存储层,因为 SQL 跟踪文件仅支持在标准存储层中创建的存储桶。有关标准对象存储层的信息,请参见 Understanding Storage Tiers
  2. 使用 DBMS_CLOUD.CREATE_CREDENTIAL 为 Cloud Object Storage 账户创建身份证明。
    例如:
    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) Object Storage 创建存储桶:
      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 是以前创建的存储桶的名称。有关更多信息,请参见 Understanding Object Storage Namespaces

      有关区域列表,请参阅区域和可用性域

      用于 SQL 跟踪文件的云对象存储可以是 Autonomous Database 支持的任何云对象存储。

    2. 将数据库属性 DEFAULT_CREDENTIAL 设置为在步骤 2 中创建的身份证明。
      例如:
      ALTER DATABASE PROPERTY SET DEFAULT_CREDENTIAL = 'ADMIN.DEF_CRED_NAME';

      需要在身份证明中包含方案名。在此示例中,方案为 ADMIN

Autonomous Database 上启用 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 跟踪时,在启用了跟踪的情况下运行会话时收集的跟踪数据将复制到表并发送到云对象存储上的跟踪文件。

Autonomous Database 上查看保存到云对象存储的跟踪文件

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

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

default_logging_bucket/sqltrace/clientID/moduleName/sqltrace_numID1_numID2.trc

文件名的组件有:

  • default_logging_bucketDEFAULT_LOGGING_BUCKET 数据库属性的值。有关详细信息,请参阅在 Autonomous Database 上配置 SQL 跟踪

  • clientID:是客户机标识符。有关详细信息,请参阅在 Autonomous Database 上启用 SQL 跟踪

  • moduleName:是模块名称。有关详细信息,请参阅在 Autonomous Database 上启用 SQL 跟踪

  • numID1_numID2:是 SQL 跟踪工具提供的两个标识符。numID1numID2 数值使用在云对象存储的同一存储桶中跟踪和创建跟踪文件,可唯一地区分每个跟踪文件名与其他会话。

    当数据库服务支持并行操作并且会话运行并行查询时,SQL 跟踪工具可以生成多个具有不同 numID1numID2 值的跟踪文件。

注意:

如果在同一会话中多次启用和禁用 SQL 跟踪,则每次跟踪迭代都会在云对象存储中生成单独的跟踪文件。为了避免覆盖会话中生成的先前跟踪,随后生成的文件遵循相同的命名约定,并向跟踪文件名添加数字后缀。此数字后缀以数字 1 开头,并在此后每次跟踪迭代时递增 1。

例如,以下是将客户机标识符设置为 "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 23ai SQL Tuning Guide 中的 Tools for End-to-End Application Tracing

Autonomous Database 上的 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 跟踪,则 SESSION_CLOUD_TRACE 会累计显示所有迭代的跟踪数据。因此,在之前禁用跟踪之后在会话中重新启用跟踪不会删除早期迭代生成的跟踪数据。