1025ORA-00600[kkpo_rcinfo_defstgdelseg]

本文介绍了一种因数据字典不一致导致的ORA-00600错误,通过修改数据字典并刷新共享池解决了分区表在查询、分配段及移动时出现的问题。

[20161025]ORA-00600 [kkpo_rcinfo_defstgdelseg], [xxxx].txt

--链接http://www.anbob.com/archives/2745.html,重复操作,做1个记录。
--模拟ORA-00600 [kkpo_rcinfo_defstgdelseg], [xxxx]错误

1.环境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> show parameter defer
NAME                       TYPE      VALUE
-------------------------- --------- -------
deferred_segment_creation  boolean   TRUE

create table tpart(id number, name varchar2(100)) 
partition by range(id)
(
partition p_100 values less than(101),
partition p_200 values less than(201),
partition p_300 values less than(301)
);

2.测试:
SCOTT@book> select * from dba_objects where owner=user and object_name='TPART';
OWNER  OBJECT_NAME SUBOBJECT_  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE     CREATED             LAST_DDL_TIME       TIMESTAMP           STATUS  T G S  NAMESPACE EDITION_NAME
------ ----------- ---------- ---------- -------------- --------------- ------------------- ------------------- ------------------- ------- - - - ---------- ------------
SCOTT  TPART                       88785                TABLE           2016-10-27 09:18:02 2016-10-27 09:18:02 2016-10-27:09:18:02 VALID   N N N          1
SCOTT  TPART       P_100           88786          88786 TABLE PARTITION 2016-10-27 09:18:02 2016-10-27 09:18:02 2016-10-27:09:18:02 VALID   N N N          1
SCOTT  TPART       P_200           88787          88787 TABLE PARTITION 2016-10-27 09:18:02 2016-10-27 09:18:02 2016-10-27:09:18:02 VALID   N N N          1
SCOTT  TPART       P_300           88788          88788 TABLE PARTITION 2016-10-27 09:18:02 2016-10-27 09:18:02 2016-10-27:09:18:02 VALID   N N N          1

SCOTT@book> select ts#,file#,block#,flags,bitand(flags, 65536) from sys.tabpart$ where obj#=88786;
       TS#      FILE#     BLOCK#      FLAGS BITAND(FLAGS,65536)
---------- ---------- ---------- ---------- -------------------
         4          0          0      65536               65536

--//由于使用段延迟建立,没有数据的对象,没有分配段。插入1行,分配段看看。
SCOTT@book> insert into tpart values(1,'a');
1 row created.

SCOTT@book> commit ;
Commit complete.

SCOTT@book> select ts#,file#,block#,flags,bitand(flags, 65536) from sys.tabpart$ where obj#=88786;
       TS#      FILE#     BLOCK#      FLAGS BITAND(FLAGS,65536)
---------- ---------- ---------- ---------- -------------------
         4          4        657          0                   0

--一旦段分配了flags不再等于65536,而且file#,block#不再是0.

SCOTT@book> select owner,segment_name,partition_name,segment_type,header_file,header_block,bytes,blocks,extents from dba_segments where owner=user and segment_name='TPART';
OWNER  SEGMENT_NAME         PARTITION_NAME                 SEGMENT_TYPE       HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS
------ -------------------- ------------------------------ ------------------ ----------- ------------ ---------- ---------- ----------
SCOTT  TPART                P_100                          TABLE PARTITION              4          657    8388608       1024          1

3.开始破坏数据字典不一致。

SCOTT@book> select obj#,ts#,file#,block#,flags,bitand(flags, 65536) from sys.tabpart$ where obj# in (88786,88787,88788);
      OBJ#        TS#      FILE#     BLOCK#      FLAGS BITAND(FLAGS,65536)
---------- ---------- ---------- ---------- ---------- -------------------
     88786          4          4        657          0                   0
     88787          4          0          0      65536               65536
     88788          4          0          0      65536               65536

SYS@book> update tabpart$ set flags=0 where  obj#=88787;
1 row updated.

SYS@book> commit ;
Commit complete.

SCOTT@book> select obj#,ts#,file#,block#,flags,bitand(flags, 65536) from sys.tabpart$ where obj# in (88786,88787,88788);
      OBJ#        TS#      FILE#     BLOCK#      FLAGS BITAND(FLAGS,65536)
---------- ---------- ---------- ---------- ---------- -------------------
     88786          4          4        657          0                   0
     88787          4          0          0          0                   0
     88788          4          0          0      65536               65536

SCOTT@book> alter system flush shared_pool;
System altered.

