Oracle利用expdp导出远程数据库

expdp network_link 命令备份远程主机上oracle 11g数据库

  这两天发现有一台服务器密码被修改不能远程登录,但数据库和服务运行正常,也能访问。

  运维部决定将数据库备份出来然后前去机房重启修改密码。

  因为之前有用expdp/impdp导出10g数据库的经验,完整导出速度非常快。固这次决定试试能不能用该命令远程导出版本为11g的数据库。网上查了一下改命令的参数,发现network_link方式可行。

  首先,局域网本地有一台测试服务器上装有oracle10g数据库,通过在10g上配 database link连接到远程11g数据库,这里就出现了问题-新建后不能访问后,查出原因为oracle 10g建DB_link连接11g时用户密码需要加双引号(正确操作是在配有远程数据库TNS前提下 Create Database Link link_ora94 Connect To username Identified By "password" Using 'ora94';),测试连接正常。

  保证两边登录的用户都有DBA权限,OK,cmd执行expdp命令,艹,报错! 大致内容是这样:

 ORA-39001: 参数值无效。
 ORA-39169: 10.2.0.1.0 的本地版本不能与 11.2.0.1.0 的远程版本一起使用。

  判断为版本不一致导致。所以又开始在本地装一个11g数据库,装好后丫的又出现问题:发现PL/SQL不能登录(登录为XX角色 的选项不见了),又开始查找原因,网上解释说32位PL/SQL不能支持64为Oracle 11g,无语,只能再在本地装一个32位的11g客户端。配置好后能正常打开,继续新建DBA用户->新建database link 测试能正常访问。

  终于到重头戏了。cmd执行远程导出命令:expdp test_dba/test_dba@orcl directory=EXP_DIR  dumpfile=full0605.dmp logfile=full0605.log full=y network_link=link_ora94 最后一个潇洒的回车!

对于数据的导出,导入。对于exp/imp可以实现把远程数据导入到客户端,但是功能没有expdp/impdp强大
对于expdp/impdp功能很强大,但是对于导出的数据只能是在服务端。下面我们就基于通过expdp结合dblink
把数据直接导出到本地 下面使用导出
 
如果空间允许建议导出到服务器
 

# 对于orac_remote是一个本地命名,可以通过netca进行配置,或者直接修改相关配置文件
# 需要保持orac_remote的system用户是open状态,并且密码是正确的
# 可以通过 select * from scott.emp@to_orac_remote 进行测试,如果不成功,需要检查权限和用户已经命名空间orac_remote


1 创建dblink 连接

create database link to_orac_remote
connect to system identified by gpecnew using 'orac_remote'

2 创建directory目录

create directory backup as '/backup'
grant read,write on directory backup to system


3 编写expdp的parfile参数文件 scott.par

userid=system/root
directory=backup
dumpfile=scott.dump
logfile=scott.log
schemas=scott
network_link=to_orac_remote


4 执行命令导出到本地
expdp parfile=scott.par

5 导入到本地
(测试的时候先在本地删除scott用户以及所有的表 drop user scott cascade)
impdp system/root  directory=backup dumpfile=scott.dump logfile=scott2.log

expdp数据泵
优点:支持并发多线程方式可以远程导出,性能显著提高,可开并行parallel=n,比exp/imp实用工具相比,导出提高了10倍左右,导入提高了5倍左右。能根据备份时收集的元数据,自动创建用户、表对象,支持作业、表空间备份方式。
缺点:需要在服务器上面执行创建目录授权, expdp、exp都支持远程本地导出 。
(exp不支持字段类型,BINARY_DOUBLE双精度二进制浮点类型  http://www.2cto.com/database/201202/119920.html number类型和浮点类型区别“number 十进制,BINARY_DOUBLE二进制(比number效率高,速度快,占用空间小的优点.但版本兼容性不好)”)
(expdp不支持网络链来加载long"保存文本类型"列,exp支持long的导出导入)
 
当出现”DB所在空间不足需要跨机器导出备份/恢复"时,需要用到expdp的远程导出,实现:只要在本地数据库 执行创建public link和dir及给对应的权限就可以将远程DB导出到本地路径。
 
具体实验如下,所有操作都在本地

SQL> create user test identified by test;
SQL> grant dba to test;
-->创建目录 
SQL> create directory dump_dir AS 'E:\dump_dir';  
SQL> select  DIRECTORY_NAME,DIRECTORY_PATH from dba_directories where directory_name='DUMP_DIR';
OWNER    DIRECTORY_NAME   DIRECTORY_PATH
-----------------------------------------------------------------------------------------------------------------------------------------------------
SYS     DUMP_DIR    E:\dump_dir
 
-->创建DBLINK
SQL>  create public database link kfdb7 connect to 用户 identified by "密码" using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = XX.XX.XX.XX)(PORT = 1521端口号)))  (CONNECT_DATA =  (SERVER = DEDICATED)   (SERVICE_NAME = SID )  ) )'; 
 
-->验证dblink 有效性
SQL> conn test/test
已连接。
SQL> select * from tab;

未选定行

SQL> select count(*) from base_dict@kfdb57;
 
  COUNT(*)
----------
      683 
 
