利用expdp导出远程数据库数据

最近遇到了一个数据备份的非常规需求,经过各种上网查资料和试验,终于把流程跑通了,归纳总结如下。

背景:

  • 远程数据库服务器为Linux操作系统,无服务器登录权限,数据库版本"Version 18.3.0.0.0"
  • 本地数据库服务器为Windows系统,拥有管理员权限,数据库版本"Version 19.3.0.0.0"
  • 需要将远程数据库数据备份到本地作为临时备份。

步骤:

  • 在本地磁盘建立备份文件目录-Windows命令行 mkdir <localdisk_directory>
  • 在本地数据库建立备份文件所在目录-SQL Plus(以管理员身份登录)

SQL>create directory <directory_name> as <localdisk_directory>;

可通过查询dba_directoryies查看directory状态- SQL Plus

SQL>select * from dba_directories;

  • 创建用于数据导出的用户-SQL Plus,若利用已有用户,则略过。

SQL>create user <localdb_username> identified by <localdb_userpassword>;

SQL>create tablespace <localdb_tablespacename> datafile‘<localdisk_dbf_directory>’ size 2G autoextend on next 500M maxsize 31G; 

SQL>alter user <localdb_username> default tablespace <localdb_tablespacename>;

SQL>grant connect,resource,dba to <localdb_ username>;

  • 为用户赋予操作目录的权限-SQL Plus(以管理员身份赋予)

SQL>grant read, write on directory <directory_name> to <localdb_username>;

  • 建立本地指向远程的数据库链接-SQL Plus

create public database link <dblink_name> connect to <remotedb_username> identified by <remotedb_userpassword> using '<remotedb_tnsname>'(也可以是IP:Port/服务名,如192.168.86.8:1568/remotedb)

查看数据库链接是否成功

select * from dual@<dblink_name>

  • 将远程数据导出到本地-Windows命令行

expdp <localdb_username>/<localdb_userpassword>@<localdb_sid> directory=<directory_name> dumpfile=<exportdata_filename>.dmp logfile=<exportdata_logfilename>.log network_link=<dblink_name>

导出指定用户数据,追加schemas=<remotedb_username>

导出特定表,追加tables=table1,table2,table3,…

排除指定表,追加exclude=TABLE:\"LIKE \'A5%\'\", exclude=TABLE:\"LIKE \'TMP%\'\"表示分别排除以A5和TMP开头的表,若排除的表很多时,可以先在数据库中建立临时表exclude_table,再用exclude=TABLE:\"IN select table_name from exclude_table\"。

create table exclude_table(tablename varchar2(100));

insert into exclude_table vlaues('table1');

insert into exclude_table vlaues('table2');

insert into exclude_table vlaues('table3');

  • 导出过程

当导出数据量较大时,命令行界面中的log可能会像卡住一样不更新,但事实上log文件和dmp文件一直在后台更新。在本地磁盘的备份文件夹中刷新,log文件和dmp文件表现为隔段时间才更新一下。导出28.6G数据历时1h18min。

即使Job已经结束,命令行界面也不会自动显示完成,需要自行查看log来确认任务是否完成或出错。若确认任务结束,可在命令行界面回车,可能会出现如下错误,回车忽略关闭即可。

仅导出表结构会比较快,并且可以在命令行界面得到任务完成的提示。导出92.4MB数据历时6min。

若怀疑出问题可查看expdp状态并中断

查询expdp的job的名字

SQL> select * from dba_datapump_jobs;

查询expdp状态

CMD> expdp <username>/<password> attach=SYS_EXPORT_SCHEMA_01

        停止job,先按Ctrl+C,出现Export>后

        Export> stop_job=immediate

        提问是否停止job,输入yes,等待任务停止后会自动退出expdp命令,再次查询dba_datapump_jobs,对应STATE变为NOT RUNNING。

  • 导入过程

数据导入命令的写法跟导出很类似,导入只能试验导入本地数据库。

impdp <imp_username>/<imp_userpassword>@<localdb_sid> directory=<directory_name> dumpfile=<exportdata_filename>.dmp logfile=<exportdata_logfilename>.log 

仅导入某个用户数据,追加schemas=<EXP_USERNAME>

导入导出时用户名不同,追加remap_schema=<EXP_USERNAME>:<IMP_USERNAME> 

导入导出时用户表空间名不同,追加remap_tablespace=<EXP_TABLESPACE>:<IMP_TABLESPACE>

仅导入表结构,追加CONTENT=METADATA_ONLY

仅导入某些表,追加tables=table1,table2,...

对已存在的表操作,追加table_exists_action=replace或append等

小技巧:

在数据表比较多但只有部分表含有数据的情况下,可以先单独导出表结构,再筛选出含有数据的表并导出。一方面可以减少因一次导出数据量较大时中途出错导致任务失败,另一方面也方便在导入时根据需要选择仅导入表结构或仅导入部分数据。

 

疏漏之处请见谅,感谢各位在网上发过相关帖子的小伙伴,因查询资料较多就不一一列举了。

猜你喜欢

转载自blog.csdn.net/baidu_23133489/article/details/106568467