之前做数据备份的时候用的都是exp 和 imp,但最近exp导了一个几十万数据的表就花了将近10分钟时间,简直不能忍。一直听说expdp的效率高,今天就来试一试。
按照惯例,先贴几篇有用的文章,使用expdp导出数据,dblink的操作。
最先需要明确场景,本地库A和远程数据库B,现在想要把B的数据迁移到A里面来。(如果是本地库中不同用户C和D,那么就无需dblink)。需要实现上述需求,需要分为以下几个步骤。
1.本地库A建立dblink连接远程数据库B
dblink是方便本地用户无需登录B,而能获得B库中的表结构和数据,sql为
select * from sys_user@netlink
其中netlink为本地库A创建的dblink。
创建dblink的语句如下,注意dblink为public。
create public database link netlink connect to rwtest identified by rwtest
using'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.65)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =IOT)
)
)';
如果觉得using里面的服务实例太长,可以用netmanger建立一个新的服务
这样就可以简单写成
create public database link netlink connect to rwtest identified by rwtest using 'orcl_rwtest';
2.创建directory
expdp,impdp都需要用到directory,导出或者导入的dmp文件全放在directory中
select * from all_directories -- 查directory
create or replace directory DMPDIR as '/opt/exp_rwtest'
drop directory dmpdir
3.expdp 导出
system/123456为本地库A的用户名密码,netlink连接到远程库B,导出表需要加上schema
expdp system/123456 network_link=netlink directory=dmpdir dumpfile=345.dmp tables=RWTEST.ALARM_INFO
很遗憾我这里出错了,不知道什么原因。。。可能是数据库版本不一致,也可能是本机的oracle有问题。但导出本地库肯定是没问题的,也不需要network_link。如果有遇到类似问题的大佬麻烦告知下解决方法。
4.impdp 导入
语句很简单,需要注意的是table_exists_action,默认是skip,表示如果导入库中有该表,则略过不导入。还有truncate,append,replace(先替换,后插入)等。
impdp system/123456 directory=dmpdir dumpfile=345.dmp tables=RWTEST.ALARM_INFO table_exists_action=append
注意的是A库中也得有RWTEST用户才行,否则需要用REMAP_SCHEMA=RWTEST:ZYK 进行重新映射用户,还有remap_tablespace切换表空间等。
impdp zyk/123456@IOT directory=dmpdir dumpfile=export_0426.dmp tables=RWTEST.OAUTH_USERS REMAP_SCHEMA=RWTEST:ZYK table_exists_action=append