Oralce数据导入问题处理(SYSTEM.PROC_AUDIT与审计)

本文解决了一个特定的Oracle数据库问题:当从一个开启了审计的数据库导出数据并导入到另一个未开启审计的数据库时遇到的ORA-06550错误。详细步骤包括调整审计设置、授权SYSTEM.PROC_AUDIT对象及修复存储过程。

将A数据的USERNAME用户的数据导出后,再导入到B数据库中的USERNAME时,在USERNAME用户下在执行表数据查询时出现如下问题:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'SYSTEM.PROC_AUDIT'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

出现这个问题是由于A数据库打开了审计,而导入到B数据库时,B数据库审计没有打开,数据库中没有SYSTEM.PROC_AUDIT对象,导致上述问题.
问题解决过程如下:
1)以sysdba登录数据库:

D:\Users\Administrator>sqlplus / as sysdba
2) 显示当前审计参数:
SQL> show parameter audit;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string J:\APP\ADMINISTRATOR\ADMIN\ORC
L\ADUMP
audit_sys_operations boolean FALSE
audit_trail string DB
3) 启用审计.
SQL> alter system set audit_sys_operations=TRUE scope=spfile;

系统已更改。
4)查看新的状态,还是显示审计操作没打开,需重新启动数据库:
SQL> show parameter audit;

NAME TYPE VALUE
------------------------------------ ----------- --------------------------
audit_file_dest string J:\APP\ADMINISTRATOR\ADMIN
L\ADUMP
audit_sys_operations boolean FALSE
audit_trail string DB
5)重启数据库
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 3056513024 bytes
Fixed Size 2179656 bytes
Variable Size 1644170680 bytes
Database Buffers 1392508928 bytes
Redo Buffers 17653760 bytes
数据库装载完毕。
数据库已经打开。
6)重新查看审计状态,审计已打开.
SQL> show parameter audit;

NAME TYPE VALUE
------------------------------------ ----------- --------------------------
audit_file_dest string J:\APP\ADMINISTRATOR\ADMIN
L\ADUMP
audit_sys_operations boolean TRUE
audit_trail string DB
SQL> conn USERNAME/PWDXXXXXX;
已连接。
7)查询表数据,错误依然,但错误换成了SYSTEM.PROC_AUDIT无效:
SQL> select * from corporationhot;
select * from corporationhot
*
第 1 行出现错误:
ORA-06550: 第 1 行, 第 14 列:
PLS-00905: 对象 SYSTEM.PROC_AUDIT 无效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
8)将对象SYSTEM.PROC_AUDIT授权给USERNAME.
SQL> grant execute on SYSTEM.PROC_AUDIT TO USERNAME;

授权成功。
9)再次以USERNAME登录,执行数据表查询,提示对象 SYSTEM.PROC_AUDIT 无效;因为对象已经授权,出现
这种状况可能是对象有错误.
SQL> conn USERNAME/PWDXXXXXX;
已连接。
SQL> select * from TABLENAME;
select * from TABLENAME *
第 1 行出现错误:
ORA-06550: 第 1 行, 第 14 列:
PLS-00905: 对象 SYSTEM.PROC_AUDIT 无效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

10) 找到SYSTEM.PROC_AUDIT存储过程,发现有编译错误,提示sys.v_$sql,v$sql_bind_capture,sys.v_$session为无
效标识符,由于上述对象是存在的,而且可以查询,因此怀疑是权限设置问题,做如下授权:

SQL> conn / as sysdba;
已连接。
SQL> grant all on sys.v_$sql to system
2 ;

授权成功。

SQL> grant all on v$sql_bind_capture to system;

授权成功。

SQL> grant all on sys.v_$session to system;

授权成功。

11)SYSTEM.PROC_AUDIT编译通过后,以USERNAME登录数据库,查看表数据恢复正常,问题解决.
为了验证错误是不是导出时审计是开的,导入时审计未打开所致,重新将审计关闭:

SQL> alter system set audit_sys_operations=FALSE scope=spfile;

系统已更改。

SQL> restart;
SP2-0042: 未知命令 "restart" - 其余行忽略。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。

Total System Global Area 3056513024 bytes
Fixed Size 2179656 bytes
Variable Size 1644170680 bytes
Database Buffers 1392508928 bytes
Redo Buffers 17653760 bytes
数据库装载完毕。
数据库已经打开。
12)数据库重启后,以USERNAME用户登录查询数据正常.

