使用impdp实现数据在不同用户、不同实例之间快速复制

来源:互联网 发布:如何开淘宝童装店 编辑:程序博客网 时间:2024/06/06 19:38

声明:本文是参考secooler的《同一数据库实例不同用户间数据迁移复制——NETWORK_LINK参数》(http://space.itpub.net/519536/viewspace-631571)而成,特此感谢!

 

在实际开发和运维中,我们经常遇到这样的需求:把一个schema、一个tablespace或者某些数据表的结构和内容转移到另一个数据schematablespace或者另一个实例上。

 

实现这种需求的方法有很多。比较常用的就是使用exp/expdp工具将指定数据源的数据导出,成.dmp格式文件。之后指向目标数据源,利用imp/impdp工具导入。本文介绍一种方式,使用impdp工具的network_link参数,实现数据在同实例或者异实例之间的灵活的快速复制。

 

 

Exp/imp工具是Oracle早期(Oracle Release 5)推出的一种数据导出导入工具,因其简单实用的优点,一直具有很强的生命力。但是随着海量数据时代的到来,以及Oracle新特性的不断引入,exp/imp工具的不适应性逐渐显现。于是,Oracle10g中,推出了了数据泵(Data Dumpexpdp/impdp组件,作为新一代数据管理组件。

 

 

总的来说,数据泵Data Dump组件具有如下的特点:

 

ü        相对于前一代的exp/imp工具,Data Dump具有更好的性能和可管理特性;

ü        Data Dump是一个服务端工具,而不是在Oracle客户端;

ü        具有导入导出作业中断/重新开始的控制功能;

ü        支持网络network工作模式;

ü        可以在作业中断后重新启动;

ü        操作对象范围更加灵活;

ü        提供了多种方式调用的API组织;

 

 

回到本文要实现的任务,首先我们进行环境准备和查看。当前系统为Oracle 11gR2环境。

//创建一个实验Tablespace

SQL> create tablespace test datafile '/u01/oradata/WILSON/datafile/test.dbf' size 100m extent management local

  2  uniform. size 1m;

 

Tablespace created

 

SQL> select * from v$tablespace;

 

TS# NAME             INCLUDED_IN_DATABASE_BACKUP

------------------------------ --------------------------- ------- ------------ -----------------

   0 SYSTEM                         YES                  

   1 SYSAUX                         YES                   

   2 UNDOTBS1                    YES                      

   4 USERS                          YES                 

   10 TEST                           YES                    

(篇幅原因,有省略

10 rows selected

 

创建对象test

 

SQL> create user Test identified by test default tablespace TEST temporary tablespace TEMP;

 

User created

 

SQL> grant connect to test;

 

Grant succeeded

 

SQL> grant resource to test;

 

Grant succeeded

 

 

任务详细描述:将schema scott下的所有对象包括数据,复制给test用户schema。同时,将这些对象对应的表空间从原来的users,变换为表空间test

 

实现这个任务目标,需要按照两个步骤:

 

1、为了使用impdp工具的network_link参数,要建立指向数据源的Database Link对象;

2、使用impdp工具的命令行等模式进行操作;

 

下面,我们根据步骤来进行:

 

建立Database Link

 

Oracle Database Link的介绍,请参考《分布式数据库组件——Database Link》)(http://space.itpub.net/17203031/viewspace-687469)中相应的介绍。这里强调一个重点就是,建立Database Link时,using子句后面的命名连接名称,是要求在数据库服务器上的tnsname.ora文件中建立。而不是在用户客户端机器上建立的命名。

 

首先,构建本地服务名,手工改写tnsname.ora

 

 

[oracle@oracle11g admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/oracle/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

WILSON =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle11g)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = wilson)

    )

  )

 

 

本实例是从wilson导向到wilson,所以指向自身就可以了。如果是向不同实例数据库进行导入,就需要在目标实例上进行创建databaselink的操作。此处的本地服务命名就是指向源数据库命名。

 

下面就是建立Database Link

 

//数据库连接Database Link创建语句

create public database link TO_SELF

  connect to system identified by system

  using 'wilson';

 

 

