欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle的数据泵导出(expdp)及导入(impdp)的操作介绍

程序员文章站 2022-03-10 18:03:56
之前本来想写篇exp-imp,expdp-impdp的简单介绍的, 结果发现简单写了下exp-imp就挺长一篇了,所以就把expdp-impdp分开来写了。 好了,继续往下,环境方面: 操作:win...

之前本来想写篇exp-imp,expdp-impdp的简单介绍的, 结果发现简单写了下exp-imp就挺长一篇了,所以就把expdp-impdp分开来写了。

好了,继续往下,环境方面:

操作:windows 10 ;:oracle database 11g r2 。

一、导出(expdp)

1、建逻辑目录(directory)

在数据库中建一个逻辑目录,指向系统一个路径。当然,这个目录在你的系统中也必须存在,否则后面导出会报错。

例如,我们在有dba权限的用户中建一个叫做orcl_bak的逻辑目录,指向系统中的“d:\orcl_bak\data\” 文件夹,那么,我们就要在系统中建好这么一个文件夹。创建逻辑目录以及授予读取、写入的权限,代码如下:

sql> create or replace directory orcl_bak as 'd:\orcl_bak\data'; 
sql> grant read, write on directory orcl_bak to public;   --to public的就是把该权限赋给所有用户,当然,也可以单独授权给某个用户

在数据库建这个东西有什么用呢?意思大概就是告诉数据库,我给了你这么个地方,你可以在这个地方读取或者写入数据。

2、expdp/impdp常用参数

expdp/impdp的参数我们都可以从命令行中查询到,在命令行中输入 expdp -help 或者是 impdp-help来查看。

(1)expdp、impdp共同的参数

① directory 逻辑目录,这个就是指定导出或者导入的转储文件的存储路径,也就是上面说到的创建逻辑目录的目录名,orcl_bak,如我们的逻辑目录名叫orcl_bak,导出的时候就写directory=orcl_bak;

②dumpfile目标转储文件名的列表,也就是导出的转储文件名,可以指定一个或者多个文件名,不过比较常用的是指定一个文件名系列,然后后面拼接数字或者时间,如dumpfile=full_%u.dmp,这样,导出的时候生成的转储文件名就会按顺序是full_01.dmp,full_02.dmp,full_03.dmp.....这个样子。多提一句,在命令行中直接打命令参数是full_%u.dmp,但如果是做成bat文件的,就需要多加一个%,写成full_%%u.dmp;导入时要跟导出的对应;

③ logfile 输出的日志文件名,指定输出的日志文件名,便于区分和管理导出日志;

④parallel当前作业的活动 worker 的数量,也称为并行度,就是导出导入时同时执行的线程数,例如我们导出的时候设置parallel=4,那么就会同时往4个dmp文件里面导出数据;

⑤ job_name 顾名思义,就是作业名,任务名的意思,expdp/impdp导出导入类似一次作业,会有一个job_name,设置的话主要是方便中途可通过指定job_name的方式直接进入作业查看状态或者kill掉作业之类的操作;

⑥network_link 远程数据库链接,这个用于导出远程数据库或者往远程数据库导入数据。

⑦ full 导入/导出所有

(2)expdp 常用参数

① reuse_dumpfiles 是否覆盖目标转储文件,像我们如果是做成定时备份的,一般都是备份到同一个目录下,每天定时执行,那么,这个参数就需要设置为y,这样,每次执行就会覆盖之前备份导出的文件,否则就会报转储文件已存在的错误;

② filesize 导出时单个转储文件最大容量,单位为字节,可直接设置为filesize=1024m等;

③ version 导出版本,主要用于高版本数据库导向低版本。例如我们需要在11g的环境中导出,导入到10g,版本号为10.2.0.1.0的数据库中,那么在导出的时候就需要指定版本号,version=10.2.0.1.0

④ compression 压缩方式

a. all 对导出的元数据和表数据都进行压缩,耗时最长,压缩效果好;

b. data_only 仅对表数据进行压缩,压缩效果也十分明显;

c. metadata_only 默认值为此,仅对元数据进行压缩,压缩效果一般不怎么明显,但导出速度较快;

