ORA-06512: at "DBSNMP.BSLN_INTERNAL", line 2073

本文介绍了一个 Oracle 11.2.0.3 数据库中出现的 ORA-12012 错误,并详细阐述了该错误产生的原因及其解决方案。此错误通常发生在使用模板或克隆方式创建数据库后,由于 DBSNMP.BSLN_INTERNAL 表中存在记录冲突引起。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库升级到11.2.0.3 后稳定运行了一年多了,alert日志中出现下述错误。


Sun Dec 16 15:00:07 2012  (这一天是周日)

Errors in file /opt/ora11g/diag/rdbms/ORACNBJ1/trace/ORACNBJ1_j001_6548.trc:
ORA-12012: error on auto execute of job "SYS"."BSLN_MAINTAIN_STATS_JOB"
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "DBSNMP.BSLN_INTERNAL", line 2073
ORA-06512: at line 1

原因:

由于DBSNMP.BSLN_INTERNAL表中记录有冲突导致。
导致DBSNMP.BSLN_INTERNAL中记录有冲突的原因可能是用模板创建数据库,或克隆数据库导致的。
           
解决方法:

删除并重建DBSNMP USER。

由于平时很少用DBCONSOLE去维护数据库,所以就关掉了dbconsole。加上是生产库,也没有去重建DBSNMP USER.
在关掉dbconsole后,观察了两周这个错误并没有重现。

 

一些是MOS中给出的说明:
Cause:
As in a specific customer's situation, the issue can occur when a Database is created with a
template from the old database or created as a clone from another database. The existing
records in table "DBSNMP.BSLN_BASELINES" conflict with new baseline information inserted
in the cloned database, thereby containing inconsistent information.

Solution
For 11.2.0.2, please apply generic Patch 10110625.
As a workaround, the DBSNMP user can be dropped and re-created using the standard scripts.
Ensure you have Backed up your database.

-- Login as sys user.

SQL> sqlplus / as sysdba

-- From the sqlplus execute the following:

-- Drop the DBSNMP user by executing catnsnmp.sql script.

SQL> @$ORACLE_HOME/rdbms/admin/catnsnmp.sql

-- Create the DBSNMP user by executing catsnmp.sql

SQL> @$ORACLE_HOME/rdbms/admin/catsnmp.sql


【MOS】ORA-12012: error on auto execute of job "SYS"."BSLN_MAINTAIN_STATS_JOB" [ID 1413756.1]

 


 

### ORA-06512错误在使用sqlplus执行脚本时的解决方法及与SYS.UTL_FILE相关的日志文件保存位置 ORA-06512错误通常与PL/SQL程序中的堆栈跟踪信息相关,表示错误发生的程序单元和行号。当使用 `SYS.UTL_FILE` 包进行文件操作时,如果发生错误(如目录权限问题、文件路径不存在、文件无法写入等),ORA-06512会指示错误的具体位置。这种错误本身不会提供具体的文件操作失败原因,因此需要结合其他错误信息(如ORA-29283、ORA-29285等)进行分析。 在使用 `sqlplus` 执行脚本时,若调用了 `SYS.UTL_FILE` 包进行日志写入,日志文件的保存位置由 `UTL_FILE_DIR` 参数或 Oracle 目录对象(`CREATE OR REPLACE DIRECTORY`)定义。通常情况下,这些日志文件存储在数据库服务器的文件系统中,路径由数据库管理员指定。例如: ```sql CREATE OR REPLACE DIRECTORY log_dir AS '/u01/app/oracle/logs'; ``` 在 PL/SQL 代码中使用 `UTL_FILE.FOPEN('LOG_DIR', 'my_log_file.log', 'w')` 打开文件时,日志文件将被写入 `/u01/app/oracle/logs` 目录下。确保该目录存在且 Oracle 用户具有读写权限是避免 ORA-29283 和 ORA-06512 错误的关键条件之一。 处理 ORA-06512 错误时,应首先检查以下方面: - **文件路径是否存在**:确认 `UTL_FILE_DIR` 或目录对象指向的路径在数据库服务器上真实存在。 - **权限设置是否正确**:确保 Oracle 用户对目标目录具有读写权限。 - **文件是否已打开或被其他进程占用**:避免在多个会话中同时写入同一个文件。 - **文件大小限制**:检查文件系统是否已满或达到文件大小限制。 - **日志文件命名是否唯一**:避免因重复使用相同文件名导致文件写入失败。 例如,以下 PL/SQL 脚本展示了如何安全地使用 `UTL_FILE` 包并捕获异常: ```sql DECLARE file_handle UTL_FILE.FILE_TYPE; BEGIN file_handle := UTL_FILE.FOPEN('LOG_DIR', 'test.log', 'w'); UTL_FILE.PUT_LINE(file_handle, 'This is a test log entry.'); UTL_FILE.FCLOSE(file_handle); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error occurred: ' || SQLERRM); IF UTL_FILE.IS_OPEN(file_handle) THEN UTL_FILE.FCLOSE(file_handle); END IF; RAISE; END; ``` 在执行 `sqlplus` 脚本时,建议将 PL/SQL 块封装在异常处理结构中,以确保错误能够被捕获并输出到控制台或日志文件中。若脚本中涉及文件操作,应确保 `UTL_FILE` 所依赖的目录对象配置正确,且路径可访问。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值