服务器 频道

Oracle数据库中行迁移/行链接的问题之二

  方法三:使用TOAD工具清除行迁移的方法
  
  1. 备份要清除RM的表。
  
  RENAME table_name TO table_name_temp;
  
  2. Drop 所有其它表上关联到table_name的外键限制。
  
  SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME from USER_CONSTRAINTS where R_CONSTRAINT_NAME in (SELECT CONSTRAINT_NAME from USER_CONSTRAINTS where TABLE_NAME=''table_name'' AND CONSTRAINT_TYPE=’P’);
  
  ALTER TABLE table_name DROP CONSTRAINT XXXX;(XXXX为上述的查询结果)
  
  3. 重建1中被rename的表。
  
  CREATE TABLE table_name AS SELECT * FROM table_name_temp WHERE 0 = 1;
  
  4. 重建表中原来的数据。
  
  INSERT /*+ APPEND */ INTO table_name SELECT * FROM table_name_temp;
  
  5. 删除在table_name_temp上的索引和关联其他表的外键。
  
  6. 在table_name上建立和原来一样的索引、主键和所有的外键限制。
  
  7. 重新编译相关的存储过程、函数和包。
  
  8. 删除表table_name_temp。
  
  对于使用这种方法来清除行迁移,全部的代码都是可以由TOAD工具来生成的。由于此方法把表上的关联考虑进去了,也是一种比较的全面的考虑的一种清除方法,而且在清除过程中重建了表和索引,对于数据库的存储和性能上都有提高。因为这种方法一开始是rename表为临时表,然后重建一个新表出来的,因此需要两倍的表的空间,因此在操作之前一定要检查要清除的表所在的表空间的free空间是否足够;但是也有一定的缺陷,因为在新表中重新插入原来的数据后需要重建索引和限制,因此在时间和磁盘的空间上都有比较大的开销,而且对于前台的应用可能会有一段时间的中断,当然,这个中断时间就主要是消耗在重建索引和重建限制上了,而时间的长短跟需要重建索引和限制的多少以及表的记录多少等等因素都有关系。使用这种方法对于7*24小时要求的系统上清除行迁移不是很合适,因为使用这种方法会导致系统可能有一段时间的停机,如果系统的实时性比较高,这种方法就不是很适用了。
  
0
相关文章