[20151112]ORA-01450?3215?.txt
[20151112]ORA-01450 maximum key length (3215) exceeded.txt
--如果建立的索引键值长度达到一定程度,在做rebuild online时会出现ora-01450错误.今天被别人问一个问题,我重复了测试:
--测试出它的边界,例子:
1.测试环境:
SCOTT@test> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx 10.2.0.4.0 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
SCOTT@test> create table t1(a varchar2(3000),b varchar2(200));
Table created.
SCOTT@test> create index i_t1_a_b on t1(a,b);
Index created.
SCOTT@test> alter index i_t1_a_b rebuild online ;
alter index i_t1_a_b rebuild online
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01450: maximum key length (3215) exceeded
--如果执行如下:
SCOTT@test> drop table t1 purge ;
Table dropped.
SCOTT@test> create table t1(a varchar2(3000),b varchar2(199));
Table created.
SCOTT@test> create index i_t1_a_b on t1(a,b);
Index created.
SCOTT@test> alter index i_t1_a_b rebuild online ;
Index altered.
-- 很明显边界在这个位置,这个主要是做rebuild online时要建立一个IOT表.别人问我问题是这个3215是如何算出来的.
2.如何计算:
--索引的结构与表记录很相似.不同的地方没有字段数量的记数字段。
SCOTT@test> insert into t1 values (lpad('1',3000,'1'),lpad('a',199,'a'));
1 row created.
SCOTT@test> commit ;
Commit complete.
SCOTT@test> select segment_name ,header_file,header_block from dba_segments where owner=user and segment_name='I_T1_A_B';
SEGMENT_NAME HEADER_FILE HEADER_BLOCK
------------- ----------- ------------
I_T1_A_B 4 419
SCOTT@test> alter system checkpoint;
System altered.
SCOTT@test> alter system dump datafile 4 block 420 ;
System altered.
--检查转储文件:
Leaf block dump
===============
header address 290329188=0x114e1264
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 3
kdxcosdc 0
kdxconro 1
kdxcofbo 38=0x26
kdxcofeo 4820=0x12d4
kdxcoavs 4782
kdxlespl 0
kdxlende 0
kdxlenxt 0=0x0
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8032
row#0[4820] flag: ------, lock: 2, len=3212
col 0; len 3000; (3000):
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
... snip...
col 1; len 199; (199):
... snip...
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
col 2; len 6; (6): 01 00 01 8e 00 00
----- end of leaf block dump -----
End dump data blocks tsn: 4 file#: 4 minblk 420 maxblk 420
-- 2+2+3000+2+199+1+6=3212
--注意索引键值长度大于等于128,长度指示器占用2个字节.参考http://blog.itpub.net/267265/viewspace-1291526/.
--很明显算出来的是3212. 并不是3215.即使不考虑前面2个字节,那更加小了。
--参考自己以前写的http://blog.itpub.net/267265/viewspace-732488/,才想起来应该考虑的IOT索引.
3.跟踪看看建立IOT索引:
SCOTT@test> @ &r/10046on 12
Session altered.
SCOTT@test> alter index i_t1_a_b rebuild online ;
Index altered.
SCOTT@test> @ &r/10046off
Session altered.
--检查跟踪文件存在如下语句:
create table "SCOTT"."SYS_JOURNAL_54110" (C0 VARCHAR2(3000), C1 VARCHAR2(199), opcode char(1), partno number, rid
rowid, primary key( C0, C1 , rid )) organization index TABLESPACE "USERS"
SCOTT@test> select dump(rowid,16) c40,rowid from t1 ;
C40
----------------------------------------
Typ=69 Len=10: 0,0,d3,5d,1,0,1,8e,0,0
--按照这个计算:注意IOP表仅仅逻辑rowid的概念,没有物理rowid。
--2+2+3000+2+199+1+10=3216?多了2个字节,如果不包括前面的flag,lock等信息的2个字节,长度就是3214.没有超出范围。
--如果在增加1个字节就超出范围了。也许这3215就是这样计算出来的。
4.继续验证:
-- 2+3000+2+199+1+10=3214
SCOTT@book> CREATE table t2_iot (C0 VARCHAR2(3000), C1 VARCHAR2(211), primary key( C0, C1 )) organization index;
CREATE table t2_iot (C0 VARCHAR2(3000), C1 VARCHAR2(211), primary key( C0, C1 )) organization index
*
ERROR at line 1:
ORA-01450: maximum key length (3215) exceeded
SCOTT@book> CREATE table t2_iot (C0 VARCHAR2(3000), C1 VARCHAR2(210), primary key( C0, C1 )) organization index;
Table created.
--正好在这个边界发生ORA-01450。
insert into t2_iot values (lpad('1',3000,'1'),lpad('a',210,'a'));
insert into t2_iot values (lpad('2',3000,'2'),lpad('b',210,'b'));
commit ;
--IOT真正保存数据信息的是索引,先查询索引,再查询索引段.
SCOTT@book> select index_name from dba_indexes where owner=user and table_name='T2_IOT';
INDEX_NAME
------------------------------
SYS_IOT_TOP_88797
SCOTT@book> select segment_name ,header_file,header_block from dba_segments where owner=user and segment_name='SYS_IOT_TOP_88797';
SEGMENT_NAME HEADER_FILE HEADER_BLOCK
-------------------- ----------- ------------
SYS_IOT_TOP_88797 4 682
SCOTT@book> alter system dump datafile 4 block 683 ;
System altered.
Block header dump: 0x010002ab
Object id on Block? Y
seg/obj: 0x15ade csc: 0x00.18923b itc: 2 flg: E typ: 2 - INDEX
brn: 0 bdba: 0x10002a8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0x0007.017.000003bc 0x00c006aa.012b.02 --U- 2 fsc 0x0000.00189279
Leaf block dump
===============
header address 140593372824164=0x7fde720b8264
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x90: opcode=0: iot flags=I-- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 2
kdxcofbo 40=0x28
kdxcofeo 1600=0x640
kdxcoavs 1560
kdxlespl 0
kdxlende 0
kdxlenxt 0=0x0
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8032
row#0[4816] flag: ------, lock: 2, len=3216
col 0; len 3000; (3000):
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
...
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
col 1; len 210; (210):
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
61 61 61 61 61 61 61 61 61 61
row#1[1600] flag: ------, lock: 2, len=3216
col 0; len 3000; (3000):
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
...
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
col 1; len 210; (210):
62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
...
62 62 62 62 62 62 62 62 62 62
----- end of leaf block dump -----
End dump data blocks tsn: 4 file#: 4 minblk 683 maxblk 683
BBED> set dba 4,683
DBA 0x010002ab (16777899 4,683)
BBED> map
File: /mnt/ramdisk/book/users01.dbf (4)
Block: 683 Dba:0x010002ab
------------------------------------------------------------
KTB Data Block (Index Leaf)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdxle, 32 bytes @100
sb2 kd_off[2] @132
ub1 freespace[1560] @136
ub1 rowdata[6432] @1696
ub4 tailchk @8188
--剩余空间1560.至于为什么选择3215作为IOT索引maximum key length,我就不知道了。
[20151112]ORA-01450?3215?.txt相关推荐
- [20170914]tnsnames.ora的管理.txt
[20170914]tnsnames.ora的管理.txt --//昨天朋友讲tnsnams.ora的内容太长了,而且许多不需要的.管理不方便.我记得以前写[20150409]tnsnames.ora ...
- [20150409]tnsnames.ora与IFILE.txt
[20150409]tnsnames.ora与IFILE.txt --今天看别人机器的tnsnames.ora文件.发现存在一个参数 IFILE=/path/xxx.ora --但是设置参数,使用Ne ...
- sqplus操作oracle,sqlplus操作oracle
登录oracle: D:\>sqlplus /nolog Dba用户链接数据库: SQL> connect /as sysdba --查看已有表空间名称和大小 SQL>select ...
- Python--DBUtil
Python--DBUtil包 1 简介 DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装.DBUtils来自Webware for Python. DB ...
- Oracle客户端安装
想要连接Oracle服务器必须安装Oracle客户端,Oracle客户端分两种,一种是免安装的,体积较小,直接解压后使用,一种是需要安装的,体积较大,500多MB,建议大家都用下面的百度云盘安装,装3 ...
- sqlplus操作oracle
登录oracle: D:\>sqlplus /nolog Dba用户链接数据库: SQL> connect /as sysdba --查看已有表空间名称和大小 SQL> select ...
- Oracle的学习详解
=============oralce安装=============== 基本位置:Oracle安装在哪一个目录(注意不同版本的区别) %driver_name%\app\username 目标驱 ...
- linux 备份文件时,目录下的个别文件不备份,【学习笔记】Linux TAR备份文件时排除指定文件...
天萃荷净 Oracle研究中心学习笔记:分享一篇关于Oracle数据库备份的笔记,该笔记记录使用linux tar备份数据库目录时指定排除不备份指定文件. 在升级或者打PSU的时候都需要对ORACLE ...
- [20181204]低版本toad 9.6直连与ora-12505.txt
[20181204]低版本toad 9.6直连与ora-12505.txt --//我们生产系统还保留有一台使用AMERICAN_AMERICA.US7ASCII字符集的数据库,这样由于toad新版本 ...
最新文章
- BackgroundSubtractorGMG 背景建模
- java程序员从笨鸟到菜鸟之(七)一—java数据库操作
- Java DelayQueue延迟队列的使用和源码分析
- (计算机组成原理)第六章总线-第三节:总线操作和定时(同步定时和异步定时)
- 浅入浅出 MySQL 索引
- python2没有pip命令_解决Windows下python和pip命令无法使用的问题
- 2016年3月8日----Javascript的函数
- java中获得IP地址
- spring boot task实现动态创建定时任务
- js之prototype、__proto__与constructor(图解)以及原型链
- VLAN与三层交换机
- 如何在图片上添加边框和文字
- 高德地图开发之点标注marker
- stm32F103+EncEthernet+ENC28J60驱动+ping
- Python教程视频千锋最新版免费分享
- 备份iphoneXR手机照片
- DJ3-3 进程调度
- C#计算两个日期间隔年数、月数、天数
- 英语作文考前必背10大类万能句型
- 电脑安装了git之后拉取代码报错:git fatal: Authentication failed for
热门文章
- jQuery零基础入门——(三)层级选择器
- Application Transport Security has blocked a clear
- Win7 32位下DebugView和DriverMinitor不能打印调试信息的问题
- 与MQ通讯的完整JAVA程序
- perl 中部分正则表达式中匹配非空字符和正常使用字符
- LeetCode 1497. 检查数组对是否可以被 k 整除
- 虚拟化网络与云网关打通的解决方案
- ShardingSphere(六) 读写分离之mysql 主从同步配置
- google浏览器记住密码自动添加input框背景色问题
- IDEA autowired校验关闭方法