Oracle 10g Toad查看 表空间 报错 ORA-00600 internal error code arguments [ktfbhget-4], [6], [5]...

Toad 10.6 去查Oracle 10g 的表空间,在Toad 返回页面提示信息是:

selectprivileges on following are required:DBA_DATA_FILES,DBA_FREE_SPACE,V$TEMP_SPACE_HEADER,v$TEMP_EXTENT_POOL,DBA_TEMP_FILES.

查看了一下DB 的alert log:

Fri Jun3 00:05:46 2011

Errors in file/u01/app/oracle/admin/dave1/udump/dave1_ora_21187.trc:

ORA-00600: internal error code, arguments:[ktfbhget-4], [6], [5], [], [], [], [], []

Fri Jun 300:09:37 2011

ORA-1000 encountered when generating server alertSMG-3503

Fri Jun 300:10:41 2011

Errors in file /u01/app/oracle/admin/dave1/udump/dave1_ora_21187.trc:

ORA-00600: internal error code, arguments:[ktfbhget-4],[6], [5], [], [], [], [], []

Fri Jun3 00:12:48 2011

Errors in file/u01/app/oracle/admin/dave1/udump/dave1_ora_21187.trc:

ORA-00600: internal error code, arguments:[ktfbhget-4], [6], [5], [], [], [], [], []

Fri Jun3 00:16:40 2011

ORA-1000 encountered whengenerating server alert SMG-3503

看一下trace 文件:

[oracle@db1 bdump]$ head -100 /u01/app/oracle/admin/dave1/udump/dave1_ora_21187.trc

/u01/app/oracle/admin/dave1/udump/dave1_ora_21187.trc

Oracle Database 10g Enterprise EditionRelease 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Miningoptions

ORACLE_HOME =/u01/app/oracle/product/10.2.0/db_1

System name: Linux

Node name: db1

Release: 2.6.18-164.el5xen

Version: #1 SMP Tue Aug 18 16:06:30 EDT 2009

Machine: i686

Instance name: dave1

Redo thread mounted by this instance: 1

Oracle process number: 17

Unix process pid: 21187, image:oracledave1@db1

*** ACTION NAME:() 2011-06-03 00:05:46.731

*** MODULE NAME:(TOAD 10.6.0.42) 2011-06-0300:05:46.731

*** SERVICE NAME:(dave1) 2011-06-0300:05:46.731

*** SESSION ID:(151.46) 2011-06-0300:05:46.731

*** 2011-06-03 00:05:46.731

ksedmp: internal or fatalerror

ORA-00600:internal error code, arguments: [ktfbhget-4], [6], [5], [], [], [], [], []

Current SQL statement for this session:

select a.tablespace_name,

round(a.bytes_alloc / 1024 / 1024)megs_alloc,

round(nvl(b.bytes_free, 0) / 1024 /1024) megs_free,

round((a.bytes_alloc - nvl(b.bytes_free, 0))/ 1024 / 1024) megs_used,

round((nvl(b.bytes_free, 0) /a.bytes_alloc) * 100) Pct_Free,

100 - round((nvl(b.bytes_free, 0) /a.bytes_alloc) * 100) Pct_used,

round(maxbytes/1048576) Max

from ( selectf.tablespace_name,

sum(f.bytes) bytes_alloc,

sum(decode(f.autoextensible,'YES',f.maxbytes,'NO', f.bytes)) maxbytes

from dba_data_files f

group by tablespace_name) a,

( selectf.tablespace_name,

sum(f.bytes) bytes_free

from dba_free_space f

group by tablespace_name) b

where a.tablespace_name =b.tablespace_name (+)

union all

select h.tablespace_name,

round(sum(h.bytes_free + h.bytes_used) /1048576) megs_alloc,

round(sum((h.bytes_free + h.bytes_used)- nvl(p.bytes_used, 0)) / 1048576) megs_free,

round(sum(nvl(p.bytes_used, 0))/1048576) megs_used,

round((sum((h.bytes_free + h.bytes_used)- nvl(p.bytes_used, 0)) / sum(h.bytes_used + h.bytes_free)) * 100) Pct_Free,

100 - round((sum((h.bytes_free +h.bytes_used) - nvl(p.bytes_used, 0)) / sum(h.bytes_used + h.bytes_free)) *100) pct_used,