d. none 不压缩导出,导出文件最大。

(3)impdp 常用参数

①table_exists_action 导入对象已存在时的操作

a. skip 跳过,默认为此操作;

b. replace 先drop,再导入;

c.append 在原有数据的基础上增加数据;

d.truncate 先truncate清空数据,再导入数据;

② remap_table 表名映射到另一个表,例如我们导出的是t1表,导入时需要导入到t2表,可设置remap_table=t1:t2

③ remap_tablespace 表空间映射到另一个表空间,用法跟上面类似,remap_tablespace=lhy:test

④ remap_schema 用户映射到另一个用户,如从lhy用户导出,导入到test用户,remap_schema=lhy:test

3、导出(expdp)

expdp其实使用起来跟exp还是挺类似的,导出可以按用户(模式)、按表空间、按表、查询语句、或者全库导出。下面贴点代码咯,代码是写在bat文件中的,如果直接命令行,dumpfile文件名的%%u要去掉一个%

(1)按用户(模式)导出(schemas=lhy)

expdp system/oracle@orcl schemas=lhy directory=orcl_bak dumpfile=lhy_%%u.dmp logfile=lhy_export.log filesize=10m parallel=4 job_name=lhy_export reuse_dumpfiles=y

(2)按表空间导出(tablespaces=lhy)

expdp system/oracle@orcl tablespaces=lhy directory=orcl_bak dumpfile=tbs_%%u.dmp logfile=tbs_export.log filesize=10m parallel=4 job_name=tbs_export reuse_dumpfiles=y

(3)按表导出(tables=(lhy.t1,lhy.t2))

expdp system/oracle@orcl tables=(lhy.t1,lhy.t2) directory=orcl_bak dumpfile=table_%%u.dmp logfile=table_export.log filesize=10m parallel=4 job_name=table_export reuse_dumpfiles=y

(4)通过查询导出部分表数据(where yearno = 2018)

expdp system/oracle@orcl tables=lhy.t1 query=\"where yearno = 2018\" directory=orcl_bak dumpfile=table_%%u.dmp logfile=table_export.log filesize=10m parallel=4 job_name=table_export reuse_dumpfiles=y 

(5)全库导出(full=y)

expdp system/oracle@orcl full=y directory=orcl_bak dumpfile=full_%%u.dmp filesize=10m logfile=full_export.log parallel=4 job_name=full_export reuse_dumpfiles=y

4、导入(impdp)

导入(impdp)跟导出(expdp)类似,不过多出几种对象归属的转换,例如换用户(模式),换表名,换表空间等等。然后,导入之前一般都需要建好对应的表空间和对应的用户。

(1)按用户(模式)导入(schemas=lhy)

impdp system/oracle@orcl schemas=lhy directory=orcl_bak dumpfile=lhy_%%u.dmp logfile=lhy_import.log job_name=lhy_import parallel=4

这里的schemas是指的expdp导出的用户,默认是导入到同名用户,如果需要导入到不同的用户中,可用参数remap_schema,例如我们需要从lhy用户中导入到test用户中,就在impdp的语法中添加remap_schema=lhy:test,具体如下

impdp system/oracle@orcl schemas=lhy remap_schema=lhy:test directory=orcl_bak dumpfile=lhy_%%u.dmp logfile=test_import.log job_name=test_import parallel=4

(2)按表空间导入(tablespaces=lhy)

impdp system/oracle@orcl tablespaces=lhy directory=orcl_bak dumpfile=tbs_%%u.dmp logfile=tbs_import.log job_name=tbs_import parallel=4

然后,既然用户可以跨用户导,那表空间这边肯定也有类似的解决方案,例如从lhy表空间导出的,导入到test表空间,可用参数remap_tablespace=lhy:test,具体如下:

impdp system/oracle@orcl tablespaces=lhy remap_tablespace=lhy:test directory=orcl_bak dumpfile=tbs_%%u.dmp logfile=tbs_import.log job_name=tbs_import parallel=4

(3)按表导入(tables=lhy.t1)

impdp system/oracle@orcl tables=lhy.t1 directory=orcl_bak dumpfile=table_%%u.dmp logfile=table_import.log job_name=table_import parallel=4