****注意:要创建public database link 如果只创建 database link 只能再当前用户下访问链接库数据,但导出来报错
ORA-39001: 参数值无效
ORA-39200: 链接名称 "kfdb5" 无效。
ORA-02019: 未找到远程数据库的连接说明
具体解释:
Use the CREATE DATABASE LINK statement to create a database link. A database link is a schema object in one database that enables you to access objects on another database. The other database need not be an Oracle Database system. However, to access non-Oracle systems you must use Oracle Heterogeneous Services.
After you have created a database link, you can use it to refer to tables and views on the other database. In SQL statements, you can refer to a table or view on the other database by appending @dblink to the table or view name. You can query a table or view on the other database with the SELECT statement. You can also access remote tables and views using any INSERT, UPDATE, DELETE, or LOCK TABLE statement.
To create a private database link, you must have the CREATE DATABASE LINK system privilege. To create a public database link, you must have the CREATE PUBLIC DATABASE LINK system privilege. Also, you must have the CREATE SESSION system privilege on the remote Oracle database.    Oracle Net must be installed on both the local and remote Oracle databases.
 
导出命令:
E:\oracle\product\10.2.0\db_1\BIN>EXPDP.EXE test/test network_link=kfdb57 directory=DUMP_DIR1  dumpfile=base_dict.dmp tables='base_dict'
Export: Release 10.2.0.1.0 - Production on 星期一, 11 3月, 2013 17:51:56
Copyright (c) 2003, 2005, Oracle.  All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
启动 "TEST"."SYS_EXPORT_TABLE_01":  test/******** network_link=kfdb57 directory=DUMP_DIR1 dumpfile=base_dict.dmp tables='base_dict'
正在使用 BLOCKS 方法进行估计...
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的总估计: 64 KB
处理对象类型 TABLE_EXPORT/TABLE/TABLE
处理对象类型 TABLE_EXPORT/TABLE/INDEX/INDEX
处理对象类型 TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
处理对象类型 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
处理对象类型 TABLE_EXPORT/TABLE/COMMENT
处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . 导出了 "SINOSOFT"."BASE_DICT"                      35.73 KB     683 行
已成功加载/卸载了主表 "TEST"."SYS_EXPORT_TABLE_01"
******************************************************************************
TEST.SYS_EXPORT_TABLE_01 的转储文件集为:   E:\DUMP_DIR\BASE_DICT.DMP
作业 "TEST"."SYS_EXPORT_TABLE_01" 已于 17:54:09 成功完成
 
扩展:
将导出得文件导入到本地数据库命令:impdp.exe test/test directory=dump_dir1 dumpfile=base_dict.dmp tables=base_dict   REMAP_SCHEMA=sinosoft:test
查看导入情况:
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
SYS_IMPORT_TABLE_01                TABLE

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
SYS_IMPORT_TABLE_01           TABLE   -->主表  在完成后数据库会自动删除主表(导出失败则否)
BASE_DICT                                  TABLE

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BASE_DICT                      TABLE

SQL> select count(*) from base_dict;

  COUNT(*)
----------
       683
 
测试完毕后删除dblink+ directory 
drop directory dump_dir ;
drop public database link kfdb57;  

之前的export命令直接使用exp@remotedb即可实现远程数据的导出,expdp命令稍微麻烦一些,需要使用db link并建相关目录,简单过程如下
1,修改tnsnames.ora

HRTEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.4.×.×)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = HRTESTDB)
    )
  )
 
2.在客户端数据库创建DATABASE LINK连接要导出数据的服务端
SQL> create public database link HRTEST connect to system identified by × using 'HRTEST';
Database link created.

3,建目录,并给相关权限
create or replace directory  exp_dir as '/data/expdata/';
grant read,write on directory dir to system;

4, 导出数据此处使用clinet端的用户,开始导出数据
export ORACLE_SID=ora11g

expdp system/× network_link=HRTEST directory=exp_dir dumpfile=×.dmp schemas=×

1、连接
sqlplus/nolog

conn sys/manager@orcl as sysdba

sqlplus sys/manager@orcl as sysdba

2、创建目录
create directory dir_test as '/temp';

select * from dba_directories;

drop directory dir_test;

3、授权
grant read,write on directory dir_test  to scott;

4、建立数据链路,连接远程计算机
select * from global_name@yc_orcl;

create public database link yc_orcl
 connect to git_cms_test identified by git_cms_test_dba
 using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.101.82.233)(PORT = 1521))
    )
    (CONNECT_DATA =
       (SID = orcl)
       (SERVER = orcl)
    )
  )';
 
  select count(*) from dual@yc_orcl 

dev_orcl  =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.101.82.233)(PORT = 1521))
    )
    (CONNECT_DATA =
       (SID = orcl)
       (SERVER = orcl)
    )
  )
5、导出数据。
expdp sys/manager network_link=yc_orcl directory=aa dumpfile='jbpm4_20170919.dmp' logfile='jbpm4_20160919.log' TABLES=(JBPM4_DEPLOYMENT,JBPM4_PROPERTY,JBPM4_SWIMLANE,JBPM4_TASK,JBPM4_VARIABLE)

猜你喜欢

转载自zhyp29.iteye.com/blog/2355907