Oracle 按照表条件导出导入数据-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

Oracle 按照表条件导出导入数据

简介: ----------------------------------------------------------------------------------- -- 准备工作 -- set line 180 col OWNER form a10 col DIRECTORY_NAME fo...

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

-- 准备工作 --

set line 180

col OWNER form a10

col DIRECTORY_NAME form a30

col DIRECTORY_PATH form a85

select * from dba_directories;

create directory exp_dir as 'C:\app\Administrator\virtual\backup_dump';

grant read,write on directory exp_dir to public;

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



---- 导出 ----

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

-- 按where条件用expdp导出表

-- 示例一

-- emp_main 表需要根据 sendtime 字段导出2018年的数据

-- 配置参数文件内容如下:

vi emp_main.par

tables=emp_main

dumpfile=emp_main.dmp

logfile=emp_main.log

query="where sendtime between to_date('20180101','yyyymmdd') and to_date('20190101','yyyymmdd')"

-- 执行导出

expdp username/oracle@servicename directory=exp_dir parfile=emp_main.par


-- 示例二

-- 在导出 2018 年的 emp_main 表后,需要导出 emp_detail 中与之关联的数据,且 exp_detail 表没有日期字段,

-- 但与 exp_main 通过某字段相关联

-- 配置参数文件内容如下

vi emp_detail.par

tables=emp_detail

dumpfile=emp_detail.dmp

logfile=emp_detail.log

query=(emp_detail:"where exists(select 1 from emp_main a where sheetkey = a.id and a.sendtime between to_date('20180101','yyyymmdd') and to_date('20190101','yyyymmdd'))")

-- 执行导出:

expdp username/oracle@servicename directory=exp_dir parfile=emp_detail.par


-- 其他说明: 上述是用expdp命令。如果是exp,则需要将参数文件中的参数名改为如下:

vi emp_detail.par

tables=emp_main

file=emp_main.dmp

log=emp_main.log

query="where sendtime between to_date('20180101','yyyymmdd') and to_date('20190101','yyyymmdd')"

-- 导出命令:

exp username/oracle@servicename parfile=emp_main.par

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



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

-- 其他示例

-- 如果要导出多个表的数据,但是对某一个表或者某几个表的数据有限制

expdp scott/tiger directory=exp_dir dumpfile=a.dmp tables=emp,dept query=/'emp:/"where deptno=20/"/'

expdp scott/tiger directory=exp_dir dumpfile=a1.dmp tables=emp,dept query=/'dept:/"where deptno=20/"/',/'emp:/"where deptno /<=20/"/'

-- 注意,两个条件可以一起写,< 、>前面都要加入转义字符。如果写在参数文件中,就不要加入转义字符,如下所示:

expdp scott/tiger 11g.par

vi 11g.par

DIRECTORY = exp_dir

DUMPFILE = exp_tab.dmp

LOGFILE = exp_tab.log

SCHEMAS = scott

PARALLEL=2

INCLUDE = TABLE:"IN ('EMP','DEPT')"

QUERY = 'EMP:"where deptno =20"','DEPT:"where deptno <=20"'

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



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

-- exclude 和 include 参数能够在使用expdp或impdp是对特定的对象或对象类型进行筛选或过滤。

-- 比如因工作的需要导出特定的表或不导出特定的表、视图以及存储过程、索引、约束、授权统计信息等等。

-- 下面将给出expdp或impdp使用exclude和include参数的方法和示例。


-- 一、exclude/include参数用法:

EXCLUDE=[object_type]:[name_clause],[object_type]:[name_clause] -->排出特定对象

INCLUDE=[object_type]:[name_clause],[object_type]:[name_clause] -->包含特定对象

-- object_type 子句用于指定对象的类型,如table,sequence,view,procedure,package等

-- name_clause 子句可以为SQL表达式用于过滤特定的对象名字。它由SQL操作符以及对象名(可使用通配符)来过滤指定对象类型中的特定对象。

-- 当未指定name_clause而仅仅指定object_type则所有该类型的对象都将被过滤或筛选。多个[object_type]:[name_clause]中间以逗号分割。


-- 示例:

expdp <other_parameters> SCHEMAS=scott EXCLUDE=SEQUENCE,TABLE:"IN ('EMP','DEPT')"

impdp <other_parameters> SCHEMAS=scott INCLUDE=PACKAGE,FUNCTION,PROCEDURE,TABLE:"='EMP'"


-- 二、常用的过滤SQL表达式

EXCLUDE=SEQUENCE,VIEW                          -- 过滤所有的SEQUENCE,VIEW

EXCLUDE=TABLE:"IN ('EMP','DEPT')"               -- 过滤表对象EMP,DEPT

EXCLUDE=SEQUENCE,VIEW,TABLE:"IN ('EMP','DEPT')" -- 过滤所有的SEQUENCE,VIEW以及表对象EMP,DEPT

EXCLUDE=INDEX:"= 'INDX_NAME'"                   -- 过滤指定的索引对象INDX_NAME

INCLUDE=PROCEDURE:"LIKE 'PROC_U%'"              -- 包含以PROC_U开头的所有存储过程(_ 符号代表任意单个字符)

INCLUDE=TABLE:"> 'E' "                          -- 包含大于字符E的所有表对象


-- 其它常用操作符 NOT IN, NOT LIKE, <, != 等


expdp \”/ as sysdba\“  tablespaces=DD ESTIMATE_ONLY=Y -- estimate_only参数评估导出文件的大小而不会启用导出job作业,但是使用estimate参数,则是会启动job作业,导出文件


