使用前需要确定导入导出的文件路径,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‘