SCOTT@book> select * from tpart partition(p_200);
select * from tpart partition(p_200)
              *
ERROR at line 1:
ORA-00600: internal error code, arguments: [kkpo_rcinfo_defstg:delseg], [88787], [], [], [], [], [], [], [], [], [], []

-- 产生错误,第2个参数值obj#。

select i.obj#, i.ts#, i.file#, i.block#, i.bo#, s.type#
from seg$ s, tabpart$ i
where i.ts#=s.ts#(+)
  and i.file#=s.file#(+)
  and i.block#=s.block#(+)
  and i.dataobj# is not null   /* A Physical object, Excludes IOT */
  and nvl(s.type#,0)!=5
  and bitand(i.flags, 65536) != 65536 /* Exclude DEFERRED Segment */;

      OBJ#        TS#      FILE#     BLOCK#        BO#      TYPE#
---------- ---------- ---------- ---------- ---------- ----------
     88787          4          0          0      88785

SCOTT@book> alter table tpart modify partition p_200  allocate extent(size 10m);
alter table tpart modify partition p_200  allocate extent(size 10m)
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [25027], [4], [0], [], [], [], [], [], [], [], [], []

SCOTT@book> alter table tpart move partition p_200;
alter table tpart move partition p_200
            *
ERROR at line 1:
ORA-00600: internal error code, arguments: [ktadrprc-1], [], [], [], [], [], [], [], [], [], [], []

--//使用分区交换看看。
SCOTT@book> create table tpart_bak as select * from tpart partition(p_100) where 1=0;
Table created.

SCOTT@book> alter table tpart exchange partition p_200 with table tpart_bak;
alter table tpart exchange partition p_200 with table tpart_bak
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [ktsssun_segment2], [4], [0], [0], [], [], [], [], [], [], [], []

4.修正回来:
SYS@book> update  tabpart$ set flags=65536 where  obj#=88787;
1 row updated.

SYS@book> commit ;
Commit complete.

SCOTT@book> alter system flush shared_pool;
System altered.

SCOTT@book> select * from tpart partition(p_200);
no rows selected

--ok现在问题消失。

SCOTT@book> select obj#,ts#,file#,block#,flags,bitand(flags, 65536) from sys.tabpart$ where obj# in (88786,88787,88788);
      OBJ#        TS#      FILE#     BLOCK#      FLAGS BITAND(FLAGS,65536)
---------- ---------- ---------- ---------- ---------- -------------------
     88786          4          4        657          0                   0
     88787          4          0          0      65536               65536
     88788          4          0          0      65536               65536

--move看看,是否分配段。

SCOTT@book> select obj#,ts#,file#,block#,flags,bitand(flags, 65536) from sys.tabpart$ where obj# in (88786,88787,88788);
      OBJ#        TS#      FILE#     BLOCK#      FLAGS BITAND(FLAGS,65536)
---------- ---------- ---------- ---------- ---------- -------------------
     88786          4          4        657          0                   0
     88787          4          0          0      65536               65536
     88788          4          0          0      65536               65536

SCOTT@book> select owner,segment_name,partition_name,segment_type,header_file,header_block,bytes,blocks,extents from dba_segments where owner=user and segment_name='TPART';
OWNER  SEGMENT_NAME         PARTITION_NAME                 SEGMENT_TYPE       HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS
------ -------------------- ------------------------------ ------------------ ----------- ------------ ---------- ---------- ----------
SCOTT  TPART                P_100                          TABLE PARTITION              4          657    8388608       1024          1

SCOTT@book> alter table tpart modify partition p_200  allocate extent(size 10m);
Table altered.

SCOTT@book> select owner,segment_name,partition_name,segment_type,header_file,header_block,bytes,blocks,extents from dba_segments where owner=user and segment_name='TPART';
OWNER  SEGMENT_NAME         PARTITION_NAME SEGMENT_TYPE       HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS
------ -------------------- -------------- ------------------ ----------- ------------ ---------- ---------- ----------
SCOTT  TPART                P_200          TABLE PARTITION              4         1681   18874368       2304          4
SCOTT  TPART                P_100          TABLE PARTITION              4          657    8388608       1024          1

--另外注意一个小细节,就是建立的段分配1024块,占用8M,这个oracle隐含参数影响_partition_large_extents=true影响,如果分区
--很多,而每个分区记录很小的情况下,空间浪费很大。

SYS@book> @ &r/hide _partition_large_extents
NAME                           DESCRIPTION                                             DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE
------------------------------ ------------------------------------------------------- ------------- ------------- ------------
_index_partition_large_extents Enables large extent allocation for partitioned indices TRUE          FALSE         FALSE
_partition_large_extents       Enables large extent allocation for partitioned tables  TRUE          TRUE          TRUE

总结:

因为某些原因数据字典表不一致,导到该表在查询或导出时都会提示ora-600 [kkpo_rcinfo_defstg:delseg] 错误,因为数据库使用延迟
段创建,手动分配segment时提示ORA-600 [25027],对分区做MOVE时会提示ORA-600 [ktadrprc-1], 使用hcheck脚本检查会提示Orphaned
TABPART$ ,然后通过脚本中找到字典的错误,修改数据字典后记的flush shared_pool, 使用RAC 时刷新所有实例shared_pool,并重新登
录验证,问题得到解决。生产不建议对基表直接修改,或修改前备份。

Oracle数据库错误 `ORA-12801` 和 `ORA-00600` 通常表示系统内部的异常情况,尤其是在并行执行查询时。当出现 `ORA-00600 [kcbzib_kcrzdz_1]` 错误时,这通常与数据库缓冲区高速缓存(buffer cache)和并行查询执行过程中的不一致状态有关。 ### ORA-12801 错误概述 `ORA-12801: error signaled in parallel query server` 表示在并行查询执行过程中,某个并行服务器进程遇到了错误,导致整个查询失败。此错误通常不会单独出现,而是伴随着其他错误代码(如 `ORA-00600`),这些错误提供了更具体的内部问题信息。 ### ORA-00600 [kcbzib_kcrzdz_1] 内部错误 `ORA-00600 [kcbzib_kcrzdz_1]` 是一个内部 Oracle 错误,通常与数据库的缓冲区管理器(Buffer Manager)和并行查询操作中出现的不一致有关。此错误可能由以下原因引起: - **数据块损坏**:表或索引的数据块在磁盘上损坏,导致 Oracle 无法正确读取。 - **内存不足**:共享池(shared pool)或缓冲区高速缓存(buffer cache)资源不足,导致 Oracle 无法分配必要的内存结构。 - **并行查询资源竞争**:多个并行查询进程尝试访问同一数据块时发生资源争用或死锁。 - **Bug 或软件缺陷**:某些版本的 Oracle 存在已知的 bug,可能导致此错误。 ### 解决方案与修复方法 1. **检查数据库完整性** - 使用 `DBVERIFY` 工具验证数据文件的物理完整性。 - 运行 `ANALYZE TABLE ... VALIDATE STRUCTURE` 来检查逻辑一致性。 - 执行 `RMAN` 命令 `VALIDATE DATABASE` 检查潜在的块损坏。 2. **调整并行查询参数** - 检查并调整 `PARALLEL_MAX_SERVERS` 和 `PARALLEL_MIN_SERVERS` 参数,避免资源争用。 - 如果并行查询不是必需的,可以考虑在会话级别禁用并行执行: ```sql ALTER SESSION DISABLE PARALLEL QUERY; ``` 3. **增加共享池和缓冲区高速缓存大小** - 增加 `SHARED_POOL_SIZE` 和 `DB_CACHE_SIZE` 参数值,以提供更多内存资源。 - 如果使用自动内存管理(AMM),可以考虑调整 `MEMORY_TARGET` 或 `SGA_TARGET`。 4. **升级 Oracle 版本** - 检查 Oracle 官方支持文档,确认当前版本是否已知存在此错误。如是,升级到更高版本或应用补丁。 - 参考 MOS(My Oracle Support)文档 ID `1377575.1`、`1567834.1` 等相关文档。 5. **启用事件跟踪进行诊断** - 设置 10046 事件跟踪以获取详细的执行计划和等待事件信息: ```sql ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; ``` - 使用 `ADRCI` 工具分析 `alert.log` 和跟踪文件,查找错误发生时的上下文信息。 6. **避免强制打开数据库后的数据不一致** - 如果使用了 `_ALLOW_RESETLOGS_CORRUPTION` 等隐藏参数强制打开数据库,应尽快进行完整备份,并在干净环境中恢复数据。 ### 示例:调整并行查询参数 ```sql -- 查看当前并行查询设置 SHOW PARAMETER PARALLEL_MAX_SERVERS; -- 修改并行最大服务器数 ALTER SYSTEM SET PARALLEL_MAX_SERVERS=32 SCOPE=BOTH; -- 禁用并行查询 ALTER SESSION DISABLE PARALLEL QUERY; ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值