---
title: OceanBase 数据库 Oracle 模式下的安全审计-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 OceanBase 数据库 Oracle 模式下的安全审计相关的常见问题和使用技巧，帮助您快速解决 OceanBase 数据库 Oracle 模式下的安全审计的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# OceanBase 数据库 Oracle 模式下的安全审计

更新时间：2026-05-09 09:36

适用版本： V4.2.x 内容类型：TechNote  

本文介绍 OceanBase 数据库 Oracle 模式安全审计的简单应用实例，更多信息详见 [安全审计概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218270)。

## 安全审计概述

目前 OceanBase 数据库仅 Oracle 模式支持安全审计功能。

## 检查安全审计状态

1. 通过 `SYS` 用户登录到 Oracle 租户。

   ```shell
   #obclient -h${DB_HOST} -P2883 -uSYS@oboracle#obcluster -A -p${DB_PASSWORD}
   Welcome to the OceanBase.  Commands end with ; or \g.
   Your OceanBase connection id is 3221584773
   Server version: OceanBase 4.2.2.0 (r100000032024010510-75c47d4be18a399e13c5309de1a81da5caf4e7c0) (Built Jan  5 2024 10:17:55)

   Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.

   Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

   ```
 2. 查看用户 `ORAAUDITOR` 的账户状态。

   ```shell
   obclient [SYS]> SELECT username, account_status FROM dba_users WHERE username = 'ORAAUDITOR';

   ```

   输出结果如下：

   ```shell
   +------------+----------------+
   | USERNAME   | ACCOUNT_STATUS |
   +------------+----------------+
   | ORAAUDITOR | LOCKED         |
   +------------+----------------+
   1 row in set (0.051 sec)

   ```
 3. 查看租户所在所有 OBServer 节点上的配置项 `audit_trail` 信息。

   ```shell
   obclient [SYS]> SELECT
        zone,
        scope,
        tenant_id,
        name,
        value,
        section,
        edit_level
        FROM gv$ob_parameters
        WHERE name = 'audit_trail';

   ```

   输出结果如下：

   ```shell
   +-------+--------+-----------+-------------+-------+----------+-------------------+
   | ZONE  | SCOPE  | TENANT_ID | NAME        | VALUE | SECTION  | EDIT_LEVEL        |
   +-------+--------+-----------+-------------+-------+----------+-------------------+
   | zone1 | TENANT |      1004 | audit_trail | None  | OBSERVER | DYNAMIC_EFFECTIVE |
   +-------+--------+-----------+-------------+-------+----------+-------------------+
   1 row in set (0.044 sec)

   ```

   #### 说明

      - `ORAAUDITOR` 用户默认处于锁定状态，在使用审计前需要启用该用户。
      - `audit_trail` 默认为 `None`，不启用数据库审核。

## 开启安全审计

