批量迁移oracle表存储

简介:

场景:网友marine遇到问题,要求将某用户的表从表空间A移动到表空间B,用户表的个数在1000+以上
分析1:首先可以确定的是针对用户单张表移动表空间使用alter table table_name remove tablespace tablespace_name这种DDL语句实现;
其次需要查dba_tables视图找出改用户在A表空间上的表名称,然后将值保存为变量传递给for循环;
最后执行动态SQL,在PL/SQL中不可能直接执行DDL语句,因而需要使用execute immediate的方式执行动态SQL;
   
分析2:当然也可以去拼凑一个sql脚本,然后执行脚本达到这个效果,但执行效率肯定不如前者

 
  1. SQL> set echo off  
  2. SQL> set feedback off  
  3. SQL> set heading off  
  4. SQL> spool /home/oracle/move.sql  
  5. SQL> select 'alter table hr.' ||table_name || ' move tablespace TBS_APPLE ;'  
  6.   2  from dba_tables where owner='HR' and tablespace_name='EXAMPLE';  
  7.     
  8. [oracle@orcl ~]$ cat move.sql   
  9. alter table hr.REGIONS move tablespace TBS_APPLE ;                                
  10. alter table hr.LOCATIONS move tablespace TBS_APPLE ;                              
  11. alter table hr.DEPARTMENTS move tablespace TBS_APPLE ;                            
  12. alter table hr.JOBS move tablespace TBS_APPLE ;                                   
  13. alter table hr.EMPLOYEES move tablespace TBS_APPLE ;                              
  14. alter table hr.JOB_HISTORY move tablespace TBS_APPLE ; 

 模拟相关场景   
步骤一:新建表空间,查出用户所拥有的在A表空间上的表,这里的用户以HR为例,表空间以example为例

 
  1. SQL> create tablespace tbs_apple datafile '/u01/app/oracle/oradata/orcl/tbs_apple01.dbf'   
  2.    2 size 10M autoextend on next  10M maxsize 1G   
  3.    3 extent management local segment space management auto;  
  4.  
  5. SQL> select table_name from dba_tables where owner='HR' and tablespace_name='EXAMPLE';  
  6. TABLE_NAME  
  7. ------------------------------  
  8. REGIONS  
  9. LOCATIONS  
  10. DEPARTMENTS  
  11. JOBS  
  12. EMPLOYEES  
  13. JOB_HISTORY  
  14. 6 rows selected. 

步骤二:使用变量实现

 
  1. SQL> declare  
  2.   2  v_1 varchar2(200);  
  3.   3  begin  
  4.   4     select table_name into v_1 from dba_tables where owner='HR' and tablespace_name='EXAMPLE';  
  5.   5       begin  
  6.   6         for i in v_1  
  7.   7         loop  
  8.   8           execute immediate 'alter table  hr.'||v_1 || ' move tablespace example';  
  9.   9         end loop;  
  10.  10       end;  
  11.  11  end;    
  12.  12  /  
  13.        for i in v_1  
  14.                 *  
  15. ERROR at line 6:  
  16. ORA-06550: line 6, column 17:  
  17. PLS-00456: item 'V_1' is not a cursor  
  18. ORA-06550: line 6, column 8:  
  19. PL/SQL: Statement ignored 

以上报错,说明在PL/SQL中不可能直接将变量变成散列放进for循环,需要使用游标;而在shell脚本中可以轻易实现这点!


步骤三:使用游标
先从百度上搜索下游标的概念:
游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

 
  1. SQL> declare  
  2.   2      v_1   varchar2(200);  
  3.   3    cursor c_1 is  
  4.   4          select table_name from dba_tables where owner='HR' and tablespace_name='EXAMPLE';  
  5.   5  begin  
  6.   6      open c_1;  
  7.   7      fetch c_1 into v_1;  
  8.   8       while c_1%found  
  9.   9        loop  
  10.  10         execute immediate 'alter table  hr.'||v_1 || ' move tablespace tbs_apple';  
  11.  11         fetch c_1 into v_1;  
  12.  12        end loop;  
  13.  13      close c_1;  
  14.  14* end;  
  15.  15  /  
  16. PL/SQL procedure successfully completed. 

步骤四:验证结果

 
  1. SQL> select table_name from dba_tables where owner='HR' and tablespace_name='TBS_APPLE';  
  2.  
  3. TABLE_NAME  
  4. ------------------------------  
  5. REGIONS  
  6. LOCATIONS  
  7. DEPARTMENTS  
  8. JOBS  
  9. EMPLOYEES  
  10. JOB_HISTORY  
  11.  
  12. 6 rows selected. 

注意事项:迁移完用户的表后,要检查下表的索引是否需要迁移,另外要注意修改用户的默认永久表空间,根据需要来修改,否则用户新建的表又会存放到旧的表空间上;用户拥有的其他对象,例如视图,触发器,过程,包这些都存储在数据字典上,不需要进行迁移!

本文转自斩月博客51CTO博客,原文链接http://blog.51cto.com/ylw6006/656166如需转载请自行联系原作者


ylw6006

相关文章
|
3月前
|
Oracle 关系型数据库 数据库
Oracle查询优化-复制表的定义及数据
【1月更文挑战第5天】【1月更文挑战第14篇】在Oracle数据库中,复制表定义和复制表数据是两个常见的操作。
51 1
|
7月前
|
存储 SQL Oracle
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
68 0
|
6天前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
14天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
35 7
|
1月前
|
存储 Oracle 关系型数据库
Oracle系列之七:表的创建与管理
Oracle系列之七:表的创建与管理
|
4月前
|
Oracle 关系型数据库
Oracle - 表操作语句
Oracle - 表操作语句
25 0
|
7月前
|
Oracle 关系型数据库 数据库
Oracle数据库 查询所有表
Oracle数据库 查询所有表
117 1
|
7月前
|
Oracle 关系型数据库 分布式数据库
如何从Oracle迁移到PolarDB(ADAM)(二)
如何从Oracle迁移到PolarDB(ADAM)(二)
128 0
|
9月前
|
Oracle 关系型数据库 索引
Toad Oracle Parttion表分析
当一个数据表的数据达到几十亿笔的时候,对整个表做表分析代价较大。
74 0
|
10月前
|
Oracle 关系型数据库
【Oracle】建立关联三个表的视图
【Oracle】建立关联三个表的视图

推荐镜像

更多