oracle的简单导入导出工具一般有 exp/imp
跟 expdp/impdp
。
- exp无法导出空表结构
- exp可以导出long类型的数据,expdp不可以。long类型现在在慢慢被淘汰中。
- exp是客户端工具,expdp是服务器端工具,expdp还可以并发,exp不可以
使用exp导出而不是expdp的情况是无法直接访问数据库主机,也无法在建立dblink,这个时候只能使用exp导出。大部分情况还是用 expdp/impdp。exp无法导出空表不注意的话是很麻烦的,曾经做同步就因为这个原因导致应用无法使用,虽然网上也有一些解决办法,但是都需要对源库做一些变更,这对生产服务器来说还是很麻烦的,毕竟操作了就有风险要负责任。下面是用expdp/impdp自动同步生产跟测试库的范例。
环境
源库跟目的库的Oracle大版本要一致,并且数据库SID要一样。
本文测试环境:
- 源库操作系统
windows server 2008 R2 x64
源库数据库版本11g Enterprise Edition Release 11.2.0.1.0 - 64bit
- 目的库操作系统
win7 x64
win10 x64
windows server 2008 R2 x64
均测试成功
目的库数据库版本11g Enterprise Edition Release 11.2.0.1.0 - 64bit
查看版本:
1 | select banner from sys.v_$version; |
源库导出
在源库机器(假定SID名为ORCL)执行以下操作:
1. 打开CMD,用sysdba登录数据库。
有些操作系统安装了不止一个数据库实例,为了确保操作的是源库,在CMD命令行中先执行一次set ORACLE_SID=ORCL
:
1
2set ORACLE_SID=ORCL
sqlplus / as sysdba
先检查一下登录的数据库:
1
2
3
4SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl
2. 新建directory(首次导出才要)。
1
2
3
SQL> create directory dump_dir as 'D:\dump';
SQL> grant all on directory dump_dir to test;
SQL> select * from dba_directories;
3. 执行导出操作。
此操作再CMD中执行,不是登录到SQLPLUS里面。可用Ctrl+C
退出SQLPLUS。
1
expdp system/manager@ORCL directory=dump_dir dumpfile=expdp_orcl_full.dmp logfile=expdp_orcl_full.log FULL=y;
导出完成后,在D:\dump
里面就能看到文件了,然后拷贝到目标机器的director
路径里面。
目的库导入
首次导入同源库导出1、2步骤操作,这里省略。
因为目的库已经有各种用户对象了,不确定这些已存在对象会不会影响导入结果,所以这边先进行删除对象操作,然后再进行导入操作,最后重新编译一下一些存储过程等。
1.删除对象
先创建删除对象的脚本,CMD下执行:
1
sqlplus system/manager@ORCL @d:\orcl_build_drop_sql.sql
其中,orcl_build_drop_sql.sql
如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24-- d:\orcl_build_drop_sql.sql
set feedback off heading off verify off trimspool off
set pagesize 0 linesize 100
define v_spool ='d:\orcl_drop_objects.sql'
spool &v_spool
SELECT 'DROP PACKAGE BODY '|| OWNER ||'.'|| OBJECT_NAME ||';' FROM ALL_OBJECTS WHERE OBJECT_TYPE='PACKAGE BODY' AND OWNER IN (('DBUSER1','DBUSER2'))
union all
SELECT 'DROP PACKAGE '|| OWNER ||'.'|| OBJECT_NAME ||';' FROM ALL_OBJECTS WHERE OBJECT_TYPE='PACKAGE' AND OWNER IN (('DBUSER1','DBUSER2'))
union all
SELECT 'DROP PROCEDURE '|| OWNER ||'.'|| OBJECT_NAME ||';' FROM ALL_OBJECTS WHERE OBJECT_TYPE='PROCEDURE' AND OWNER IN (('DBUSER1','DBUSER2'))
union all
SELECT 'DROP FUNCTION '|| OWNER ||'.'|| OBJECT_NAME ||';' FROM ALL_OBJECTS WHERE OBJECT_TYPE='FUNCTION' AND OWNER IN (('DBUSER1','DBUSER2'))
union all
SELECT 'DROP SEQUENCE '|| SEQUENCE_OWNER ||'.'|| SEQUENCE_NAME ||';' FROM ALL_SEQUENCES WHERE SEQUENCE_OWNER IN (('DBUSER1','DBUSER2'))
union all
SELECT 'DROP VIEW '|| OWNER ||'.'|| VIEW_NAME ||';' FROM ALL_VIEWS WHERE OWNER IN (('DBUSER1','DBUSER2'))
union all
SELECT 'DROP TABLE '|| OWNER ||'.'|| TABLE_NAME ||' CASCADE CONSTRAINTS PURGE;' FROM ALL_TABLES WHERE OWNER IN (('DBUSER1','DBUSER2'))
union all
SELECT 'exit ' from dual;
spool off
exit
创建的删除脚本在 d:\orcl_build_drop_sql.sql
,在CMD中执行脚本删除对象:
1
sqlplus system/krcs@KRCS @d:\krcs_drop_objects.sql
2.导入操作
执行导入操作:
1
impdp system/manager@ORCL directory=dump_dir dumpfile=expdp_orcl_full.dmp logfile=impdp_orcl_full.log FULL=y;
3.重新编译无效对象
oracle自带脚本$ORACLE_HOME/rdbms/admin/utlrp.sql
可重新编译无效对象。
1
sqlplus system/krcs@KRCS @D:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlrp.sql
汇总所有操作写成批处理自动执行
1.源库定时导出并发送
在源库机器新建一个任务计划,每天执行以下批处理。
1 | @echo off |
2.目的库定时导入
在目的库机器新建一个任务计划,每天执行以下批处理(执行时间在源库的定时时间延后2小时)。
1 | @echo off |