当前位置: 首页 > 图文教程 > 数据库 > Oracle > Oracle中利用EXP/IMP工具实现数据迁移

Oracle
oracle sys_connect_by_path 函数 结果集连接
oracle join on 数据过滤问题
Oracle 当前用户下所有表的记录总数
oracle 树查询 语句
oracle 触发器 实现出入库
Oracle 函数大全
oracle 删除重复数据
ORACLE 最大连接数的问题
oracle 层次化查询(行政区划三级级联)
oracle 查询表名以及表的列名
Oracle 数据显示 横表转纵表
oracle 服务启动,关闭脚本(windows系统下)
ORCLE 表中列的修改
oracle 数据库连接分析
Oracle 实现类似SQL Server中自增字段的一个办法
Oracle 常用的SQL语句
Oracle 数组的学习 小知识也要积累,养成好的学习态度
Oracle 日期的一些简单使用
Oracle 数据库连接查询SQL语句
Oracle DBA常用语句

Oracle中利用EXP/IMP工具实现数据迁移


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 161 ::
收藏到网摘: n/a

由于产品系统需要进行一次跨平台的迁移,因此,只能通过EXP/IMP来实现。所幸的是需要迁移的数据库数据量不大,而且停机时间相对充裕。但是需要迁移的数据库已经部署了高级复制环境,打算进行一系列的测试,测试包含高级复制环境数据库在通过EXP/IMP工具迁移到新的环境中,复制环境是否生效。

最先进行的例子是测试一个物化视图站点能否通过EXP/IMP进行顺利迁移。

建立测试库的过程略,创建好3个待用数据库,在这个例子中,RAC1.US.ORACLE.COM作为复制主站点,TESTMV.US.ORACLE.COM作为物化视图站点,TESTMV作为要进行导入操作的物化视图站点。

为了避免误会,需要说明一下:由于刚刚做完RAC的测试,就进行这个测试,建立数据库的时候,忘了修改ORACLE_SID系统变量,因此数据库的名称叫RAC1。这个测试中,没有RAC的环境,RAC1只是一个单INSTANCE数据库。

首先需要说明的是,由于部署了高级复制环境,导入和导出必须采用全库级别。否则会导致复制环境无法完全导入:

下面是复制环境的建立和测试数据的准备,首先是创建测试帐号:

  SQL> CONN SYSTEM/TEST@RAC1已连接。   SQL> CREATE USER YANGTK IDENTIFIED BY YANGTK DEFAULT TABLESPACE NDMAIN;

用户已创建。

  SQL> GRANT CONNECT, RESOURCE TO YANGTK;

授权成功。

  SQL> CONN YANGTK/YANGTK@RAC1已连接。   SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));

表已创建。

  SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);

表已更改。

  SQL> INSERT INTO T SELECT ROWNUM, TABLE_NAME FROM ALL_TABLES;

已创建43行。

  SQL> COMMIT;

提交完成。

  SQL> CREATE INDEX IND_T_NAME ON T (NAME) TABLESPACE NDMAIN;

索引已创建。

  SQL> CREATE TABLE T1 (ID NUMBER PRIMARY KEY, FID NUMBER, NAME VARCHAR2(30));

表已创建。

  SQL> INSERT INTO T1 SELECT ROWNUM, MOD(ROWNUM, 43) + 1, SYNONYM_NAME FROM ALL_SYNONYMS;

已创建12239行。

  SQL> COMMIT;

提交完成。

  SQL> ALTER TABLE T1 ADD CONSTRAINT FK_T1_FID FOREIGN KEY (FID) REFERENCES T(ID);

表已更改。

  SQL> CREATE INDEX IND_T1_FID ON T1(FID);

索引已创建。

下面建立主站点环境:

  SQL> CONN SYSTEM/TEST@RAC1已连接。   SQL> CREATE USER REPADMIN IDENTIFIED BY REPADMIN DEFAULT TABLESPACE NDMAIN;

用户已创建。

  SQL> BEGIN   2 DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA(USERNAME => 'REPADMIN');   3 END;   4 /

PL/SQL 过程已成功完成。

  SQL> GRANT COMMENT ANY TABLE TO REPADMIN;

授权成功。

  SQL> GRANT LOCK ANY TABLE TO REPADMIN;

授权成功。

  SQL> GRANT SELECT ANY DICTIONARY TO REPADMIN;

授权成功。

  SQL> GRANT SELECT_CATALOG_ROLE TO REPADMIN;

授权成功。

  SQL> GRANT CREATE SESSION TO REPADMIN;

授权成功。

  SQL> GRANT SELECT ANY TABLE TO REPADMIN;

授权成功。

  SQL> BEGIN   2 DBMS_DEFER_SYS.REGISTER_PROPAGATOR(USERNAME => 'REPADMIN');   3 END;   4 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(USERNAME => 'REPADMIN',   3 PRIVILEGE_TYPE => 'RECEIVER', LIST_OF_GNAMES => NULL);   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(USERNAME => 'REPADMIN',   3 PRIVILEGE_TYPE => 'PROXY_SNAPADMIN',   4 LIST_OF_GNAMES => NULL);   5 END;   6 /

