expdp,impdp导出导入远程数据库到本地

建议:若备份数据库较大远程导入导出比较容易出错,建议先备份表结构,再导入表数据
1.本地数据库新建一个用户test,并授予以下基本权限
grant connect to test;
grant resource to test;
grant create table, create database link to test;
grant create session to test;
2.创建远程dblink
create public database link linkname_xxx connect to 远程username identified by 远程password 
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST = IP)(PORT = 端口)))(CONNECT_DATA =(SERVICE_NAME
服务名)))';
3.创建导出文件目录,本地要存在该路径,并授权给test
create directory expdir as 'e:\expdir';
grant read,write on directory expdir to test;
4.参数解释
参数名说明使用示例
network_link指定远程dblinknetwork_link=linkname
directory指定导出目录directory=directoryname
dumpfile指定备份文件名dumpfile=remoteDB.dmp
logfile指定日志文件名logfile=logname.log
schemas指定导出/导入某一个用户schemas=remoteDBUername
content
指定要导出的内容,默认值为ALL,语法如下:content={all| data_only | metadata_only}
content=metadata_only
remap_schema只在导入时使用,实现将一个用户的的数据迁移到另外一个用户remap_schema=localDBuername:remoteDBUername
remap_tablespace只在导入时使用,把冒号前面的表空间对象导入到冒号后面的表空间
remap_tablespace=sourceTablespace:target Tablespace
table_exists_action只在导入时使用,导入时,假如目标库中已存在对应的表,对于这种情况,提供三种不同的处理方式:append,truncate,skip,replace
append :   追加数据到表中
truncate:  将目标库中的同名表的数据truncate掉。
skip:遇到同名表,则跳过,不进行处理,注意:使用此参数值时,与该表相关的所有操作都会skip掉。
replace:导入过程中,遇到同名表,则替换到目标库的那张表(先drop,再创建)。
table_exists_action=replace
ATTACH当我们使用ctrl+C 退出交互式命令时,可使用attach参数重新进入到交互模式,
语法:ATTACH=[schema_name.]job_name
Schema_name用户名,job_name任务名
Expdp scott/tiger ATTACH=scott.export_job
EXCLUDE此参数用于排除不需要导出的内容,如我们进行全库导出,但是不需要导出用户scott,此时需要在exlude后先指定排除类型为schema,再指定具体的schema。具体使用方法见include参数. EXCLUDE与include的使用方法是一样的
语法
    EXCLUDE=object_type[:name_clause] [,object_type[:name_clause] ]
    name_clause
        "='object_name'"
        "in ('object_name'[,'object_name',....])"
        "in (select_clause) "
    Object_type对象类型,如:table,view,procedure,schema等
    name_clause指定名称的语句,如果不具体指定是哪个对象,则此类所有对象都不导出, select 语句中表名不要加用户名。用户名,通过schemas 指定。
expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dup EXCLUDE=VIEW
expdp scott/tiger DIRECTORY=dump_dir DUMPFILE=halberd.dup EXCLUDE=TABLE:\" IN\(\'TEMP\',\'GRADE\'\)\" EXCLUDE=TABLE:"='APPLICATION_AUDIT'"
INCLUDE限制范围,指定自己想要的内容,比如要导出某个用户的某张表。
语法:
INCLUDE=object_type[:name_clause],object_type[:name_clause]
impdp dbmon/dbmon_123 directory=dump_dir network_link=zjzwb2 SCHEMAS=AICBS remap_schema=aicbs:aicbsb include=table:\"IN\(SELECT TABLE_NAME FROM dbmon.TABLES_TOBE_MASKED\)\"  LOGFILE=zjzwb.log transform=segment_attributes:n
    PARFILE中设置:
        INCLUDE=table:"in(select table_name from dba_tables where owner='AA')"
        INCLUDE=TABLE:"IN('TEST1','TEST2')"
    SHELL环境设置:
        INCLUDE=TABLE:\"IN\(SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER=\'AA\'\)\"
        INCLUDE=TABLE:\"IN\(\'TEST1\',\'TEST2\'\)\"
TRANSFORM此参数只在导入时使用,是一个用于设定存储相关的参数,有时候也是相当方便的。假如数据对应的表空间都存在的话,就根本用不到这个参数,但是,假如数据存储的表空间不存在,使用此参数导入到用户默认表空间就可以了。更灵活的,可以使用remap_tablespace参数来指定。
格式:
transform=transform_name:value[bject_type]
    transform_name = [OID | PCTSPACE | SEGMENT_ATTRIBUTES | STORAGE]:[Y|N]
