前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[DBA] 关于LOB RETENTION的知识共享

[DBA] 关于LOB RETENTION的知识共享

作者头像
SQLplusDB
发布2020-03-26 10:36:28
1.7K0
发布2020-03-26 10:36:28
举报

--------1.引子------------------------------------------------------------------

大家都知道,针对保存在LOB段中的LOB(非IN ROW LOB),Oracle用RETENTION这个参数来控制其UNDO数据的保存.

并且,根据LOB是SECUREFILE或是BASICFILE,RETENTION的设定方式及意义是有区别的.

在此基于SECUREFILE和BASICFILE,分享下我所知道的关于RETENTION的一些知识点.

※针对BASICFILE,也可以用PCTVERSION来控制其UNDO数据的保存,此参数不在本篇讨论.

--------2.BASICFILE及SECUREFILE的 LOB RETENTION的查看及修改----------------------------------------------

2-1.如何查看是否为BASICFILE或SECUREFILE

・查看表的DDL文.

・查看dba_lobs的SECUREFILE字段,YES为SECUREFILE,NO为BASICFILE.

・查看dba_segments的SEGMENT_SUBTYPE字段,SECUREFILE为SECUREFILE,ASSM或MSSM为BASICFILE.

*ASSM或MSSM继承于表空间的设定

2-2.BASICFILE的RETENTION

2-2-1.查看

查看dba_lobs的RETENTION字段.

该值可能为NULL或包含0在内的数字.

默认值和UNDO_RETENTION相同,900(秒).

有两种情况下此值为NULL: PCTVERSION不为NULL 或LOB为SECUREFILE.

2-2-2.更改

alter system set undo_retention= 1800;--首先修改undo_retention

alter table 表名 modify lob(LOB列) (retention);--将修改后的undo_retention同步到BASICFILE的retention

alter system set undo_retention= 900;--修改完后别忘了把undo_retention再变回去

*基于上述命令可以想见针对不同表的不同LOB字段分别设定不同的RETENTION

直接执行下面这句RETENTION会被设定为NULL

altertable lobretention modify lob(lobLoc) (pctversion 5);

--5代表UNDO数据占整个LOB段的总大小的比例

--LOB段的总大小为dba_segments的MAX_SIZE字段

--MAX_SIZE为block数

2-2-3.小贴士

如果BASICFILE是手动段管理(MSSM),如果LOB段中没有可利用空间的话,即使UNDO数据的保存时间没有超过设定的RETENTION,

也会被覆盖掉.反之自动段管理(ASSM)不会发生上述情况.

即使RETENTION被设定为0,如果LOB段中有可利用空间的话,UNDO数据也会被保存而不是提交之后马上就释放掉.

2-3.SECUREFILE的RETENTION

2-3-1.查看

查看dba_segments的RETENTION字段(好端端的搬什么家),根据需要一并查看MAX_SIZE或MINRETENTION.

RETENTION的可能值如下:

DEFAULT:创建LOB时未明确指定RETENTION情况下的默认值,实际动作同AUTO AUTO :系统根据tuened_retention及LOB段的查询语句最长执行时间(来自针对该LOB段的统计情报)自动调整 MAX :当LOB段的实际大小达到dba_segments的MAX_SIZE(block数)所指定的大小时,UNDO数据开始被覆盖 MIN :根据所指定的秒数(MINRETENTION)保存UNDO数据 NONE :基本不保存UNDO数据,UNDO数据会在事务提交后马上释放

2-3-2.更改

alter table 表名 modify lob (LOB字段名) (retentionAUTO);

alter table 表名 modify lob (LOB字段名) (retention MAXstorage(maxsize 70M));

alter table 表名 modify lob (LOB字段名) (retention MIN2000);

alter table 表名 modify lob (LOB字段名) (retentionNONE);

2-3-3.小贴士

一旦将DEFAULT改为别的值之后就不能再改回DEFAULT.这种情况下改为AUTO就行了,动作是一样的

下面这句不带maxsize的设定语句能够正常执行,但会设定为AUTO而不是MAX

alter table 表名 modify lob (LOB字段名) (retentionMAX)

-------- 3. LOB RETENTION相关实用TESTCASE-----------------------------------------------------

3.1 创建BASICFILE LOB

CREATE TABLE BLOB_TEST ( ID NUMBER,B_LOB BLOB);

CREATE TABLE CLOB_TEST ( ID NUMBER,C_LOB CLOB);

3.2 创建SECUREFILE LOB

create table SECUREFILE_TEST (

c0 clob,

c1 clob,

c2 clob,

c3 clob,

c4 clob,

c5 clob)

lob (c0) store as securefile c0_lobseg

lob (c1) store as securefile c1_lobseg (retention)

lob (c2) store as securefile c2_lobseg (retention none)

lob (c3) store as securefile c3_lobseg (retention min 250)

lob (c4) store as securefile c6_lobseg (retention max storage(maxsize 50M))

lob (c5) store as securefile c7_lobseg (retention auto);

3.3 插入长度4000以内的CLOB

insert into CLOB_TEST values('101',LPAD('a', 4000, 'a'));

*有兴趣的同学可以查查12C中新追加的参数MAX_STRING_SIZE

3.4 插入大长度的CLOB

DECLARE

bigtext clob default empty_clob();

BEGIN

bigtext:= LPAD('a', 32767, 'a');

dbms_lob.append(bigtext, LPAD('a', 32767, 'a'));--这句多写几个长度就上去了

insertinto CLOB_TEST values('100',bigtext);

commit;

END;

/

3.5 shi插入BLOB

创建一个Directory

create or replace directory TEST_BLOB as 'D:\TEST_BLOB';

OS中创建一个5M的测试文件(Windows为例)

fsutil file createnew D:\TEST_BLOB\5M.jpg 5242880

插入空LOB

insert into BLOB_TEST values('102',empty_blob());

commit;

把5M的文件更新到插入的空LOB中

declare

dest_lob blob;

src_lob bfile:=bfilename('TEST_BLOB','5M.jpg');

amount integer:=dbms_lob.getlength(src_lob);

begin

select B_LOB into dest_lob from MM0 where ID='102' for update;

dbms_lob.fileopen(src_lob);

dbms_lob.loadfromfile(dest_lob,src_lob,amount);

dbms_lob.fileclose(Src_lob);

commit;

end;

/

--------4.相关MOS文档-----------------------------------------------------

・Lob retention not changing when undo_retentionis changed (Doc ID 563470.1)

*看点:BASICFILE的RETENTION更改方法

・How to change retention of securefile Lobsegment (Doc ID 2175438.1)

*看点:SECUREFILE的RETENTION更改方法

・SECUREFILE Lob - Retention Not getting Updated(Doc ID 2174504.1)

*看点:还是SECUREFILE的RETENTION更改方法

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Oracle数据库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档