Oracle数据库迁移

       Oracle数据库迁移有exp/imp,expdp/impdp等神器,但是各自也都有各自的限制(也可能是自己研究不到位)。

       exp要求用户和表空间一致,expdb要求用户名一致。但是如果新库和老库的表空间和用户名都不一致如何做迁移呢?

本文介绍借助pl/sql实现数据库的迁移。

1、导出建表结构

    通过Tables->右键"Export data"->选择"SQL INSERTS"->选择"Create tables"

    注意一定要"where clause处填写wherw 1=2表表示此处只选择表结构不导出数据。

image

2、创建触发器

     该步骤比较复杂:需要先创建一个"GET_VIEW_TEXT"函数来将user_triggers的

trigger_body转换为varchar2类型

CREATE OR REPLACE FUNCTION GET_VIEW_TEXT(tri_name varchar2) return varchar2 is
  var_var  varchar2(4000);
  long_var long;
begin
  BEGIN
        SELECT trigger_body
      INTO long_var
      FROM user_triggers
     WHERE trigger_name = tri_name
       and rownum < 2;
    var_var := substr(long_var, 1, 4000);
  END;
  return var_var;
end GET_VIEW_TEXT;

通过SQL获取触发器的创建语句

select 'create or replace trigger ' ||description ||
      GET_VIEW_TEXT(trigger_name) 
from user_triggers

3、视图

可以按昭3的方法来生成视图的创建语句,需要修改SQL语句。

  SELECT * FROM user_views 

4、dblink

按照老库的dblink在新库重建。在新库需要创建一个老库的dblink用于导数据使用。

5、其他对象

   通过如下SQL检查是否遗漏对象。

SELECT OBJECT_type,COUNT(*) FROM user_objects
GROUP BY OBJECT_type
ORDER BY object_type

6、根据时间导入数据

   选择数据完整的一个时间点,根据user_tables生成导入数据的SQL。

6、新建Sequence

可通过如下SQL语句获取需要创建Sequence的语句。

SELECT 'create sequence ' || SEQUENCE_NAME ||
' MINVALUE 1 MAXVALUE 999999999999999999999999999 start with ' ||
LAST_NUMBER || ' INCREMENT BY ' || INCREMENT_BY || ' CACHE ' ||
CACHE_SIZE||';'
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME<>'AA'

原文地址:https://www.cnblogs.com/wangn/p/3324770.html