PL/SQL 过程已成功完成。

  SQL> CONN REPADMIN/REPADMIN@RAC1已连接。  SQL> BEGIN   2 DBMS_DEFER_SYS.SCHEDULE_PURGE(NEXT_DATE => SYSDATE, INTERVAL => 'SYSDATE + 1/24', DELAY_SECONDS   => 0);   3 END;   4 /

PL/SQL 过程已成功完成。

建立主体组和主体对象:

  SQL> CONNECT REPADMIN/REPADMIN@RAC1已连接。  SQL> BEGIN   2 DBMS_REPCAT.CREATE_MASTER_REPGROUP(GNAME => 'REP_GROUP');   3 END;   4 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REPCAT.CREATE_MASTER_REPOBJECT (GNAME => 'REP_GROUP', TYPE => 'TABLE',   3 ONAME => 'T', SNAME => 'YANGTK', USE_EXISTING_OBJECT => TRUE, COPY_ROWS => FALSE);   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REPCAT.CREATE_MASTER_REPOBJECT (GNAME => 'REP_GROUP', TYPE => 'TABLE',   3 ONAME => 'T1', SNAME => 'YANGTK', USE_EXISTING_OBJECT => TRUE, COPY_ROWS => FALSE);   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REPCAT.CREATE_MASTER_REPOBJECT(GNAME => 'REP_GROUP', TYPE => 'INDEX',   3 ONAME => 'IND_T1_FID', SNAME => 'YANGTK', USE_EXISTING_OBJECT => FALSE, COPY_ROWS => FALSE);   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(SNAME => 'YANGTK',   3 ONAME => 'T', TYPE => 'TABLE', MIN_COMMUNICATION => TRUE);   4 END;   5 /

PL/SQL 过程已成功完成。

SQL> BEGIN   2 DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(SNAME => 'YANGTK',   3 ONAME => 'T1', TYPE => 'TABLE', MIN_COMMUNICATION => TRUE);   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REPCAT.RESUME_MASTER_ACTIVITY(GNAME => 'REP_GROUP');   3 END;   4 /

PL/SQL 过程已成功完成。

  SQL> COMMIT;

提交完成。

下面配置物化视图站点:

  SQL> CONNECT SYSTEM/TEST@TESTMV已连接。   SQL> CREATE USER MVADMIN IDENTIFIED BY MVADMIN DEFAULT TABLESPACE NDMAIN;

用户已创建。

  SQL> BEGIN   2 DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA(USERNAME => 'MVADMIN');   3 END;   4 /

PL/SQL 过程已成功完成。

  SQL> GRANT COMMENT ANY TABLE TO MVADMIN;

授权成功。

  SQL> GRANT LOCK ANY TABLE TO MVADMIN;

授权成功。

  SQL> BEGIN   2 DBMS_DEFER_SYS.REGISTER_PROPAGATOR(USERNAME => 'MVADMIN');   3 END;   4 /

PL/SQL 过程已成功完成。

  SQL> GRANT SELECT ANY DICTIONARY TO MVADMIN;

授权成功。

  SQL> CREATE PUBLIC DATABASE LINK RAC1.US.ORACLE.COM USING 'RAC1';

数据库链接已创建。

  SQL> CONNECT MVADMIN/MVADMIN@TESTMV已连接。  SQL> CREATE DATABASE LINK RAC1.US.ORACLE.COM CONNECT TO REPADMIN IDENTIFIED BY REPADMIN;

数据库链接已创建。

建立物化视图,完成复制环境的配置:

  SQL> CONNECT YANGTK/YANGTK@RAC1已连接。   SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

  SQL> CREATE MATERIALIZED VIEW LOG ON T1;

实体化视图日志已创建。

  SQL> CONNECT SYSTEM/TEST@TESTMV已连接。   SQL> CREATE USER YANGTK IDENTIFIED BY YANGTK DEFAULT TABLESPACE NDMAIN;

用户已创建。

  SQL> GRANT CREATE SESSION, CREATE TABLE, CREATE PROCEDURE, CREATE SEQUENCE,   2 CREATE TRIGGER, CREATE VIEW, CREATE SYNONYM, ALTER SESSION,   3 CREATE MATERIALIZED VIEW, ALTER ANY MATERIALIZED VIEW,   4 CREATE DATABASE LINK TO YANGTK;

授权成功。

  SQL> GRANT CONNECT, RESOURCE TO YANGTK;

授权成功。

  SQL> CONNECT YANGTK/YANGTK@TESTMV已连接。  SQL> CREATE DATABASE LINK RAC1.US.ORACLE.COM CONNECT TO REPADMIN IDENTIFIED BY REPADMIN;

数据库链接已创建。

