声明:本文是参考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新一代工具,可以更有效的提高复制速度;
ü 定制灵活的导入映射规则,满足更多个性化的复制需求;
对新工具、新特性的勇于尝试,可以让我们的生活变得更轻松。