绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
如何在线将long数据类型修改为clob--LOB数据压缩带来问题的处理,long不支持move操作
2020-11-21 10:01:12

近协助客户做空间回收,用户发现备份的数据太大,根据业务情况删除了部分数据,但是发现空间并没有下降多少,他们也发现这个表

LOB字段,这些字段的空间没有释放,希望协助释放这些空间。

这个空间收缩任务在我上篇文章中已经说明,使用move表的方式实现,也可以使用shrink lob段的方式,这里我们解决一个字段转换的方法

用户之前的某个表字段类型为long造成了move表或者shink lob方式报错,也即是long字段不支持这个操作,虽然经过查询用户表的该字段都是null

值。所以,这里需要做数据类型转换,将long 转换为clob或者blob

这里我们做一个测试,该测试基于MOS文档Doc ID 251417.1。这里需要注意,原表必须要有主键。下面是具体步骤

[oracle@rac1 ~]$ sqlplus / as sysdba


SQL*Plus: Release 11.2.0.4.0 Production on Sat Nov 21 08:56:35 2020


Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Real Application Clusters and Automatic Storage Management options


SYS@orcl1>connect test/oracle


Connected.

TEST@orcl1>show user;

USER is "TEST"

1 创建测试表 插入数据

TEST@orcl1>CREATE TABLE TLONG (ID NUMBER PRIMARY KEY, SOME_FILE LONG);


Table created.

TEST@orcl1>insert into tlong values (1,'duiheduedfefefj');


1 row created.


Elapsed: 00:00:00.04

TEST@orcl1>commit;

Commit complete.

Elapsed: 00:00:00.00

TEST@orcl1>select * from tlong;


        ID SOME_FILE

---------- --------------------------------------------------------------------------------

         1 duiheduedfefefj


Elapsed: 00:00:00.01


2 创建中间表tlob tlong相同表结构,注意对应字段为clob类型,来代替tlong中的long类型。这个表不需要主键

TEST@orcl1>CREATE TABLE TLOB (ID NUMBER, SOME_FILE CLOB);


Table created.


Elapsed: 00:00:00.01

TEST@orcl1>desc tlob

 Name                                                              Null?    Type

 ----------------------------------------------------------------- ----

 ID                                                                         NUMBER

 SOME_FILE                                                        CLOB


3 测试表tlong具备在线中定义的条件

TEST@orcl1>EXECUTE DBMS_REDEFINITION.CAN_REDEF_TABLE('test','tlong', dbms_redefinition.cons_use_pk);


PL/SQL procedure successfully completed.


Elapsed: 00:00:00.01


4 实施重定义

TEST@orcl1>EXECUTE DBMS_REDEFINITION.START_REDEF_TABLE('test','tlong','tlob', 'id id, to_lob(some_file) some_file', dbms_redefinition.cons_use_pk);


PL/SQL procedure successfully completed.


Elapsed: 00:00:00.74



5 配置在表tlob上自动创建数据库对象如触发器,索引和约束,具体参数需求根据实际情况可以调整

TEST@orcl1>EXECUTE DBMS_REDEFINITION.START_REDEF_TABLE('test','tlong','tlob', 'id id, to_lob(some_file) some_file', dbms_redefinition.cons_use_pk);


PL/SQL procedure successfully completed.


Elapsed: 00:00:00.74

TEST@orcl1>declare

  2  num_errors BINARY_INTEGER;

  3  BEGIN

  4  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('test' ,'tlong','tlob',0,TRUE,TRUE,TRUE,FALSE,num_errors,TRUE,FALSE);

  5  END;

  6  /


PL/SQL procedure successfully completed.


Elapsed: 00:00:05.06



6 同步数据,这个步骤可选,主要是加快数据同步,在第4步已经开始同步数据。

TEST@orcl1>EXECUTE DBMS_REDEFINITION.SYNC_INTERIM_TABLE('test', 'tlong','tlob');


PL/SQL procedure successfully completed.


Elapsed: 00:00:00.06


7 完成表的在线中定义

TEST@orcl1>EXECUTE DBMS_REDEFINITION.FINISH_REDEF_TABLE('test','tlong','tlob');


PL/SQL procedure successfully completed.


Elapsed: 00:00:02.96

TEST@orcl1>desc tlong;

 Name                                                                                                              Null?    Type

 ----------------------------------------------------------------------------------------------------------------- -------- 

 ID                                                                                                                         NUMBER

 SOME_FILE                                                                                                                  CLOB

TEST@orcl1>select * from tlong;


        ID SOME_FILE

---------- --------------------------------------------------------------------------------

         1 duiheduedfefefj


Elapsed: 00:00:00.00


8 删除中间表

TEST@orcl1>drop table tlob purge;


Table dropped.


Elapsed: 00:00:00.19

Oracle的表在线重定义,通过中间表将数据,库对象同步过来,修改原始表字段类型等操作,业务小化业务影响,Oracle只有想不到,没有XXX


测试完毕!

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Oracle运维新鲜事-技术与管理各占半边天
创建时间:2020-08-04 11:34:57
本技术栈旨在分享技术心得,运维趣事,故障处理经验,调优案例,故障处理涉及集群,DG,OGG,大家生产中遇到的问题基本都会囊括了,我会发布生产库遇到的故障,希望在交流中互助互益,共同提高,也希望大家讨论,如果您有生产中遇到的集群问题,也可以在这里提出来,一起讨论,现实中也帮助不少同学解决了生产库的故障。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • Abraham林老师
    栈主
  • 小雨滴
    嘉宾
  • hawkliu
    嘉宾
  • u_97a59a25246404
    嘉宾

小栈成员

查看更多
  • 栈栈
  • dapan
  • 小菜鸟___
  • hwayw
戳我,来吐槽~