当前位置: 首页 > article >正文

Oracle之表空间迁移

问题背景:一个数据表随着时间的累积,导致所在表空间占用很高,里面历史数据可以清除,保留近2个月数据即可

首先通过delete删除了2个月以前的数据。

按网上的教程进行空间压缩,以下sql在表所在用户执行:

-- 允许表重新分配未使用的空间
ALTER TABLE your_table_name DEALLOCATE UNUSED;
 
-- 允许行移动,以便压缩表
ALTER TABLE your_table_name ENABLE ROW MOVEMENT;
 
-- 压缩表的空间
ALTER TABLE your_table_name SHRINK SPACE;
-- 或者(这个会报错,不知道什么原因)
ALTER TABLE your_table_name SHRINK STORAGE;

执行后依然不能降低表空间大小:

SELECT a.tablespace_name "表空间名",
       (total - free) "表占用空间大小",
       ROUND((total - free) / total * 100, 2) || '%' "已使用空间百分比"
  FROM (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
          FROM dba_data_files
         GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 free
          FROM dba_free_space
         GROUP BY tablespace_name) b
 WHERE a.tablespace_name = b.tablespace_name
 ORDER BY (total - free) DESC;

(1)创建新的表空间(sys用户下)

CREATE TABLESPACE new_tablespace DATAFILE 'path_to_datafile.dbf' SIZE 4096M AUTOEXTEND ON NEXT 500M MAXSIZE UNLIMITED;

new_tablespace:是新的表空间名称

path_to_datafile.dbf:表空间文件存储路径(绝对路径)

4096M:表空间初始空间大小

AUTOEXTEND ON NEXT 500M:表示空间不够时自动扩充,扩充空间位500M

MAXSIZE UNLIMITED:表示最大空间大小不设限制

(2)将表迁移到新的表空间(表所在用户)

alter table TABLE_NAME move tablespace new_tablespace;

TABLE_NAME:迁移的表名称

new_tablespace:迁移的新表空间

如果有索引的话,还需重建索引:

alter index index_name rebuild tablespace new_tablespace;

index_name:索引名

如果表中有lob字段,上面sql并不能把lob字段一起迁移到新表,因为clob字段会另外单独存储。应该使用:

ALTER TABLE my_table MOVE TABLESPACE new_tablespace INCLUDE LOB;

上面这个sql没试过,因为我先执行了上一条sql语句(不带lob字段)的迁移,结果删除表空间的时候提示还有字段在表空间,才发现clob没有迁移。

SELECT 
    SEGMENT_NAME, 
    SEGMENT_TYPE,
    TABLESPACE_NAME
FROM 
    DBA_SEGMENTS
WHERE 
    OWNER = 'SCOTT' AND (SEGMENT_TYPE like 'LOB%');

可以使用这个sql,查看lob字段所在的表空间。

如果你也先执行了第一条sql迁移表空间数据,那么可以使用下面这条sql,额外把lob字段迁移到新表空间

ALTER TABLE table_name MOVE TABLESPACE new_tablespace LOB(clob_column) STORE AS (TABLESPACE new_tablespace);

table_name:是表名,

new_tablespace:新表空间

clob_column:CLOB字段名(不需要单引号括起来直接写字段名)

(3)删除旧表空间(sys用户下)

DROP TABLESPACE CLOBS INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

此sql可能会比较耗时,请耐心等待。另外这只是在oracle中把表空间删除了,但物理文件还在,需要手动把物理文件删除
 


http://www.kler.cn/a/430092.html

相关文章:

  • Postman接口测试05|实战项目笔记
  • STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显
  • flutter 独立开发之笔记
  • uniapp获取安卓与ios的唯一标识
  • Mysql 性能优化:索引条件下推(ICP)
  • Cursor无限续杯——解决Too many free trials.
  • 爽解报错:/bin/bash^M: bad interpreter: No such file or directory
  • es 3期 第13节-多条件组合查询实战运用
  • mvn test 失败,单独运行单元测试成功
  • Mysql | 尚硅谷 | 第04章_运算符
  • RabbitMQ 实现分组消费满足服务器集群部署
  • SpringCloud提供的多维度解决方案:构建高效微服务生态系统
  • QT 12月5日练习
  • 11.12[CQU JAVEE_EXP3][JAVA WEB]3h速成JAVA WEB;DE启动Tomcat的各种BUG;GIT
  • 设计模式 在PLM系统的应用场景介绍
  • E卷-计算网络信号200分
  • Linux:Ext系列文件系统
  • 微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算
  • 深度学习(2)前向传播与反向传播
  • Python爬虫——猫眼电影
  • Linux setfacl lsattr chattr 命令详解
  • 什么是 k8s CNI ?
  • 研究生第一篇文献综述怎么写,文献检索,文章整理,文献归纳高效方法小技巧【学习笔记】
  • 解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败
  • 亚马逊云科技re:Invent大会:数据与AI如何颠覆企业未来?
  • Tr0ll: 1 Vulnhub靶机渗透笔记