1. 通过 `SYS` 用户登录到 Oracle 租户。

   ```
 2. 解锁 `ORAAUDITOR` 用户。

   ```shell
   obclient [SYS]> ALTER USER ORAAUDITOR ACCOUNT UNLOCK;
   Query OK, 0 rows affected (0.061 sec)

   ```
 3. 修改 `ORAAUDITOR` 用户的登录密码。

   ```shell
   obclient [SYS]> ALTER USER ORAAUDITOR IDENTIFIED BY xxx;
   Query OK, 0 rows affected (0.059 sec)

   ```
 4. 授予 `ORAAUDITOR` 用户，创建会话和访问所有视图的权限。

   ```shell
   obclient [SYS]> GRANT CREATE SESSION, SELECT ANY DICTIONARY TO ORAAUDITOR;
   Query OK, 0 rows affected (0.060 sec)

   ```
 5. 开启安全审计功能。

   ```shell
   obclient [SYS]> ALTER SYSTEM SET audit_trail = 'DB,EXTENDED';
   Query OK, 0 rows affected (0.041 sec)

   ```

   通过配置项 `audit_trail` 开启审计功能，执行成功后立即生效。该配置项的取值如下：

   #### 说明

      - `NONE`：关闭审计。
      - `OS`：审计记录写本地文件。
      - `DB`：审计记录写内部表。
      - `DB,EXTENDED`：审计记录写内部表且记录包含执行的 SQL 语句。  

   管理员用户拥有最高权限，能执行很多操作，所以针对管理员有单独配置审计。租户配置项 `audit_sys_operations` 决定是否对管理员的操作进行审计记录。
 6. 确定用户 `ORAAUDITOR` 的账户状态是否已开通。

   ```

   输出结果如下：

   ```shell
   +------------+----------------+
   | USERNAME   | ACCOUNT_STATUS |
   +------------+----------------+
   | ORAAUDITOR | OPEN           |
   +------------+----------------+
   1 row in set (0.008 sec)

   ```
 7. 查看租户所在所有 OBServer 节点上的配置项 `audit_trail` 信息。

   ```

   输出结果如下：

   ```shell
   +-------+--------+-----------+-------------+-------------+----------+-------------------+
   | ZONE  | SCOPE  | TENANT_ID | NAME        | VALUE       | SECTION  | EDIT_LEVEL        |
   +-------+--------+-----------+-------------+-------------+----------+-------------------+
   | zone1 | TENANT |      1004 | audit_trail | DB,EXTENDED | OBSERVER | DYNAMIC_EFFECTIVE |
   +-------+--------+-----------+-------------+-------------+----------+-------------------+
   1 row in set (0.035 sec)

   ```

## 设置审计规则

通过内置的审计管理用户 `ORAAUDITOR` 可以配置审计规则，包括：

- 语句审计：对特定的操作进行审计，不指定具体对象，可以指定对具体用户或对所有用户生效。
 - 对象审计：对特定的对象上执行的特定操作进行审计，可以指定对具体用户或对所有用户生效。

审计规则是通过 DDL 语句 `audit/noaudit` 语句来配置，审计规则也是一种 `schema` 对象。

## 审计用户登录

1. 通过 `SYS` 用户登录到 Oracle 租户。

   ```
 2. 创建 `ALVIN` 和 `TOM` 用户。

   ```shell
   obclient [SYS]> CREATE USER ALVIN identified by "xxx";
   Query OK, 0 rows affected (0.064 sec)

   ```

   ```shell
   obclient [SYS]> CREATE USER TOM identified by "xxxxx";
   Query OK, 0 rows affected (0.051 sec)

   ```
 3. 设置 `ALVIN` 和 `TOM` 用户的权限。

   ```shell
   obclient [SYS]> GRANT dba TO ALVIN;
   Query OK, 0 rows affected (0.048 sec)

   ```

   ```shell
   obclient [SYS]> GRANT dba TO TOM;
   Query OK, 0 rows affected (0.060 sec)

   ```
 4. 通过 `ALVIN` 用户登录到 Oracle 租户。

   ```shell
   #obclient -h${DB_HOST} -P2883 -uALVIN@oboracle#obcluster -A -p${DB_PASSWORD}
   Welcome to the OceanBase.  Commands end with ; or \g.
   Your OceanBase connection id is 3221584773
   Server version: OceanBase 4.2.2.0 (r100000032024010510-75c47d4be18a399e13c5309de1a81da5caf4e7c0) (Built Jan  5 2024 10:17:55)

   ```
 5. 在 `ALVIN` 用户中创建 `test` 表。

   ```shell
   obclient [ALVIN]> CREATE TABLE test(n1 INT, d1 DATE DEFAULT sysdate);
   Query OK, 0 rows affected (0.142 sec)

   ```
 6. 通过 `ORAAUDITOR` 用户登录到 Oracle 租户。

   ```shell
   #obclient -h${DB_HOST} -P2883 -uORAAUDITOR@oboracle#obcluster -A -p${DB_PASSWORD}
   Welcome to the OceanBase.  Commands end with ; or \g.
   Your OceanBase connection id is 3221584773
   Server version: OceanBase 4.2.2.0 (r100000032024010510-75c47d4be18a399e13c5309de1a81da5caf4e7c0) (Built Jan  5 2024 10:17:55)

   ```
 7. 审计 `ALVIN` 用户的登录。

   ```shell
   obclient [ORAAUDITOR]> AUDIT SESSION BY ALVIN;
   Query OK, 0 rows affected (0.071 sec)

   ```
 8. 通过 `ALVIN` 用户登录到 Oracle 租户并退出登录。

   obclient [ALVIN]> exit
   Bye

   ```
 9. 使用有权限查询 `dba_audit_trail` 的用户 (e.g. `ORAAUDITOR`) 都可登录查询审计记录。

      1. 在会话级别设置 `nls_date_format` 日期格式。

        ```shell
        obclient [ORAAUDITOR]> ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS';
        Query OK, 0 rows affected (0.040 sec)

        ```
      2. 查询审计记录。

        ```shell
        obclient [ORAAUDITOR]> SELECT
            sessionid,
            username,
            action_name,
            TIMESTAMP,
            returncode,sql_text FROM (SELECT * FROM dba_audit_trail ORDER BY timestamp DESC) WHERE ROWNUM <= 10;

        ```

        输出结果如下：

        ```shell
        +------------+----------+-------------+---------------------+------------+------------+
        | SESSIONID  | USERNAME | ACTION_NAME | TIMESTAMP           | RETURNCODE | SQL_TEXT   |
        +------------+----------+-------------+---------------------+------------+------------+
        | 3221562787 | ALVIN    | LOGOFF      | 2024-04-09 16:04:16 |          0 | DISCONNECT |
        | 3221562787 | ALVIN    | LOGON       | 2024-04-09 16:04:09 |          0 | CONNECT    |
        +------------+----------+-------------+---------------------+------------+------------+
        2 rows in set (0.019 sec)

        ```

## 查看审计规则

使用有权限查询 `dba_stmt_audit_opts` ，`dba_obj_audit_opts` 的用户 (e.g. `ORAAUDITOR`) 登录并查看审计规则。

- 查看语句级别审计的详细配置。

  ```shell
  obclient [ORAAUDITOR]> SELECT * FROM dba_stmt_audit_opts;

  ```

  输出结果如下：

  ```shell
  +-----------+------------+--------------+-----------+-----------+
  | USER_NAME | PROXY_NAME | AUDIT_OPTION | SUCCESS   | FAILURE   |
  +-----------+------------+--------------+-----------+-----------+
  | ALVIN     | NULL       | SESSION      | BY ACCESS | BY ACCESS |
  | NULL      | NULL       | SESSION      | BY ACCESS | BY ACCESS |
  +-----------+------------+--------------+-----------+-----------+
  2 rows in set (0.057 sec)

  ```
 - 查看对象级别审计的详细配置。

  ```shell
  obclient [ORAAUDITOR]> SELECT
        owner,
        object_name,
        object_type,
        ins,
        del,
        upd FROM dba_obj_audit_opts;

  ```

  输出结果如下：

  ```shell
  +-------+-------------+-------------+------+------+------+
  | OWNER | OBJECT_NAME | OBJECT_TYPE | INS  | DEL  | UPD  |
  +-------+-------------+-------------+------+------+------+
  | ALVIN | TEST        | TABLE       | A/A  | A/A  | A/A  |
  +-------+-------------+-------------+------+------+------+
  1 row in set (0.107 sec)

  ```

## 审计对象的操作

以审计所有用户对 `ALVIN.test` 表的操作为例进行审计对象的操作。

1. 通过 `ORAAUDITOR` 用户登录到 Oracle 租户。

   ```
 2. 对用户 `ALVIN` 的表 `test` 的所有 `INSERT`、`UPDATE` 和 `DELETE` 操作进行审计。

   ```shell
   obclient [ORAAUDITOR]> AUDIT INSERT,UPDATE,DELETE ON ALVIN.test;
   Query OK, 0 rows affected (0.103 sec)

   ```
 3. 通过 `ALVIN` 用户登录到 Oracle 租户。

   ```
 4. 在会话级别设置 `nls_date_format` 日期格式。

   ```shell
   obclient [ALVIN]> ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS';
   Query OK, 0 rows affected (0.030 sec)

   ```
 5. 查询 `test` 表的内容。

   ```shell
   obclient [ALVIN]> SELECT * FROM test;
   Empty set (0.033 sec)

   ```
 6. 向 `test` 表插入数据。

   ```shell
   obclient [ALVIN]> INSERT INTO test(n1) VALUES(2);
   Query OK, 1 row affected (0.038 sec)

   ```
 7. 提交当前事务。

   ```shell
   obclient [ALVIN]> COMMIT;
   Query OK, 0 rows affected (0.030 sec)

   ```
 8. 再次查询 `test` 表的内容。

   ```shell
   obclient [ALVIN]> SELECT * FROM test;

   ```

   输出结果如下：

   ```shell
   +------+---------------------+
   | N1   | D1                  |
   +------+---------------------+
   |    2 | 2024-04-09 16:10:17 |
   +------+---------------------+
   1 row in set (0.030 sec)

   ```
 9. 再次向 `test` 表插入数据。

   ```shell
   obclient [ALVIN]> INSERT INTO test(n1) VALUES(3);
   Query OK, 1 row affected (0.031 sec)

   ```
 10. 第三次查询 `test` 表的内容。

    ```

    输出结果如下：

    ```shell
    +------+---------------------+
    | N1   | D1                  |
    +------+---------------------+
    |    2 | 2024-04-09 16:10:17 |
    |    3 | 2024-04-09 16:10:46 |
    +------+---------------------+
    2 rows in set (0.030 sec)

    ```
 11. 回滚当前事务。

    ```shell
    obclient [ALVIN]> ROLLBACK;
    Query OK, 0 rows affected (0.030 sec)

    ```
 12. 第四次查询 `test` 表的内容。

    ```

    输出结果如下：

    ```
 13. 删除 `test` 表的内容。

    ```shell
    obclient [ALVIN]> DELETE FROM test WHERE n1=2;
    Query OK, 1 row affected (0.033 sec)

    ```
 14. 回滚当前事务。

    ```
 15. 通过 `ORAAUDITOR` 用户登录到 Oracle 租户

    ```
 16. 使用有权限查询 `dba_audit_trail` 的用户 (e.g. `ORAAUDITOR`) 都可登录查询审计记录。

    ```

    输出结果如下：

    ```shell
    +------------+------------+-------------+---------------------+------------+--------------------------------+
    | SESSIONID  | USERNAME   | ACTION_NAME | TIMESTAMP           | RETURNCODE | SQL_TEXT                       |
    +------------+------------+-------------+---------------------+------------+--------------------------------+
    | 3221607315 | ALVIN      | LOGOFF      | 2024-04-09 16:12:04 |          0 | DISCONNECT                     |
    | 3221607315 | ALVIN      | DELETE      | 2024-04-09 16:11:43 |          0 | DELETE FROM test WHERE n1=2    |
    | 3221607315 | ALVIN      | INSERT      | 2024-04-09 16:10:46 |          0 | INSERT INTO test(n1) VALUES(3) |
    | 3221607315 | ALVIN      | INSERT      | 2024-04-09 16:10:17 |          0 | INSERT INTO test(n1) VALUES(2) |
    | 3221607315 | ALVIN      | LOGON       | 2024-04-09 16:09:49 |          0 | CONNECT                        |
    | 3221594946 | ALVIN      | LOGOFF      | 2024-04-09 16:08:42 |          0 | DISCONNECT                     |
    | 3221594946 | ALVIN      | LOGON       | 2024-04-09 16:08:03 |          0 | CONNECT                        |
    +------------+------------+-------------+---------------------+------------+--------------------------------+
    7 rows in set (0.028 sec)

    ```
 17. 通过 `TOM` 用户登录到 Oracle 租户。

    ```shell
    #obclient -h${DB_HOST} -P2883 -uTOM@oboracle#obcluster -A -p${DB_PASSWORD}
    Welcome to the OceanBase.  Commands end with ; or \g.
    Your OceanBase connection id is 3221584773
    Server version: OceanBase 4.2.2.0 (r100000032024010510-75c47d4be18a399e13c5309de1a81da5caf4e7c0) (Built Jan  5 2024 10:17:55)

    ```
 18. 在会话级别设置 `nls_date_format` 日期格式。\

    ```shell
    obclient [TOM]> ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS';
    Query OK, 0 rows affected (0.039 sec)

    ```
 19. 在 `TOM` 用户下，查询 `ALVIN` 用户中的 `test` 表的内容。

    ```shell
    obclient [TOM]>  SELECT * FROM ALVIN.test;

    ```

    输出结果如下：

    ```shell
    +------+---------------------+
     N1   | D1                  |
    +------+---------------------+
    |    2 | 2024-04-09 16:10:17 |
    +------+---------------------+
    1 row in set (0.041 sec)

    ```
 20. 在 `TOM` 用户下，向 `ALVIN` 用户中的 `test` 表插入数据。

    ```shell
    obclient [TOM]> INSERT INTO alvin.test(n1) VALUES(9);
    Query OK, 1 row affected (0.041 sec)

    ```
 21. 在 `TOM` 用户下，提交当前事务。

    ```shell
    obclient [TOM]> commit;
    Query OK, 0 rows affected (0.040 sec)

    ```
 22. 退出 `TOM` 用户。

    ```shell
    obclient [TOM]> exit
    Bye

    ```
 23. 通过 `ORAAUDITOR` 用户登录到 Oracle 租户

    ```
 24. 使用有权限查询 `dba_audit_trail` 的用户 (e.g. `ORAAUDITOR`) 登录，可以查询到 `TOM` 用户对 `ALVIN` 用户下的 `test` 表的操作记录。

         ```shell
         obclient [ORAAUDITOR]> ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS';
         Query OK, 0 rows affected (0.038 sec)

    ```

    输出结果如下：

    ```shell
    +------------+------------+-------------+---------------------+------------+--------------------------------------+
    | SESSIONID  | USERNAME   | ACTION_NAME | TIMESTAMP           | RETURNCODE | SQL_TEXT                             |
    +------------+------------+-------------+---------------------+------------+--------------------------------------+
    | 3221654755 | TOM        | LOGOFF      | 2024-04-09 16:17:24 |          0 | DISCONNECT                           |
    | 3221654755 | TOM        | INSERT      | 2024-04-09 16:17:03 |          0 | INSERT INTO alvin.test(n1) VALUES(9) |
    | 3221654755 | TOM        | LOGON       | 2024-04-09 16:16:34 |          0 | CONNECT                              |
    | 3221607315 | ALVIN      | LOGOFF      | 2024-04-09 16:12:04 |          0 | DISCONNECT                           |
    | 3221607315 | ALVIN      | DELETE      | 2024-04-09 16:11:43 |          0 | DELETE FROM test WHERE n1=2          |
    +------------+------------+-------------+---------------------+------------+--------------------------------------+
    5 rows in set (0.039 sec)

    ```

## 适用版本

OceanBase 数据库 V4.2.x 版本。

上一篇

[MySQL 租户执行细分到列的授权失败](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000207670)

下一篇

[如何限制用户访问的地址段](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000000119) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
