LOB类型数据的MOVE

简介: 近日,新接手了一个数据库。检查某系统的时候发现,部分数据表存储在USERS表空间下了。我们怎么对LOB进行管理呢?

近日,新接手了一个数据库。检查某系统的时候发现,部分数据表存储在USERS表空间下了。

我们需要整理数据库对象至相对应的业务表空间中去

以下几个数据库对象在users表空间中:

select segment_name , segment_type , owner from dba_segments where TABLESPACE_NAME='USERS' AND OWNER='&OWNER_NAME';
SQL> select segment_name , segment_type , owner from dba_segments where TABLESPACE_NAME='USERS' AND OWNER='&OWNER_NAME';
Enter value for owner_name: IVYDD
old   1: select segment_name , segment_type , owner from dba_segments where TABLESPACE_NAME='USERS' AND OWNER='&OWNER_NAME'
new   1: select segment_name , segment_type , owner from dba_segments where TABLESPACE_NAME='USERS' AND OWNER='IVYDD'


SEGMENT_NAME                                 SEGMENT_TYPE       OWNER
-------------------------------------------- ------------------ -----------------------------
IVY_TEST                                     TABLE              IVYDD
EVAL_CONTACT                                 TABLE              IVYDD
SYS_IL0000089558C00006                      LOBINDEX           IVYDD
SYS_LOB0000089558C00006                    LOBSEGMENT         IVYDD

* 由于编辑器显示$字符异常,特此说明,segments_name 名称后都带有两个$$,文章下面将会省略这两个字符

  • 发现USERS表空间下有两个LOB类型文件。
  • 并且无法看出lob类型的segment所对应的表名。

说明:
对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列共生,如果强制进行删除操作,是会报错的。

查看lob所对应的表名,以及该表上那个字段为lob类型:

col COLUMN_NAME for a20
SELECT owner , table_name , COLUMN_NAME ,  SEGMENT_NAME , TABLESPACE_NAME , INDEX_NAME FROM DBA_LOBS WHERE OWNER='IVYDD' AND SEGMENT_NAME like 'SYS_LOB0000089%';


OWNER                          TABLE_NAME                     COLUMN_NAME          SEGMENT_NAME                   TABLESPACE_NAME                INDEX_NAME
------------------------------ ------------------------------ -------------------- ------------------------------ ------------------------------ ------------------------------
IVYDD                          EVAL_CONTACT                   CONTEXT              SYS_LOB0000089558C00006    USERS                          SYS_IL0000089558C00006

以上我们可以确定那两个LOB是属于:

  • 数据表: IVYDD.EVAL_CONTACT
  • LOB字段:CONTEXT

通常我们需要移动表至另一个表空间时,最常用的命令方法是使用move进行对象移动。

SQL> select segment_name, segment_type, tablespace_name from user_segments;

 

SEGMENT_NAME                   SEGMENT_TY TABLESPACE_NAME
------------------------------ ---------- ------------------------------
EVAL_CONTACT                 TABLE      USERS
SYS_LOB0000089558C00006      LOBSEGMENT USERS
SYS_IL0000089558C00006       LOBINDEX   USERS

3 rows selected

 
SQL> alter table t move tablespace tbs_ivy;
Table altered


SQL> select segment_name, segment_type, tablespace_name from user_segments;

 

SEGMENT_NAME                   SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------
EVAL_CONTACT                    TABLE        TBS_IVY
SYS_LOB0000089558C00006         LOBSEGMENT   USERS
SYS_IL0000089558C00006          LOBINDEX     USERS


SQL> alter index SYS_IL0000089558C00006 rebuild tablespace TBS_IVY;


ORA-02327: 无法以数据类型 LOB 的表达式创建索引
  • 可以看到用我们常用的move方法进行无法移动LOB对象的。
  • 并且也不能使用rebuild方法对LOB INDEX进行重建。

那么我们应该怎么办呢!? 敲黑板啦~~

alter table IVYDD.EVAL_CONTACT move tablespace USERS lob(CONTEXT) store as (tablespace TBS_IVY);

Table altered

SQL> select segment_name, segment_type, tablespace_name from user_segments;

 