round(sum(f.maxbytes) / 1048576) max

from sys.v_$TEMP_SPACE_HEADER h, sys.v_$Temp_extent_poolp, dba_temp_files f

where p.file_id(+) = h.file_id

and p.tablespace_name(+) = h.tablespace_name

and f.file_id = h.file_id

and f.tablespace_name = h.tablespace_name

group by h.tablespace_name

ORDER BY 1

----- Call Stack Trace-----

calling call entry argument values in hex

location type point (? means dubious value)

-------------------- ---------------------------- ----------------------------

ksedst()+27 call ksedst1() 0 ? 1 ?

ksedmp()+557 call ksedst() 0 ? BF000000 ? 0 ? 0 ?

BFE161C8 ? 9749978 ?

...

--先看ORA-1000的错误

[oracle@db1 u01]$ oerr ora 1000

01000, 00000, "maximum open cursorsexceeded"

// *Cause:

// *Action:

SQL> show parameter open_cursors

NAME TYPE VALUE

----------------------------------------------- ------------------------------

open_cursors integer 300

SQL>

SQL> select name,value,display_valuefrom v$parameter where name like '%cursor%';

NAME VALUE DISPLAY_VALUE

----------------------- --------------------------

cursor_space_for_time FALSEFALSE

session_cached_cursors 2020

cursor_sharing EXACT EXACT

open_cursors 5000 5000

SQL> select count(*) fromv$open_cursor;

COUNT(*)

----------

5115

SQL> alter system setopen_cursors=10000 scope=both;

System altered.

SQL> show parameteropen_cursors

NAME TYPE VALUE

----------------------------------------------- ------------------------------

open_cursors integer 10000

修改之后,问题依旧。

查看dba_data_files 就会报错:

SQL> select * fromdba_data_files;

ERROR:

ORA-00600: internal errorcode, arguments: [ktfbhget-4], [6], [5], [], [], [],

[], []

no rows selected

根据dba_data_files视图的定义,确定了是x$tkfbhc字典出问题。

SQL>select text from dba_views whereview_name = 'DBA_DATA_FILES';

SQL> select * from x$ktfbhc;

ERROR:

ORA-00600: internal error code, arguments:[ktfbhget-4],[6], [5], [], [], [],[], []

no rows selected

这个字典的名字和我们的ORA-600 里的第一个参数名称一致。x$ktfbhc对象是Kernel Tablespace File BitmapHeader Control,也就是说记录了本地表空间的Bitmap头控制信息。

研究了半天,没能搞定这个错误。 我是用sys 用户连接的,所以权限这块的问题可能性不大。 在MOS上搜了半天,ktfbhget这个是有一些,且多与bug 有关。 我搜ktfbhget-4 这个,没有结果。 我猜这个4可能代表的是datafile 的file no。

这个库是我的测试库,DB 版本10.2.0.1, OS版本: redhat 5.4。 本是想把这个问题搞清楚,但是这个已经超出我现在的能力范围了。 最终把这个库重建了。

有些问题还是需要深入研究啊。

-------------------------------------------------------------------------------------------------------

Blog: http://blog.youkuaiyun.com/tianlesoftware

Email: dvd.dba@gmail.com

DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)

DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823

DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