SQL> CONNECT MVADMIN/MVADMIN@TESTMV已连接。  SQL> BEGIN   2 DBMS_REPCAT.CREATE_MVIEW_REPGROUP(GNAME => 'REP_GROUP', MASTER => 'RAC1.US.ORACLE.COM',   3 PROPAGATION_MODE => 'ASYNCHRONOUS');   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REFRESH.MAKE(NAME => 'YANGTK.REP_REFRESH', LIST => '', NEXT_DATE => SYSDATE,   3 INTERVAL => 'SYSDATE + 1/48', IMPLICIT_DESTROY => FALSE, ROLLBACK_SEG => '', PUSH_DEFERRED_RPC   => FALSE,   4 REFRESH_AFTER_ERRORS => FALSE);   5 END;   6 /

PL/SQL 过程已成功完成。

  SQL> CREATE MATERIALIZED VIEW   2 YANGTK.T REFRESH FAST WITH PRIMARY KEY   3 AS SELECT * FROM [email protected];

实体化视图已创建。

  SQL> CREATE MATERIALIZED VIEW   2 YANGTK.T1 REFRESH FAST WITH PRIMARY KEY   3 AS SELECT * FROM [email protected];

实体化视图已创建。

  SQL> BEGIN   2 DBMS_REPCAT.CREATE_MVIEW_REPOBJECT(GNAME => 'REP_GROUP', SNAME => 'YANGTK',   3 ONAME => 'T', TYPE => 'SNAPSHOT', MIN_COMMUNICATION => TRUE);   4 END;   5 /

PL/SQL 过程已成功完成。

SQL> BEGIN   2 DBMS_REPCAT.CREATE_MVIEW_REPOBJECT(GNAME => 'REP_GROUP', SNAME => 'YANGTK',   3 ONAME => 'T1', TYPE => 'SNAPSHOT', MIN_COMMUNICATION => TRUE);   4 END;   5 /

PL/SQL 过程已成功完成。

SQL> BEGIN   2 DBMS_REPCAT.CREATE_MVIEW_REPOBJECT(GNAME => 'REP_GROUP', SNAME => 'YANGTK',   3 ONAME => 'IND_T1_FID', TYPE => 'INDEX', MIN_COMMUNICATION => TRUE);   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> BEGIN   2 DBMS_REFRESH.ADD(NAME => 'YANGTK.REP_REFRESH',   3 LIST => 'YANGTK.T', LAX => TRUE);   4 END;   5 /

PL/SQL 过程已成功完成。

SQL> BEGIN   2 DBMS_REFRESH.ADD(NAME => 'YANGTK.REP_REFRESH',   3 LIST => 'YANGTK.T1', LAX => TRUE);   4 END;   5 /

PL/SQL 过程已成功完成。

  SQL> COMMIT;

提交完成。

环境建立完毕,首先备份测试数据库,然后开始测试。测试步骤仿照真正迁移的步骤:

首先在另一台服务器上建立一个同名空数据库,路径和要迁移的数据库保持一致,并删除了没有必要的用户。

关闭迁移数据库和被迁移数据库的LISTENER.ORA,避免在导出过程中,数据库发现了修改。

检查是否存在运行的JOB,如果必要将JOB置为BROKEN状态。

下面就可以执行全库导出操作了:

  $ exp "sys as sysdba" file=testmv_full.dmp full=y buffer=20480000 log=testmv_full.log compress=n

导出完毕后关闭迁移数据库。

将testmv_full.dmp通过ftp拷贝到迁移的目的服务器,并执行导入操作,导入前确认本地tnsnames.ora中已经配置了复制主站点:

  $ imp "sys as sysdba" file=testmv_full.dmp full=y buffer=20480000 ignore=y log=testmv_full.log

经过测试,物化视图复制环境可以顺利的通过EXP/IMP导入到目的数据库中。

但是需要注意几点:

1.Oracle在全库导入的过程中,必然出现大量的错误,这是几乎无法避免的。这些错误有的可以忽略,但是有的可能会对系统造成潜在的威胁。至少有一点是可以肯定的,那就是Oracle提供的那些功能如全文索引、数据挖掘、数据分析、XML等等都不能直接使用,最稳妥的方法是将这些方案完全重建。

2.在导入之前,一定要把上面提到的那些辅助用户删除掉,最起码要把其中的内容清空,否则很可能在导入的时候碰到ORA-00600错误而中止。

3.一定要在本地配置好主体站点的TNSNAMES.ORA,这样才能保证物化视图可以建立成功。

4.不要将迁移前的数据库再次打开,否则会造成两个同名数据库刷新同一个主体站点的情况

5.使用全库导入Oracle会自动忽略SYS或者SYSTEM方案下的对象权限。也就是说,在导入开始的时候需要人工记录所有SYS对象的授权(授予PUBLIC用户和SYSTEM用户的除外),然后手工在目标数据库上授权,否则可能会导致权限的遗漏。

最后想要说明的是,不建议使用这种方法作为数据库的首选迁移方案。如果可能的话,建议使用用户级EXP/IMP迁移,最后在新环境中重新建立复制环境。