Oracle如何将用户下的一个表空间的数据迁移到另一个表空间

说明

前提是我们没有dba权限,然后我们要从USERS表空间迁移到自定义表空间,以下代码命名为"DIY_TABLESPACE",将其替换为你实际的目的表空间既可。

1. 查看当前USERS表空间下的对象

复制代码
-- 查看用户下所有表所在的表空间
SELECT table_name, tablespace_name 
FROM user_tables 
WHERE tablespace_name = 'USERS';

-- 查看用户下所有索引所在的表空间  
SELECT index_name, table_name, tablespace_name
FROM user_indexes
WHERE tablespace_name = 'USERS';

-- 查看用户下所有分区表的分区所在表空间
SELECT table_name, partition_name, tablespace_name
FROM user_tab_partitions
WHERE tablespace_name = 'USERS';

-- 查看用户下所有LOB字段所在的表空间
SELECT table_name, column_name, segment_name, tablespace_name
FROM user_lobs
WHERE tablespace_name = 'USERS';

2. 迁移表到新表空间

复制代码
-- 迁移单个表
ALTER TABLE 表名 MOVE TABLESPACE DIY_TABLESPACE;

-- 批量生成迁移语句(推荐)
SELECT 'ALTER TABLE ' || table_name || ' MOVE TABLESPACE DIY_TABLESPACE;'
FROM user_tables
WHERE tablespace_name = 'USERS';

3. 迁移索引到新表空间

复制代码
-- 重建索引到新表空间
ALTER INDEX 索引名 REBUILD TABLESPACE DIY_TABLESPACE;

-- 批量生成重建索引语句(推荐)这里面会出现一些命名中带$的索引会报失败,先跳过,等执行完clob再看看应该就没有了
SELECT 'ALTER INDEX ' || index_name || ' REBUILD TABLESPACE DIY_TABLESPACE;'
FROM user_indexes
WHERE tablespace_name = 'USERS';

4. 迁移LOB字段到新表空间

复制代码
-- 迁移表的LOB字段
ALTER TABLE 表名 MOVE LOB(LOB字段名) STORE AS (TABLESPACE DIY_TABLESPACE);

-- 批量生成迁移LOB语句(推荐)
SELECT 'ALTER TABLE ' || table_name || ' MOVE LOB(' || column_name || 
       ') STORE AS (TABLESPACE DIY_TABLESPACE);'
FROM user_lobs
WHERE tablespace_name = 'USERS';

5. 迁移分区表

复制代码
-- 迁移特定分区
ALTER TABLE 表名 MOVE PARTITION 分区名 TABLESPACE DIY_TABLESPACE;

-- 迁移所有分区(推荐)
SELECT 'ALTER TABLE ' || table_name || ' MOVE PARTITION ' || partition_name || 
       ' TABLESPACE DIY_TABLESPACE;'
FROM user_tab_partitions
WHERE tablespace_name = 'USERS';

6.检查索引状态,将离线的索引上线

复制代码
-- 生成所有失效索引的重建语句
SELECT 'ALTER INDEX ' || index_name || 
       ' REBUILD TABLESPACE DIY_TABLESPACE' || 
       ' ONLINE;' AS rebuild_sql
FROM user_indexes
WHERE status = 'UNUSABLE' ;

-- 将上一步的输出结果复制出来,作为脚本执行,以下是例子。
ALTER INDEX 索引名 REBUILD TABLESPACE 表空间名 ONLINE;

上面执行完之后再检查一下索引状态是不是VALID

select status from user_indexes;

6.验证迁移结果

复制代码
-- 查询为0正常
SELECT COUNT(*) 
FROM user_segments
WHERE tablespace_name = 'USERS';
相关推荐
睡不醒男孩03082311 分钟前
第七篇:揭秘 PostgreSQL 数据库内核级管控:CLup 深度架构设计与高可用底座技术白皮书
数据库·postgresql·clup
cmes_love1 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle
swordbob1 小时前
MySQL字符集陷阱:从Oracle迁移踩坑到utf8mb4强制规范
数据库·sql
牛油果子哥q1 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
十五年专注C++开发1 小时前
MySql中各种功能用sql语句实现总结
数据库·sql·mysql
数据库小学妹2 小时前
AI时代数据库怎么选?多模融合、数据统一存储与选型实战指南
数据库·人工智能·经验分享·ai
Albert Edison2 小时前
【Redis】Centos7.9 安装 Redis 5 教程
数据库·redis·缓存
云计算磊哥@2 小时前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
小二·2 小时前
Redis 内存溢出(OOM)排查与恢复实战
数据库·redis·bootstrap
pqk6V6Vep2 小时前
Redis 分布式锁进阶第一篇讲解
数据库·redis·分布式