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

Oracle
常见的一些Oracle初学者的问题
ORACLE认证系统概述
数据库考试简介:Oracle认证
Oracle认证基础知识介绍
ADO连接Oracle Access示例及记录集处理源码
SQL Server和MySQL的安全性分析
用Oracle和SQL Server数据库组合利弊分析
Oracle 11g分区功能新革命
Flashback Query 恢复误删除的数据
基于Oracle高性能动态SQL程序开发
怎样在Oracle 9i中正确的转换时区
Oracle 10g导出的数据库能否导入Oracle 9i?
增加Distinct后查询效率反而提高
Oracle限制返回结果集的大小
Java语言数据库操作的基本流程
美国甲骨文(ORACLE)公司入驻渝中区大都会商厦
RHEL AS4上安装oracle 10R2 的方法
DB中如何查询Table占用空间的大小
编写高质量高性能的MySQL语法
Oracle数据库自动备份的具体实现步骤

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 156 ::
收藏到网摘: 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迁移,最后在新环境中重新建立复制环境。