含义:创建一个Database Link,连接到本地命名服务名为“wilson”的数据库实例上,使用system用户登录,密码为system

 

测试Database Link的情况。

 

//使用To_Self名称连接

SQL> select count(*) from dba_objects@to_self;

 

  COUNT(*)

----------

     72470

 

 

 

进行命令行导入

 

导入操作之前,我们先观察一下scott下数据对象的情况。

 

 

SQL> select table_name, tablespace_name from dba_tables where wner='SCOTT';

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

DEPT                           USERS

EMP                            USERS

SALGRADE                       USERS

T2                             USERS

T1                             USERS

BONUS                          USERS

 

6 rows selected

 

SQL> select index_name, tablespace_name from dba_indexes where wner='SCOTT';

 

INDEX_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

PK_DEPT                        USERS

PK_EMP                         USERS

 

 

 

此时,我们有两个问题需要解决,首先是如何将scott用户的数据表转变为test用户,另一个是如何将users表空间变换为test表空间。

 

此处我们介绍impdp工具的两个参数:remap_schemaremap_tablespace。这两个参数分别实现将特定Schema、特定表空间的转换映射。利用这两个参数,可以定义转换规则。

 

下面开始进行导入:

 

 

[oracle@oracle11g admin]$ impdp system/system network_link=to_self schemas=scott remap_schema=scott:test remap_tablespace=users:test

 

Import: Release 11.2.0.1.0 - Production on Thu May 5 07:51:00 2011

 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

 

UDI-28002: operation generated ORACLE error 28002

ORA-28002: the password will expire within 7 days

 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01":  system/******** network_link=to_self schemas=scott remap_schema=scott:test remap_tablespace=users:test

Estimate in progress using BLOCKS method...

Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 192 KB

Processing object type SCHEMA_EXPORT/USER

ORA-31684: Object type USER:"TEST" already exists

Processing object type SCHEMA_EXPORT/SYSTEM_GRANT

Processing object type SCHEMA_EXPORT/ROLE_GRANT

Processing object type SCHEMA_EXPORT/DEFAULT_ROLE

Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

Processing object type SCHEMA_EXPORT/TABLE/TABLE

. . imported "TEST"."DEPT"                                    4 rows

. . imported "TEST"."EMP"                                    14 rows

. . imported "TEST"."SALGRADE"                                5 rows

. . imported "TEST"."BONUS"                                   0 rows

. . imported "TEST"."T1"                                      0 rows

. . imported "TEST"."T2"                                      0 rows

Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS

Processing object type SCHEMA_EXPORT/TABLE/COMMENT

Processing object type SCHEMA_EXPORT/VIEW/VIEW

ORA-39082: Object type VIEW:"TEST"."V_T1" created with compilation warnings

Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT

Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS

Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" completed with 2 error(s) at 07:52:18

 

这样,我们就实现了导入。Impdp参数中,首先需要输入指定的用户名和密码,之后表示将scott schema下的数据库对象,通过Network_linkTo_Self导入到目标数据库实例上。在schema方面,如果是scott的对象,全部转化为test用户。在tablespace方面,如果是users表空间的对象,全部转化到test表空间。

 

下面我们观察下实验结果:

 

 

SQL> select table_name, tablespace_name from dba_tables where wner='TEST';

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

DEPT                           TEST

EMP                            TEST

SALGRADE                       TEST

T2                             TEST

T1                             TEST

BONUS                          TEST

 

6 rows selected

 

SQL> select index_name, tablespace_name from dba_indexes where wner='TEST';

 

INDEX_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

PK_DEPT                        TEST

PK_EMP                         TEST

 

 

导入成功。

 

这种方法的优势很多,特别是在进行同实例数据对象拷贝方面,network_link可以帮助我们提高工作效率。

 

ü        直接使用impdp进行导入。避免了使用dmp文件的过渡过程;

ü        借助impdp新一代工具,可以更有效的提高复制速度;

ü        定制灵活的导入映射规则,满足更多个性化的复制需求;

 

 

对新工具、新特性的勇于尝试,可以让我们的生活变得更轻松。

原创粉丝点击