emm...当然,你想改下表名导进去也是可以的,参数remap_table=t1:t3,将t1的导出数据导入为t3表,具体如下

impdp system/oracle@orcl tables=lhy.t1 remap_table=t1:t3 directory=orcl_bak dumpfile=table_%%u.dmp logfile=table_import.log job_name=table_import parallel=4

(4)按查询筛选表数据导入(query=" where yearno = 2018")

例如,我们要把导出的t1表中的数据中yearno列值为2018的导入到数据库,就可以用下面语法:

impdp system/oracle@orcl tables=lhy.t1 query=\" where yearno = 2018 \" directory=orcl_bak dumpfile=table_%%u.dmp logfile=table_import.log job_name=table_import parallel=4

(5)全库导入(full=y)

impdp system/oracle@orcl full=y directory=orcl_bak dumpfile=full_%%u.dmp logfile=full_import.log job_name=full_import parallel=4

5、异地备份和导入

数据泵(expdp/impdp)的异地备份会稍微比exp/imp麻烦一些,exp/imp是直接连上库就可以干,转储文件输出直接写死在本机上某个路径就可以。但是数据泵的话是采用逻辑目录的方式输出日期,而逻辑目录在数据库中认的是数据库所在的服务器的路径,而不是你自己的本机的路径。

算了不废话了,就直接说吧。

(1)首先,你要在本地上备份远程数据库,那你本地得装个oracle database,然后建个库。例如,本地数据库orcl,用户名为lhy,然后我们在本地备份ip为192.168.1.4的服务器上面的数据库gz,通过下面几种语法创建数据库链接

--先在tnsnames.ora配置好数据库连接信息,别名为gz4
sql> create public database link gz_bak connect to system identified by oracle using 'gz4';
--或者直接粗暴的把配置信息搞过来
sql> create public database link gz_bak connect to system identified by oracle using '
       (description =
         (address = (protocol = tcp)(host = 192.168.1.4)(port = 1521))
         (connect_data =
           (server = dedicated)
           (service_name = gz)
         )
       )';
--又或者简单点用ip端口实例名
sql> create public database link gz_bak connect to system identified by oracle using '192.168.1.4:1521/gz';

数据库链接创建完成后,可查询 select * from dual@gz_bak; 结果为x就代表正常链接上了。

(2)然后要在本地数据库orcl中创建一个逻辑目录,指向本地的备份文件夹,我们在一个有dba权限的用户中建一个名为gz4_bak的目录,指向d:\gz4_bak\data,然后给这个目录授读写权限,语法如下

sql> create or replace directory gz4_bak as 'd:\gz4_bak\data'; 
sql> grant read, write on directory gz4_bak to public;   --to public的就是把该权限赋给所有用户,当然,也可以单独授权给某个用户

(3)目录建好之后,就可以直接在本地备份服务器4上面的gz库了,需要用到参数network_link=gz_bak

① 按用户(备份gz4数据库上的xx用户)

expdp system/oracle@orcl schemas=xx network_link=gz_bak directory=gz4_bak dumpfile=xx_%%u.dmp logfile=xx_export.log filesize=10m parallel=4 job_name=xx_export reuse_dumpfiles=y
② 表备份(gz4上xx用户的表table1)
expdp system/oracle@orcl tables=(xx.table1) network_link=gz_bak directory=gz4_bak dumpfile=table1_%%u.dmp logfile=table1_export.log filesize=10m parallel=4 job_name=table1_export reuse_dumpfiles=y

(4)导入也是类似导出,在正常impdp导入的基础上加上network_link参数即可

① 按用户(恢复gz4上的xx用户)

impdp system/oracle@orcl schemas=xx network_link=gz_bak directory=gz4_bak dumpfile=xx_%%u.dmp logfile=xx_import.log job_name=xx_import parallel=4

② 恢复表(导入gz4上xx用户的表table1)

impdp system/oracle@orcl tables=xx.table1 network_link=gz_bak directory=gz4_bak dumpfile=table1_%%u.dmp logfile=table1_import.log job_name=table1_import parallel=4