如何将分区移动到新表空间_实现历史数据归档至廉价SATA磁盘

老婷姑娘_8764

老婷姑娘_8764

2026-03-28

748人浏览

原创

ALTER TABLE … MOVE PARTITION 是全量物理迁移,非元数据操作;会致本地索引失效、需重建,全局索引默认失效;须检查表空间空间、分区实际占用及索引状态,并注意 SATA 表空间需调优参数。

ALTER TABLE … MOVE PARTITION 会重建整个分区数据

这个操作不是简单改个元数据指针,而是把分区里所有行读出来、按新表空间的存储参数重新写一遍。实际就是一次全量物理迁移,io 和锁开销都很大。

常见错误现象:ORA-01652(无法扩展临时段)频繁出现,因为排序和重建过程大量依赖 TEMP 表空间;或者迁移中途被 kill,分区处于不可用状态。

  • 必须确保目标表空间(比如 ARCHIVE_TBS)已存在,且有足够空闲空间 —— 建议预留至少 1.5 倍原分区大小
  • 迁移期间该分区不可 DML(INSERT/UPDATE/DELETE),但其他分区不受影响
  • 如果表上有本地索引(LOCAL INDEX),MOVE PARTITION 后索引会自动变为 UNUSABLE,必须立刻重建:ALTER INDEX idx_name REBUILD PARTITION p_old;
  • 全局索引(GLOBAL INDEX)默认会失效,加 UPDATE GLOBAL INDEXES 子句可避免,但会显著拖慢执行时间

如何确认分区当前所在表空间及大小

别凭记忆或 DBA 邮件判断,直接查数据字典最准。尤其要注意:一个表的不同分区可能已在不同表空间,归档前必须逐个核对。

常用查询:

SELECT partition_name, tablespace_name, bytes/1024/1024 AS mb
FROM dba_segments 
WHERE segment_name = 'YOUR_TABLE_NAME' 
  AND segment_type = 'TABLE PARTITION'
ORDER BY partition_name;
  • dba_segments 查的是已分配空间,dba_tab_partitions 查的是逻辑定义(比如 tablespace_name 默认值),两者不一致时以 dba_segments 为准
  • 如果某分区返回空行,说明它还没被插入过数据,也未分配区(extents),此时 MOVE 会报错 ORA-14257
  • 对超大分区(>100GB),建议先用 DBMS_SPACE.SPACE_USAGE 估算实际占用,避免误判空闲空间

MOVE PARTITION 后索引和约束的状态变化

这是最容易翻车的地方 —— 表能查了,应用却报错,八成是索引没跟上。

本地索引分区在 MOVE 后立即变成 UNUSABLE,但不会报错;查询走不到它,优化器直接跳过,性能断崖下跌。

  • 检查索引状态:SELECT index_name, status, partition_name FROM dba_ind_partitions WHERE index_name = 'IDX_NAME';
  • 重建单个分区索引:ALTER INDEX idx_name REBUILD PARTITION p_2022q1;
  • 外键约束不受影响,但主键如果是本地分区索引,同样要重建 —— 否则 INSERT 可能违反唯一性而不报错
  • 不要用 REBUILD UNUSABLE INDEXES 批量操作,容易误伤正在使用的索引分区

归档到 SATA 磁盘前的表空间配置要点

廉价 SATA 盘吞吐低、随机 I/O 差,不能照搬 SSD 表空间的参数,否则迁移慢、运行也慢。

关键差异点:

  • 关闭 LOGGING(除非业务要求强一致性):ALTER TABLESPACE archive_tbs NOLOGGING; —— 能提速 3–5 倍,但意味着该表空间内操作无法通过归档日志恢复
  • INITIAL 和 NEXT 区大小设大些(如 64M),减少区分配次数;PCTINCREASE 设为 0,避免小碎片
  • 禁用自动段空间管理(ASSM)?不推荐。SATA 盘更需要 ASSM 减少争用,但要把 BITMAP 段预分配够,避免运行时频繁扩展
  • 务必设置 DEFERRED_SEGMENT_CREATION=FALSE,否则新建分区可能不立即分配空间,后续 MOVE 会失败

真正麻烦的从来不是命令敲得对不对,而是迁移后没人去验证索引是否可用、统计信息是否更新、应用 SQL 执行计划有没有突变 —— 这些都得手动盯。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4303

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

911

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1109

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6221

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3063

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6180

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8361

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1130

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

992

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习