SEGMENT_NAME                   SEGMENT_TY TABLESPACE_NAME

------------------------------ ---------- ------------------------------
EVAL_CONTACT                    TABLE        TBS_IVY
SYS_LOB0000089558C00006         LOBSEGMENT   TBS_IVY
SYS_IL0000089558C00006          LOBINDEX     TBS_IVY

使用alter table xxx move lob(xx) store as xxx (tablespace xxx);命令,我们可以进行lob列的存储位置调节。

在创建数据表的时候,同样可以使用lob(xxx)对应的数据表空间字句,执行存储lob对象的空间信息。

心得

在实际物理设计部署过程中,经常有将大对象分区和存储单独部署表空间的情况。可以根据实际的情况,将一些很大的lob列连同索引保存在单独的表空间上。

但是注意,一般数据表而言,lob段和lobindex段是在一个表空间上。即使在SQL语法上存在支持,但是将lob段和lobindex分开存储的语句通常被忽略掉。

alter table IVYDD.TABLE_NAME move tablespace TBS_TARGET;

alter table IVYDD.TABLE_NAME move tablespace USERS lob(LOG_COL) store as (tablespace TBS_TARGET);
目录
相关文章
|
数据挖掘 大数据 定位技术
精准定位目标客户群市场调研
精准定位目标客户群市场调研
589 2
|
安全 算法 API
OpenSSL支持哪些加密算法?
【10月更文挑战第4天】OpenSSL支持哪些加密算法?
882 5
|
9月前
|
人工智能 自然语言处理 并行计算
MeteoRA:多任务AI框架革新!动态切换+MoE架构,推理效率提升200%
MeteoRA 是南京大学推出的多任务嵌入框架,基于 LoRA 和 MoE 架构,支持动态任务切换与高效推理。
356 3
阿里云国际版提交工单后需要多久才能解决问题
阿里云国际版提交工单后需要多久才能解决问题
|
10月前
|
安全 算法 数据可视化
工厂人员定位管理系统:提升生产效率、保障作业安全
在智能制造与工业4.0背景下,工厂人员定位管理系统成为提升生产效率和保障作业安全的关键工具。本文详解该系统的核心功能,包括实时定位、历史轨迹回放、巡更打卡、离岗警告及超员/超时提醒,展示其智能化、高效化和安全化的全面优势。通过高精度定位基站与智能算法,系统不仅优化了生产流程,还有效预防了安全事故,助力企业实现高效、智能的生产管理。维小帮提供相关技术文档与专业咨询,助您探索更智能的生产管理之道。
359 11
|
存储 关系型数据库 MySQL
深入解析MySQL数据存储机制:从表结构到物理存储
深入解析MySQL数据存储机制:从表结构到物理存储
1446 1
|
缓存 资源调度 JavaScript
万字总结webpack实战案例配置
该文章总结了Webpack在实际项目中的配置案例,包括如何配置多页面应用、使用高级插件、优化构建速度及减少输出文件大小等方面的实战经验。
|
存储 NoSQL 算法
MongoDB保姆级指南(中):从副本集群、分片集群起航,探索分布式存储的趋势!
本文一起来聊聊MongoDB集群,顺带以MongoDB集群为起点,共同探讨一下分布式存储的发展趋势~
2710 15
|
机器学习/深度学习 Oracle 关系型数据库
Oracle 19c单机一键安装脚本分享
Oracle 19c单机一键安装脚本分享
666 2
|
存储 安全 测试技术
【超实用却暗藏杀机】sshpass:一键免密SSH登录的神器,为何生产环境却要敬而远之?探秘背后的安全隐患与替代方案!
【8月更文挑战第16天】sshpass 是一款便捷工具,可实现自动化SSH登录,简化脚本中的远程连接流程。通过后台自动处理密码输入,便于执行远程操作,如 `sshpass -p 'yourpassword' ssh user@remotehost`。也可结合更多SSH选项使用,例如指定私钥文件。然而,因需明文传递密码,存在较大安全隐患,不适于生产环境;推荐使用公钥认证以增强安全性。
1046 4