你遇到了 Oracle 数据库的经典错误: ``` ORA-00904: "OFFERING": invalid identifier ``` 这个错误的意思是:**`OFFERING` 不是一个有效的列名(字段)**,Oracle 找不到它。 --- ### ❌ 错误原因分析 > **ORA-00904 通常发生在:引用了一个不存在的列、拼写错误、或大小写敏感问题。** 你的 SQL: ```sql UPDATE SYS_PROJECT_DIMENSION_DATAS_YGW SET REMAKE = OFFERING; ``` 报错在 `OFFERING` 上,说明 Oracle 认为表中没有叫 `OFFERING` 的字段。 --- ## ✅ 解决方案步骤 我们一步步排查并修复这个问题。 --- ### 🔍 第一步:确认字段是否存在 运行以下查询,查看表中到底有哪些字段: ```sql SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'SYS_PROJECT_DIMENSION_DATAS_YGW' ORDER BY COLUMN_ID; ``` > ⚠️ 注意:`TABLE_NAME` 在 `USER_TAB_COLUMNS` 中是**大写的**! 如果表名不确定是否正确,可以先模糊查找: ```sql SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS WHERE COLUMN_NAME LIKE '%OFFER%' OR COLUMN_NAME LIKE '%REMARK%' OR COLUMN_NAME LIKE '%REMAKE%' AND TABLE_NAME LIKE 'SYS%'; ``` 这能帮你找到可能相关的字段。 --- ### 🛠 常见问题与解决方案 #### ✅ 情况 1:字段名拼写错误(最常见) 你写的是 `OFFERING`,但实际字段可能是: | 可能的真实字段名 | 说明 | |------------------|------| | `OFFER` | 缩写 | | `OFFERING_CODE` | 带后缀 | | `PROD_OFFERING` | 前缀不同 | | `SERVICE_OFFERING` | 更完整名称 | 👉 **解决方法**:根据上面的 `SELECT COLUMN_NAME` 查询结果,找出正确的字段名。 例如查出真实字段是 `SERVICE_OFFERING`,那就改成: ```sql UPDATE SYS_PROJECT_DIMENSION_DATAS_YGW SET REMAKE = SERVICE_OFFERING; ``` --- #### ✅ 情况 2:字段名是小写或带引号创建的(罕见但存在) 如果你建表时用了双引号强制小写,比如: ```sql CREATE TABLE T ( "offering" VARCHAR2(100) ); ``` 那么你必须用双引号访问: ```sql UPDATE SYS_PROJECT_DIMENSION_DATAS_YGW SET REMAKE = "offering"; -- 必须加引号,且大小写敏感! ``` ⚠️ 这种情况非常容易出错,不推荐使用。 你可以检查是否如此: ```sql SELECT COLUMN_NAME, CHAR_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'SYS_PROJECT_DIMENSION_DATAS_YGW' AND COLUMN_NAME = '"offering"'; -- 注意带引号的名字也会被存储为大写字符串 ``` > 如果看到字段名包含双引号(如 `"offering"`),那就是这种情况。 --- #### ✅ 情况 3:表名错误或用户权限问题 确保你当前登录的用户拥有这张表,并且名字完全匹配。 运行: ```sql SELECT * FROM USER_TABLES WHERE TABLE_NAME = 'SYS_PROJECT_DIMENSION_DATAS_YGW'; ``` 如果没有返回结果,说明: - 表不存在; - 或者属于其他用户(schema); 如果是别的用户拥有的表,需要用 `SCHEMA.TABLE` 形式访问: ```sql UPDATE OTHER_USER.SYS_PROJECT_DIMENSION_DATAS_YGW SET REMAKE = OFFERING; ``` 前提是你有更新该表的权限。 --- #### ✅ 情况 4:缓存/IDE 提示误导 有时候 PL/SQL Developer、Toad、Navicat 等工具会有缓存,显示旧的结构。 👉 **建议重启工具或刷新元数据**,或者直接在命令行执行 `SELECT` 测试字段是否存在。 --- ### ✅ 最终正确做法流程图 ```text 开始 ↓ 运行:SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'SYS_PROJECT_DIMENSION_DATAS_YGW' ↓ 查看是否有名为 OFFERING 的字段? ├── 是 → 继续下一步 └── 否 → 查找相似字段(如 %OFFER%) ↓ 使用正确字段名替换 SQL 中的 OFFERING ↓ 成功执行 UPDATE 如果有双引号字段?→ 使用 "offering" 并加双引号引用 ``` --- ### ✅ 示例修复后的 SQL 假设你发现正确的字段名是 `SERVICE_OFFERING`: ```sql UPDATE SYS_PROJECT_DIMENSION_DATAS_YGW SET REMAKE = SERVICE_OFFERING WHERE SERVICE_OFFERING IS NOT NULL AND (REMAKE IS NULL OR REMAKE <> SERVICE_OFFERING); ``` --- ### 💡 小贴士:如何避免这类错误? | 方法 | 说明 | |------|------| | ✅ 先查 `USER_TAB_COLUMNS` 再写 SQL | 避免手误 | | ✅ 使用 IDE 的自动补全功能 | 减少拼写错误 | | ✅ 不要用双引号定义字段名 | 防止大小写陷阱 | | ✅ 开发前导出数据字典 | 方便查阅 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值