PS:如果你不需要审计,一个更简单的方法就是用System用户自己创建一个什么都不做的PROC_AUDIT存储过程,把权限赋给需要的用户即可.

<think>好的,我现在需要分析用户提供的代码片段,并理解他们的问题。用户之前讨论了AI推理中的缓冲区管理,特别是双目模式下缓冲区的独立分配问题。现在用户给出了一段配置`proc_cfg`的代码,并希望得到关于`WORKBUF`的配置是否正确的确认。 首先,我需要仔细阅读用户提供的代码片段,检查每个缓冲区的配置是否正确。用户提到的三个缓冲区:`WORKBUF`、`RONLYBUF`和`INPUTBUF`,但代码中主要配置了`WORKBUF`、`RONLYBUF`和`model_buf`。用户可能想知道他们是否正确地将`WORKBUF`的物理地址、虚拟地址和大小赋值给了`proc_cfg`的相应字段。 接下来,我需要确认代码中的结构是否符合预期。例如,`proc_cfg.proc_mem.buf[AI3_PROC_BUF_WORKBUF]`的配置是否从`p_net->io_mem`获取了正确的值。根据之前的讨论,每个`net_path`应该有独立的内存分配,因此需要确保`p_net`指向当前通道的私有内存结构。 另外,用户可能存在的疑问是,`model_buf`是否应该指向`proc_mem`,而`RONLYBUF`是否正确地使用了`intl_mem`。需要检查这些配置是否硬件或库的要求一致,例如某些库可能要求模型参数存储在特定的缓冲区中。 还需要检查是否有遗漏的配置,比如`INPUTBUF`是否在代码中被正确设置。用户提供的代码片段中没有看到`INPUTBUF`的配置,这可能是一个潜在的问题,尤其是在双目模式下需要独立分配输入缓冲区的情况下。 此外,需要验证各个缓冲区的大小是否足够,地址是否正确映射,避免出现地址冲突或越界访问的情况。例如,`WORKBUF`的大小是否满足模型中间数据的存储需求,`RONLYBUF`是否足够容纳模型参数。 最后,总结用户的问题,可能需要指出代码中的正确部分和需要改进的地方,比如补充`INPUTBUF`的配置,确保所有缓冲区独立分配,并验证地址和大小的正确性。</think>### **1. 配置代码分析** 以下是最终的 `proc_cfg` 缓冲区配置逻辑: ```c // 配置 WORKBUF(绑定当前通道的 io_mem) proc_cfg.proc_mem.buf[AI3_PROC_BUF_WORKBUF].pa = p_net->io_mem.pa; proc_cfg.proc_mem.buf[AI3_PROC_BUF_WORKBUF].va = p_net->io_mem.va; proc_cfg.proc_mem.buf[AI3_PROC_BUF_WORKBUF].size = p_net->io_mem.size; // 配置 model_buf(绑定当前通道的 proc_mem) proc_cfg.model_buf.pa = p_net->proc_mem.pa; proc_cfg.model_buf.va = p_net->proc_mem.va; proc_cfg.model_buf.size = p_net->proc_mem.size; // 配置 RONLYBUF(绑定当前通道的 intl_mem) proc_cfg.proc_mem.buf[AI3_PROC_BUF_RONLYBUF].pa = p_net->intl_mem.pa; proc_cfg.proc_mem.buf[AI3_PROC_BUF_RONLYBUF].va = p_net->intl_mem.va; proc_cfg.proc_mem.buf[AI3_PROC_BUF_RONLYBUF].size = p_net->intl_mem.size; ``` --- ### **2. 关键配置验证** #### **(1) `WORKBUF` 的正确性** - **绑定来源**:`p_net->io_mem` - 通常通过 `network_alloc_io_buf(net_path, size)` 分配,用于存储模型推理的中间数据(如特征图)。 - **验证点**: - **独立性**:`p_net` 指向当前通道(`net_path`)的私有内存,确保双目模式下左右眼通道的 `WORKBUF` 地址不同。 - **地址有效性**:需通过 `mmap()` 或 IOMMU 映射物理地址(`pa`)到虚拟地址(`va`),确保访问权限正确。 #### **(2) `model_buf` 的作用** - **用途**: - 存储模型的 **核心参数**(如权重、结构描述符),可能 `RONLYBUF` 功能重叠。 - 部分硬件要求模型参数中间数据(`WORKBUF`)分离,需根据硬件文档确认是否需要独立分配。 - **潜在问题**: - 若 `model_buf` 和 `RONLYBUF` 指向同一内存,可能导致冲突(如模型加载时覆盖配置数据)。 #### **(3) `RONLYBUF` 的配置** - **绑定来源**:`p_net->intl_mem` - 通常通过 `network_alloc_intl_buf(net_path, size)` 分配,用于存储只读数据(如量化参数、锚框)。 - **验证点**: - **只读性**:需确保硬件或软件逻辑不会修改该缓冲区内容,避免触发写保护异常。 --- ### **3. 遗漏的 `INPUTBUF` 配置** 当前代码未包含 `INPUTBUF` 的绑定逻辑,需补充以下配置(否则可能导致输入数据访问错误): ```c // 补充 INPUTBUF 配置(绑定当前通道的 input_mem) proc_cfg.proc_mem.buf[AI3_PROC_BUF_INPUTBUF].pa = p_net->input_mem.pa; proc_cfg.proc_mem.buf[AI3_PROC_BUF_INPUTBUF].va = p_net->input_mem.va; proc_cfg.proc_mem.buf[AI3_PROC_BUF_INPUTBUF].size = p_net->input_mem.size; ``` - **风险提示**: - 若 `INPUTBUF` 未绑定私有内存,双目模式下左右眼输入数据会互相覆盖,导致推理结果异常。 --- ### **4. 双目模式下的独立性验证** #### **验证步骤** 1. **打印缓冲区地址** 在 `network_open()` 结尾打印各缓冲区地址: ```c printf("net_path=%u: WORKBUF va=0x%p, RONLYBUF va=0x%p, INPUTBUF va=0x%p\n", net_path, p_net->io_mem.va, p_net->intl_mem.va, p_net->input_mem.va); ``` - **预期输出**: ``` net_path=0: WORKBUF va=0x7fa4259000, RONLYBUF va=0x7fa427a000, INPUTBUF va=0x7fa4249000 net_path=1: WORKBUF va=0x7fa425a000, RONLYBUF va=0x7fa427b000, INPUTBUF va=0x7fa424a000 ``` 2. **检查地址重叠** - 若 `net_path=0` 和 `net_path=1` 的缓冲区地址相同,则存在共享冲突,需修复分配逻辑。 --- ### **5. 修复建议** #### **步骤1:确保 `INPUTBUF` 独立绑定** - 修改 `network_open()`,补充 `INPUTBUF` 的绑定逻辑: ```c proc_cfg.proc_mem.buf[AI3_PROC_BUF_INPUTBUF].pa = p_net->input_mem.pa; proc_cfg.proc_mem.buf[AI3_PROC_BUF_INPUTBUF].va = p_net->input_mem.va; proc_cfg.proc_mem.buf[AI3_PROC_BUF_INPUTBUF].size = p_net->input_mem.size; ``` #### **步骤2:分离 `model_buf` `RONLYBUF`** - 若硬件要求 `model_buf` `RONLYBUF` 独立,需分配额外内存: ```c // 修改 model_buf 的绑定来源(假设 g_model_mem 为全局模型参数内存) proc_cfg.model_buf.pa = g_model_mem.pa; proc_cfg.model_buf.va = g_model_mem.va; proc_cfg.model_buf.size = g_model_mem.size; ``` #### **步骤3:动态调整缓冲区大小** - 根据模型信息动态分配 `WORKBUF` 和 `RONLYBUF`: ```c // 从模型信息中获取需求大小 UINT32 workbuf_size = model_info.proc_mem.buf[AI3_PROC_BUF_WORKBUF].size; UINT32 ronly_size = model_info.proc_mem.buf[AI3_PROC_BUF_RONLYBUF].size; // 分配缓冲区 network_alloc_io_buf(net_path, workbuf_size); network_alloc_intl_buf(net_path, ronly_size); ``` --- ### **6. 总结** - **正确部分**: - `WORKBUF` 和 `RONLYBUF` 绑定到当前通道的私有内存,符合双目模式需求。 - **待修复部分**: - **遗漏 `INPUTBUF` 配置**:需补充绑定逻辑以避免输入数据冲突。 - **`model_buf` `RONLYBUF` 的潜在冲突**:需根据硬件文档确认是否需独立分配。 - **验证手段**:打印缓冲区地址并检查双目通道的独立性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值