oracle 索引 lob 迁移,Oracle Lob类型存储浅析( alter index lob索引 rebuild tablespace XX报错问题)...
在Oracle中,为数据表字段column和PL/sql语言,分别提供了多种数据类型,以应对实际开发中的多种类型。Lob类型是Oracle推出一种保存大对象的数据类型。当我们考虑将信息文件(十进制、二进制)、图像甚至音频信息采用数据库作为保存载体时,就需要使用lob类型数据。
目前Oracle支持的Lob类型具体包括四个子类型(subtype),分别为CLOB、BLOB、NLOB和BFILE。其中,CLOB、BLOB和NLOB都是将数据保存在数据库内部,而BFILE类型保存的核心是文件指针,真正的文件是保存在数据库外。
与传统的数据类型相比较,lob类型数据无论在管理上还是空间使用上,都有很多特殊之处。本篇主要介绍lob类型一些基本的存储特性。
1、环境准备和数据段segment特性
我们选择在Oracle 10gR2下进行试验。
sql> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/sql Release 10.2.0.1.0 - Production
CORE10.2.0.1.0Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production
使用create table命令,可以构建出一个实验数据表T。
sql> create table t (id number,cl clob);
Table created
对于一般的数据表而言,一个数据表只会对应一个存储数据段data segment对象。这里的特殊情况是分区表,通常一个分区就对应一个单独的存储对象。当数据表中包括lob类型的数据列时,也会有独特的段对象建立。
sql> select segment_name,segment_type,tablespace_name from user_segments;
SEGMENT_NAMESEGMENT_TY TABLESPACE_NAME
------------------------------ ---------- ------------------------------
SYS_LOB0000056069C00002$$LOBSEGMENT USERS
TTABLEUSERS
SYS_IL0000056069C00002$$LOBINDEXUSERS
(篇幅原因,无关对象省略。。。。。。)
9 rows selected
我们发现,除了常规的数据段T之外,另外增加了两个明显是系统命名的段对象,类型分别为lobsegment和lobindex。
对Oracle lob类型数据表而言,一个带lob列的数据表创建是要对应多个数据段创建的。除了传统的数据表创建的数据段Table Data Segment之外,一个lob列都会生成两个专门的段:lob段和lob索引段。
Lob段(LobSegment)对应的是存放在数据表lob列上的数据。在Oracle的lob类型数据列,有两种保存位置结构。一个是in-row storage,也就是每一行的lob数据同其他列的数据以行的形式一起保存在数据块中。这种情况的lob列取值较小。而另一种为out-of-row storage,当lob对象较大,不能保存在一个数据块中时,可以将其放置在一个独立lobsegment中进行保存。而out-of-row storage时数据行中lob列上保存的只是一个指向lobsegment对应位置的指针引用。
Lob索引段(LobIndex)是Oracle为每一个lob类型列强制生成的索引,主要作用是用于进行lob类型数据检索加速的操作。Lobindex与lob列共生,如果强制进行删除操作,是会报错的。
sql> drop index SYS_IL0000056069C00002$$;
drop index SYS_IL0000056069C00002$$
ORA-22864:无法ALTER或DROP LOB索引
2、lob类型数据表原始定义分析
使用dbms_Metadata包,我们可以获取到数据表的全部定义,包括各种缺省参数和细节信息。
CREATE TABLE "SCOTT"."T"
("ID" NUMBER,
"CL" CLOB
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
LOB ("CL") STORE AS (
TABLESPACE "USERS"ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10
NOCACHE LOGGING
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)) ;
CREATE UNIQUE INDEX "SCOTT"."SYS_IL0000056069C00002$$" ON "SCOTT"."T" (
PCTFREE 10 INITRANS 2 MAXTRANS 255
PARALLEL (DEGREE 0 INSTANCES 0) ;
可以看到我们抽取出的元数据包括两个组成部分,数据表创建部分和lob索引创建部分。在数据表创建部分,我们可以看到将lob作为一个独立段对象进行存储设置和参数设置。
在lob索引创建部分,我们可以看到虽然是对应索引创建语句,但是从索引名称上显然是系统自动生成的对象名称。
此外,还有很多是针对lob特殊的参数,如cache、enable storage in-row等,这些参数在数据表lob的行为和访问性能上有巨大的影响。由于篇幅和内容所限,我们在本篇中不加以累述。
3、lob段与lob索引存储转移
对于一个数据表涉及的多个段,很多时候我们需要将其进行移动处理。其中最常用的方法是使用move进行对象表空间的移动。
SYS_LOB0000056099C00002$$LOBSEGMENT USERS
TTABLEUSERS
SYS_IL0000056099C00002$$LOBINDEXUSERS
sql> alter table t move tablespace system;
Table altered
TTABLESYSTEM
上面实验可以明确看到,当使用一般的move命令时,只会将数据表T段进行移动到新表空间。Lob段和对应的lobindex段没有变化。如果需要移动lob/lobindex,需要额外的单独操作。
sql> alter index SYS_IL0000056069C00002$$ rebuild tablespace users;
alter index SYS_IL0000056069C00002$$ rebuild tablespace users
ORA-02327:无法以数据类型LOB的表达式创建索引
Lobindex是不能使用rebuild直接重构的。
T_LOGSEGMENTLOBSEGMENTUSERS
SYS_IL0000056069C00002$$LOBINDEXUSERS
TTABLEEXAMPLE
sql> alter table t move lob(cl) store as t_logsegment (tablespaceexample);
SYS_IL0000056069C00002$$LOBINDEXEXAMPLE
T_LOGSEGMENTLOBSEGMENTEXAMPLE
使用alter table xxx move lob(xx) store as xxx (tablespace xxx);命令,我们可以进行lob列的存储位置调节。
在创建数据表的时候,同样可以使用lob(xxx)对应的数据表空间字句,执行存储lob对象的空间信息。
sql> Create table DemoLob ( A number,B clob )
2LOB(b)
3STORE AS lobsegname (
4TABLESPACEusers
5--STORAGE (lobsegment storage clause)
6INDEX lobindexname (
7TABLESPACE example
8--STORAGE ( lobindex storage clause )
9)
10)
11TABLESPACEsystem
12--STORAGE( tables storage clause )
13;
sql> select table_name,column_name,segment_name,tablespace_name,index_name from user_lobs;
TABLE_NAME COLUMN_NAM SEGMENT_NAMetaBLESPACE_NAMEINDEX_NAME
---------- ---------- ------------------------------ ------------------------------ ------------------------------
TCLT_LOGSEGMENTEXAMPLESYS_IL0000056069C00002$$
在实际物理设计部署过程中,经常有将大对象分区和存储单独部署表空间的情况。可以根据实际的情况,将一些很大的lob列连同索引保存在单独的表空间上。
但是注意,一般数据表而言,lob段和lobindex段是在一个表空间上。即使在sql语法上存在支持,但是将lob段和lobindex分开存储的语句通常被忽略掉。
sql> alter table t move lob(cl) store as T_LOGSEGMENT (tablespace example index t_logindex (tablespace users));
SYS_IL0000056069C00002$$LOBINDEXEXAMPLE
T_LOGSEGMENTLOBSEGMENT EXAMPLE
4、结论
Lob类型是一种我们经常使用的复杂数据类型。处理和管理lob类型的方法和我们常规的手段存在很大差异,无论是开发还是运维过程中都要特别注意。
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
oracle 索引 lob 迁移,Oracle Lob类型存储浅析( alter index lob索引 rebuild tablespace XX报错问题)...相关推荐
- oracle 9i aix 迁移,Oracle 9i 在AIX上的安装 (转)
■可以删除原有的.cpio文件腾出剩余的空间 2.检查要求 检查附录1的表格系统要求的内容 3.预安装 ■完成安装任务 □以Root用户登录 □建立目录/oracle,此目录下至少有3G以上的空间,见 ...
- oracle 分区表空间迁移,oracle分区表的迁移
使用exp/imp导出导入分区表数据 1.分区表状态 SQL> select count(*) from test123; COUNT(*) ---------- 262145--------- ...
- oracle大于号怎么用,解决MyBatis的mapper中SQL小于号或大于号报错-tag name expected
通常写SQL我们都会在Navicat里面写好条件测试没问题之后才会把SQL放到mapper里面,有次我在写Oracle的分页的时候因为用到了<=符号,在Navicat测试的时候是没问题的,但是放 ...
- python安装报错类型_Python处理验证码第一篇(pytesser初探及报错处理)
前言: 春节期间,无法全身心投入地去写爬虫,那就玩玩验证码吧,应该比较有趣! 首次接触验证码识别,用pytesser接触一下最简单的验证码先,代码参照:使用python以及工具包进行简单的验证码识别. ...
- mysql 存储微信昵称乱码_MYSQL 保存微信昵称特殊字符报错解决方法-设置编码集为utf8mb4的方法...
mysql utf8mb4 保存微信昵称特殊字符报错方法 公众号二次开发,在处理用户昵称的时候发现有的时候一些emoji是4字节的表情无法保存入库,经过查找资料发现是因为字段的编码问题造成的, utf ...
- long类型转成integer类型避免空指针的方法_解决swagger的类型转换报错问题
今天发现项目启动时,会打印一堆报错.吓了一跳. 查看之后发现是swagger的错误提示.并不影响功能.但是看着一堆错误,也闹心不是? 所以还是要解决一下. 2020-11-04 10:50:46,38 ...
- oracle 索引 lob 迁移,Oracle 11g到19c迁移TB级lob表的酸爽
从Oracle数据库官方服务支持生命周期表我们可以清晰看到Oracle11g已过主支持生命周期,2020年后不再支持,取而代之的是12C及以上版本. 基于这个背景,大部分的客户开始了新一轮的数据库升级 ...
- oracle alter增加索引,sql – Oracle alter index允许索引空值
你现在至少有四种选择: >创建"常量表达式"索引- create index half_null_col_idx on huge_table (half_null_col, ...
- oracle 01405 提取的值为null,ORA-01405: 提取的列值为 NULL--报错原因及解决方案
报错信息:ORA-01405: 提取的列值为 NULL 问题出现原因:形如 SELECT a INTO :a FROM NewXCData WHERE a = 'test'; 如果a的值为空,则会报此 ...
- Oracle 4dae,如何处理Python-CXOracle中未知词的错误报告问题,pythoncxOracle,查询,到,生僻字,报错...
关于编码 GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字. GB18030编码向下兼容GBK和GB2312,兼容的含义是不 ...
最新文章
- mysql cert_Mysql使用SSL连接
- 笔记本电脑真香,包邮送一台!
- 自定义leftBarButtonItem的button
- 手机内部零件名称图解_外协加工:200件零件/机加件配套加工
- TensorFlow全新的数据读取方式:Dataset API入门教程
- BZOJ1800 [Ahoi2009]fly 飞行棋 其他
- java testng 优化_java+testNG测试框架搭建----jenkins自动化执行
- rsa 模数 指数转换 c语言_模数转换,你必须知道的8个经典ADC转换电路方案
- python如何加密字符串_Python实现对字符串的加密解密方法示例
- Windows Phone 7 有损 缩略图的生成!
- iOS照片缩略图thumbnail模糊问题
- Java程序向MySql数据库中插入的中文数据变成了问号
- 计算机一级考试自测题,计算机一级B考试自测题
- Android 通话录音功能
- 怎样用投资的逻辑来填报志愿?
- pandas将excel中多行多列单元格含有多个值拆分为一对一单行显示的方法(explode函数)
- 不熟悉的四级核心词汇(四)
- 奥塔哥理工学院 计算机,新西兰留学:19所国立理工学院清单及地理位置
- 【语音识别】食物声音识别(四)音频数据特征提取
- Error response from daemon: conflict: unable to delete 927899a31456 (cannot be forced) - image is be
热门文章
- 电石炉技术的发展及电石炉尾气解决方案
- 为什么我要弃用Snapchat?
- PMP考纲解读 |【人】任务3—支持团队绩效(二)
- windows 7家庭版升级为旗舰版 序列
- 计算机运行黑屏显示器正常,主机正常运行显示器黑屏怎么办_主机正常运行显示器黑屏的处理办法...
- linux下企业邮件服务器的搭建
- delphi 水晶按钮
- 【Java】【MySnake】仿贪吃蛇小游戏开源代码(持续更新)
- android app 图片资源,Android App 瘦身总结 第一章 图片资源的优化处理
- java简述什么是事务_java什么是事务意思概念