更改 undo_retention 时,Lob retention 不更改 (Doc ID 563470.1)
Lob retention not changing when undo_retention is changed (Doc ID 563470.1)
APPLIES TO:
Oracle Database - Enterprise Edition - Version 8.1.7.4 to 10.2.0.5 [Release 8.1.7 to 10.2]
Oracle Database Exadata Cloud Machine - Version N/A and later
Oracle Cloud Infrastructure - Database Service - Version N/A and later
Oracle Database Exadata Express Cloud Service - Version N/A and later
Oracle Database Cloud Exadata Service - Version N/A and later
Information in this document applies to any platform.
Checked for relevance on 09-Jul-2012
SYMPTOMS
In 10g we have no control over the actual setting for RETENTION for lobs other than the current setting for UNDO_RETENTION at the time of the creation or modification of the LOB.
在10g中,除了创建或修改LOB时当前对UNDO_RETENTION的设置外,我们无法控制对lob的RETENTION的实际设置
Stopping and starting the database will not modify the setting as it seems to be static.
停止和启动数据库不会修改设置,因为它似乎是静态的
It is assumed that when UNDO_RETENTION is changed the lobs connected to that retention are also changed which is not the case . (this is incorrect)
假定当UNDO_RETENTION更改时,与该保留连接的叶也将更改,情况并非如此。(这是不正确的)
If a lob is modified from RETENTION to PCTVERSION and back to RETENTION again then the lob retention is updated based on the current UNDO_RETENTION at the time that the LOB was altered / created to use RETENTION.
如果将lob从RETENTION修改为PCTVERSION,然后再次返回RETENTION,则基于更改/创建LOB以使用RETENTION时的当前UNDO_RETENTION来更新lob保留
In 11g we allow users to specify retention for each LOB segment
在11g中,我们允许用户为每个LOB段指定保留时间
Current documentation reads
Oracle� Database Application Developer's Guide - Large Objects
10g Release 2 (10.2)
Part Number B14249-01
4 LOBs in Tables
RETENTION
As an alternative to the PCTVERSION parameter, you can specify the RETENTION parameter in the LOB storage clause of the CREATE TABLE or ALTER TABLE statement. Doing so, configures the LOB column to store old versions of LOB data for a period of time, rather than using a percentage of the table space.
作为PCTVERSION参数的替代方法,可以在CREATE TABLE或ALTER TABLE语句的LOB存储子句中指定RETENTION参数。 这样做,将LOB列配置为在一段时间内存储LOB数据的旧版本,而不是使用表空间的一定百分比。
For example:
CREATE TABLE ContainsLOB_tab (n NUMBER, c CLOB) lob (c) STORE AS SEGNAME (TABLESPACE lobtbs1 CHUNK 4096 RETENTION NOCACHE LOGGING STORAGE (MAXEXTENTS 5) );
The RETENTION parameter is designed for use with Undo features of the database, such as Flashback Versions Query.When a LOB column has the RETENTION property set, old versions of the LOB data are retained for the amount of time specified by the UNDO_RETENTION parameter.
RETENTION参数设计用于与数据库的undo功能一起使用,例如闪回版本查询。当LOB列设置了RETENTION属性时,LOB数据的旧版本将保留由UNDO_RETENTION参数指定的时间。
Note the following with respect to the RETENTION parameter:
关于RETENTION参数,请注意以下几点:
* Undo SQL is not enabled for LOB columns as it is with other datatypes. You must set the RETENTION property on a LOB column to use Undo SQL on LOB data.
* 与其他数据类型一样,未为LOB列启用undo SQL。 您必须在LOB列上设置RETENTION属性,才能对LOB数据使用Undo SQL。
* You cannot set the value of the RETENTION parameter explicitly. The amount of time for retention of LOB versions in determined by the UNDO_RETENTION parameter.
* 您不能显式设置RETENTION参数的值。 保留LOB版本的时间由UNDO_RETENTION参数确定。
* Usage of the RETENTION parameter is only supported in Automatic Undo Management mode. You must configure your tablefor use with Automatic Undo Management before you can set RETENTION on a LOB column.
* 仅在“自动undo管理”模式下支持使用RETENTION参数。 必须先配置表以供“自动undo管理”使用,然后才能在LOB列上设置RETENTION。
* The LOB storage clause can specify RETENTION or PCTVERSION, but not both.
* LOB存储子句可以指定RETENTION或PCTVERSION,但不能同时指定两者。
CAUSE
Problem is caused as current documentation not fully explaining how lob retention works.
由于当前文档未完全说明lob保留的工作原理而导致了问题
SOLUTION
Here is example of the problem. 这是问题的例子
SQL> CREATE TABLE lobretention (LOBLOC blob,id NUMBER) LOB ( lobLoc ) STORE AS (TABLESPACE users STORAGE (INITIAL 5k NEXT 5k PCTINCREASE 0) retention); SQL> select retention from dba_lobs where table_name='LOBRETENTION'; RETENTION ---------- 1400 SQL> show parameter undo_retention; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_retention integer 1400 SQL> alter system set undo_retention= 1800 scope=both; System altered. SQL> select retention from dba_lobs where table_name='LOBRETENTION'; RETENTION ---------- 1400 SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup SQL> connect test/test Connected. SQL> select retention from dba_lobs where table_name='LOBRETENTION'; RETENTION ---------- 1400 SQL> show parameter undo_retention; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_retention integer 1800 SQL> alter table lobretention modify lob(lobLoc) (pctversion 5); Table altered. SQL> alter table lobretention modify lob(lobLoc) (retention); Table altered. SQL> select retention from dba_lobs where table_name='LOBRETENTION'; RETENTION ---------- 1800