之前本来想写篇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