Oracle expdp/impdp使用

使用前需要确定导入导出的文件路径,oracle通过directory来识别系统上的文件路径。

1.查看有哪些目錄可供使用

SQL> select * from dba_directories;
OWNER   DIRECTORY_NAME            DIRECTORY_PATH
SYS	XMLDIR	                  /oracle/11204/rdbms/xml
SYS	ORACLE_OCM_CONFIG_DIR	  /oracle/11204/ccr/hosts/zzltestdb/state
SYS	DATA_PUMP_DIR	          /oracle/admin/zzloracle/dpdump/
SYS	ORACLE_OCM_CONFIG_DIR2	  /oracle/11204/ccr/state

2.创建自己的导出导入目录

SQL> CREATE DIRECTORY MYDIR AS ‘/Data/mydir‘;

3.expdp导出
以下是直接导出的方式

--按照schema导出所有对象
expdp user/passwd directory=MYDIR dumpfile=hr.dmp schemas=hr content=METADATA_ONLY  logfile=hr.log
--按照schema导出指定表(包含授权、索引及trigger,sequence不会被出),tables选项和schemas选项不能同时出现,指定owner需要在表名前写出
expdp user/passwd directory=MYDIR dumpfile=user.dmp tables=hr.user,hr.company content=METADATA_ONLY  logfile=user.log
--使用sys用戶导出	
expdp \‘sys/oracle as sysdba\‘ directory=MYDIR dumpfile=hr.dmp  schemas=hr content=ALL logfile=hr.LOG
--导出指定类型的指定对象,在linux命令行中,‘ " ( ) $ #需要使用\转义,否则expdp报错无法识别 
expdp \‘sys/oracle as sysdba\‘ directory=MYDIR dumpfile=hr.dmp  schemas=hr INCLUDE=VIEW:\"in\(\‘v\$user\‘,\‘v\$company\‘\)\"
--根据条件导出表的部分数据
expdp user/passwd directory=MYDIR dumpfile=user.dmp tables=hr.user,hr.company content=METADATA_ONLY  logfile=user.log query=\"where ADD_DATE \>=to_Date\(\‘2019-05-01\‘,\‘YYYY-MM-DD\‘\)\"
--全库导出,%U从01开始递增,parallel(并行)为几就会生成几个文件,filesize参数和parallel共存时会导致filesize失效,full=y是全库导出 compression是压缩
expdp user/passwd directory=mydir dumpfile=testdb_%U.dmp logfile=testdb.log full=y content=ALL  compression=ALL parallel=10

以下为脚本导出,脚本导出的好处是不用转义,条件清晰

# vi /Data/mydir/myexpdp.par
  DIRECTORY=MYDIR
  DUMPFILE=user.dmp
  CONTENT=METADATA_ONLY
  LOGFILE=user.log
  schemas=hr
# expdp user/passwd parfile=myexpdp.par 

4.impdp导入
导入语句和导出相差不多,后面跟的关键词只有个别差异

--有了导出文件可以直接导入,schemas如果想导入所有的就不用写,如果指定就可以写,content相同,如果只导入数据则用data_only,数据和结构都要则用all,metadata_only是数据不要其他都要
impdp user/passwd directory=MYDIR dumpfile=hr.dmp schemas=hr content=METADATA_ONLY  logfile=hr.log
--导入指定表,conten条件不写时,导出指定的什么,导入就会是什么(例如导出是data_only,导入也就只有数据)
impdp user/passwd directory=MYDIR dumpfile=user.dmp tables=hr.user,hr.company logfile=user.log
--导入带有表结构时,表空间的处理,REMAP_TABLESPACE=old_tablespace:new_tablespace为替换表空间
--不想一个个改表空间时可以选择TRANSFORM=segment_attributes:n,意思是导入后使用schema的默认表空间
impdp user/passwd directory=MYDIR dumpfile=user.dmp tables=hr.user,hr.company content=METADATA_ONLY logfile=user.log REMAP_TABLESPACE=user_tablespace:test_tablespace
--导入到不同owner下的相同表名里
impdp user/passwd directory=MYDIR dumpfile=user.dmp remap_schema=hr:emp tables=hr.user,hr.company logfile=user.log
--导入到不同owner下的不同表名里,多表的话要一一对应,不然默认导入相同表名内
impdp user/passwd directory=MYDIR dumpfile=user.dmp remap_schema=hr:emp REMAP_TABLE=user:company content=data_only logfile=user.log

5.19c的expdp

--19c导出需要加一个@指定PDB,导出文件可向下兼容,添加version即可指定版本
expdp user/passwd@PITIMDB directory=mydir dumpfile=hr.dmp logfile=hr.log content=all tables=hr.emp version=11.2.0.4.0

6.exp导出sys等系统用户下的对象

--expdp无法导出sys等系统用户下的对象,可以使用传统exp导出解决,更多命令可以使用exp help=y来查看
exp "‘sys/oracle as sysdba‘" file=/Data/mydir/FGA_LOG.dmp log=/Data/mydir/FGA_LOG.log tables=SYS.FGA_LOG\$  query=\"where FROM_TZ\(ntimestamp\#, \‘00:00\‘\) AT LOCAL BETWEEN TO_TIMESTAMP\(TO_CHAR\(SYSDATE - 123,\‘YYYYMMDD\‘\) \|\| \‘073000000\‘,\‘YYYYMMDDHH24MISSFF\‘\) AND TO_TIMESTAMP\(TO_CHAR\(SYSDATE,\‘YYYYMMDD\‘\) \|\| \‘073000000\‘,\‘YYYYMMDDHH24MISSFF\‘\)\"
--exp导出的文件只能imp导入,expdp同理
imp "‘sys/oracle as sysdba‘" file=/Data/mydir/FGA_LOG.dmp log=/Data/mydir/FGA_LOG.log fromuser=sys touser=test data_only=y

7.导入导出进度查看

--进入命令行后可以使用status查看进度,kill_job杀死任务
impdp user/passwd attach=SYS_IMPORT_FULL_01

8.查看导出的表所在的表空间

SELECT DISTINCT TABLESPACE_NAME FROM DBA_TABLES WHERE OWNER=‘owner‘ 
UNION 
SELECT DISTINCT TABLESPACE_NAME  FROM DBA_INDEXES  WHERE OWNER=‘owner‘ 
UNION 
SELECT DISTINCT TABLESPACE_NAME FROM DBA_TAB_PARTITIONS   WHERE TABLE_OWNER=‘owner‘ 
UNION 
SELECT DISTINCT TABLESPACE_NAME FROM DBA_IND_PARTITIONS   WHERE INDEX_OWNER=‘owner‘

Oracle expdp/impdp使用

上一篇:oracle恢复误删表或数据


下一篇:什么是新的HTML5?