• 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'

  • 相关阅读:
    syslog-ng:retint_careful导致机器hang
    [kernel学习]----好文章梳理
    ext4的一些特性
    [转载]查看Linux系统硬件信息实例详解
    dmidecode输出详解
    [Kernel参数]----/etc/sysctl.conf
    大数据竞赛平台Kaggle案例实战
    Python zip()函数的使用
    TensorFlow softmax的互熵损失
    TensorFlow 的softmax实例理解
  • 原文地址:https://www.cnblogs.com/wangn/p/3324770.html
Copyright © 2020-2023  润新知