-- 使用query、exclude参数。需要使用par参数文件。否则会出现一些错误, par的参数文件、导出过程如下:

$ vi exp.par

directory=dump

dumpfile=dump_hr.dmp

content=data_only

exclude=table:"in('countries','locations','regions')"

query=employees:"where department_id!=20 order by employee_id"  

$ expdp hr/hr parfile=exp.par


-- 测试导出 bb.bb_t1 中的部分数据

$ vi expdp_query.par

directory=dump

dumpfile=dump_query.dmp

logfile=dump_query.log

tablespaces=DD

QUERY=BB.BB_T1:"where object_id<10"

$ expdp \“/ as sysdba\” parfile=expdp_query.par


-- 直接将过滤操作符封装到参数文件中,如下面的例子

$ vi exp_scott.par

DIRECTORY = exp_dir

DUMPFILE = exp_scott_%U.dmp

LOGFILE = exp_scott.log

SCHEMAS = scott

PARALLEL=2

EXCLUDE = TABLE:"IN ('EMP', 'DEPT')"

-- 执行导出

expdp system/oracle parfile=exp.par 


-- 其他 par 示例

directory=dmp

dumpfile=expBig.dmp

tables=(py.order,py.transation)

query=(py.order:"where id<=14000 or id>=134520000",py.transation:"where id<=15000 or id>=8817147")

$ expdp \‘/ as sysdba\’ parfile=exp.par

-- 也可以使用 tables 参数指定分区表的某个分区来泵出分区表的部分数据

tables=(t1:p201805,t1:p201806,t2:p201805,t2:p201806)


impdp \'/ as sysdba\' directory=dump dumpfile=t_exp_01.dmp logfile=t_imp_test.log remap_table=zbb.t_exp:t_imp_test -'

-- 注意这里remap ,remap后的不要schema,直接remap表 ,否则remap后的表是 zbb.zbb.t_imp_test .比如下面的例子 

impdp \'/ as sysdba\' directory=dump dumpfile=t_exp_01.dmp logfile=t_imp_test.log remap_table=zbb.t_exp:zbb.t_imp_test -'

-- 如下会自动创建remap后的表

impdp \'/ as sysdba\' directory=dump dumpfile=t_exp_01.dmp logfile=t_imp_test.log remap_table=zbb.t_exp:t_imp_test1  -'

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



---- 导入 ----

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

-- impdp 按条件导入测试(query)

-- 创建测试表

SQL> GRANT SELECT ON "SYS"."DBA_TABLES" TO C##AHERN;

SQL> grant dba to C##AHERN; -- 这里只是cdb中的权限

SQL> grant dba to C##AHERN container=all; -- 所有pdb都有权限

create table test_table as select * from dba_tables;

-- 导出测试表

expdp c##ahern/oracle directory=exp_dir dumpfile=test_table.dmp logfile=test_table.log tables=C##AHERN.test_table


-- 根据条件导入测试表,remap_schema 加 query 条件生效

vi impdp_query_test.par

userid=system/oracle

DIRECTORY=exp_dir   

DUMPFILE=test_table.dmp

remap_schema=C##AHERN:C##AHERN_1   

CONTENT=all   

LOGFILE=result_test.log   

TABLES= C##AHERN.test_table

query=(C##AHERN.test_table:"where owner ='C##AHERN'")

-- 导入

impdp parfile=impdp_query_test.par

impdp c##ahern/oracle DIRECTORY=exp_dir DUMPFILE=test_table.dmp CONTENT=all LOGFILE=result_test.log TABLES=test_table query=(test_table:"where owner ='C##AHERN'")

impdp c##ahern/oracle DIRECTORY=exp_dir DUMPFILE=test_table.dmp CONTENT=all LOGFILE=result_test.log remap_table=test_table:test_table_1 query=(test_table:"where owner ='C##AHERN'")

impdp system/oracle DUMPFILE=test_table.dmp directory=exp_dir table_exists_action=append -- 由于上面条件没有数据所有测试追加数据


--添加remap_table修改表名条件,query条件不生效

vi impdp_query_test.par

userid=system/oracle

DIRECTORY=exp_dir   

DUMPFILE=test_table.dmp

remap_schema=C##AHERN:C##AHERN_1

remap_table=test_table:test_table1  

CONTENT=all   

LOGFILE=result_test.log   

TABLES= C##AHERN.test_table

query=(C##AHERN.test_table:"where owner ='C##AHERN'")

-- 导入

impdp parfile=impdp_query_test.par

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



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

-- orclpdb 插件数据库导出导入测试OK

expdp ahern/oracle@localhost:1521/orclpdb directory=exp_dir dumpfile=test.dmp logfile=test.log tables=AHERN.test

impdp ahern/oracle@localhost:1521/orclpdb directory=exp_dir DUMPFILE=test.dmp CONTENT=all LOGFILE=imp_test.log tables=test query=test:\"where owner ='AHERN'\" -"

impdp ahern/oracle@localhost:1521/orclpdb directory=exp_dir DUMPFILE=test.dmp CONTENT=all LOGFILE=imp_test.log remap_table=ahern.test:test_table query=test:\"where owner ='AHERN'\" -"

impdp system/oracle@localhost:1521/orclpdb DUMPFILE=test.dmp directory=exp_dir table_exists_action=append -- 由于上面条件没有数据所有测试追加数据

impdp system/oracle@localhost:1521/orclpdb DUMPFILE=test.dmp remap_table=ahern.test:test_table directory=exp_dir table_exists_action=append

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章