您的位置:首页 > 其它

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

2017-10-13 20:12 686 查看
声明:本文是参考secooler的《同一数据库实例不同用户间数据迁移复制——NETWORK_LINK参数》(http://space.itpub.net/519536/viewspace-631571)而成,特此感谢!
 
在实际开发和运维中,我们经常遇到这样的需求:把一个schema、一个tablespace或者某些数据表的结构和内容转移到另一个数据schema、tablespace或者另一个实例上。
 
实现这种需求的方法有很多。比较常用的就是使用exp/expdp工具将指定数据源的数据导出,成.dmp格式文件。之后指向目标数据源,利用imp/impdp工具导入。本文介绍一种方式,使用impdp工具的network_link参数,实现数据在同实例或者异实例之间的灵活的快速复制。
 
 
Exp/imp工具是Oracle早期(Oracle Release 5)推出的一种数据导出导入工具,因其简单实用的优点,一直具有很强的生命力。但是随着海量数据时代的到来,以及Oracle新特性的不断引入,exp/imp工具的不适应性逐渐显现。于是,Oracle10g中,推出了了数据泵(Data
Dump)expdp/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_schema和remap_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_link:To_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新一代工具,可以更有效的提高复制速度;
ü        定制灵活的导入映射规则,满足更多个性化的复制需求;
 
 
对新工具、新特性的勇于尝试,可以让我们的生活变得更轻松。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