segment attributes:段属性包括物理属性、存储属性、表空间和日志,Y 值按照导出时的存储属性导入,N时按照用户、表的默认属性导入
storage:默认为Y,只取对象的存储属性作为导入作业的一部分
oid:  owner_id,如果指定oid=Y(默认),则在导入过程中将分配一个新的oid给对象表,这个参数我们基本不用管。
pctspace:通过提供一个正数作为该转换的值,可以增加对象的分配尺寸,并且数据文件尺寸等于pctspace的值(按百分比)
transform=segment_attributes:n --表示将用户所有对象创建到用户默认表空间,而不再考虑原来的存储属性。
FULL指定导出内容为全库导出。这里需要特别注意的是,expdp 不能导出sys用户对象。即使是全库导出也不包含sys用户。
语法:FULL={Y | N}
expdp \'\/ as sysdba\' directory=dump_dir full=y
5.导出dmp文件
expdp localDBuername/localDBpasswd network_link = linkname_xxx directory = expdir dumpfile = remoteDB.dmp logfile = expdp.log schemas = remoteDBUername
例:expdp yl_etyy/yl_etyy@127.0.0.1:1521/orcl network_link = linkname_xxx directory = expdir dumpfile = remoteDB.dmp logfile = expdp.log schemas = remoteDBUername
只导出标结构,增加content参数:
例:expdp yl_etyy/yl_etyy@127.0.0.1:1521/orcl network_link = linkname_xxx directory = expdir dumpfile = remoteDB.dmp logfile = expdp.log schemas = remoteDBUername content=metadata_only
6.将dmp文件导入到数据库
建议目标数据库和源数据库的表空间、临时表空间、索引表空间名字一致,否则会出现表空间找不到的错误
1)impdp username/pwd@IP:端口/服务名 dumpfile=数据备份.dmp
例:impdp NCC2020_0609/1@127.0.0.1:1521/orcl dumpfile=NCC2020_0609.dmp
2)impdp localDBuername/localDBpasswd directory = expdir dumpfile = remoteDB.dmp logfile = impremoteDB.log remap_schema=localDBuername:remoteDBUername
7.直接用impdp导入远程数据库到本地,不生成dmp文件
impdp username/pwd@IP:端口/服务名 directory=expdir logfile=impdp.log network_link=linkname_xxx schemas=remoteDBUername
8.impdp导入数据时数据表已经存在或者只想导入数据的情况
当使用impdp导入数据时,如果遇到表已经存在或者已经导入过表结构只想导入表数据,Oracle提供了以下四种方式:
  • SKIP:跳过已经存在的表,继续导入下一个对象,如果CONTENT设置了DATA_ONLY参数,则不能使用SKIP
  • APPEND:不会影响已存在的数据,在原有数据表的基础上继续增加数据
  • REPLACE:先删除掉表,然后创建表,最后完成数据插入
  • TRUNCATE:删除已存在的行,然后插入所有的数据
我们需要在导入语句中使用TABLE_EXISTS_ACTION参数指定导入数据方式,方法如下
例:impdp zcgl/system dumpfile=GUIDONG.DMP directory=data_pump_dir REMAP_TABLESPACE=ASSETS:ZCGL REMAP_SCHEMA=TESTUSER:ZCGL TABLE_EXISTS_ACTION=APPEND logfile=TEST20191111.log
9.异常情况
在执行过程中可能会出现卡住不动,并且备份文件也不增长的情况,可以按以下步骤进行尝试:
1)查询dba_datapump_jobs表查看job状态
运行状态为EXECUTING
2)进入Export状态
Ctrl+C组合键,
若进入Export>,则直接进行3)停止job
若进入C:\Users\Administrator>,需要执行Expdp username/pwd ATTACH=job_name(通过查询dba_datapump_jobs得到),进入Export>
3)停止job
在 “Export> ”提示符下输入命令:stop_job=immediate ,回车后,再输入yes确定结束当前任务,即可正确终止正在进行expdp导出数据的任务。
如何终止正在进行expdp导出数据的任务
正确停止后按照第一步查询dba_datapump_jobs表状态为NOT RUNNING,或者IDLING
4)恢复执行job
控制台执行Expdp username/pwd ATTACH=job_name(通过查询dba_datapump_jobs得到),进入Export状态
C:\Users\Administrator>Expdp username/pwd ATTACH=job_name
执行start_job:
Export> start_job --打开暂停的JOB(并未开始重新执行)
执行continue_client:
Export> continue_client      --通过此命令重新启动job
5)按照第一步查询job状态,并且检查备份文件是否重新开始增长




posted @ 2022-02-26 17:05  Chesters  阅读(2461)  评论(0编辑  收藏  举报