0%

expdp/impdp数据泵工具运用

Oracle数据库常用的备份方式有,exp/imp, expdp/impdp和rman;
RMAN备份内容包括:整个数据库,表空间,数据文件,指定的数据文件,控制文件,归档日志文件,参数文件等,打开归档日志后,可以做到不丢失数据,后期再详细分析研究。

使用expdp和impdp时应该注重的事项:
1、exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。
2、expdp和impdp是服务端的工具程序,他们只能在oracle服务端使用,不能在客户端使用。
3、imp只适用于exp导出的文件,不适用于expdp导出文件;impdp只适用于expdp导出的文件,而不适用于exp导出文件。
4、对于10g以上的服务器,使用exp通常不能导出0行数据的空表,而此时必须使用expdp导出。

查询备份和恢复数据库的数据库信息

尽量保证数据库的版本和字符集等信息一致,否则会有很多坑。

查看数据库的版本

1
select * from v$version;

查看数据库编码

1
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

查看管理员目录

1
2
sqlplus / as sysdba
SQL> select * from dba_directories;

创建管理员目录并授权

1
2
SQL> create directory dump_dir as '/opt/db_backup';  #可以使用默认的目录,也可以自己新建目录
SQL> grant read,write on directory dump_dir to scott;

使用expdp导出数据

1
2
3
4
5
6
7
8
9
10
11
12
1)导出用户
expdp scott/tiger@orcl schemas=scott dumpfile=expdp.dmp directory=dump_dir
expdp userid="'sys/passwd@orcl as sysdba'" schemas=scott dumpfile=scott.dmp directory=DATA_PUMP_DIR #使用sys用户导出写法
2)导出表
expdp scott/tiger@orcl tables=emp,dept dumpfile=expdp.dmp directory=dump_dir
3)按查询条件导
expdp scott/tiger@orcl directory=dump_dir dumpfile=expdp.dmp tables=emp query='where deptno=20'
4)按表空间导
expdp system/manager@orcl directory=dump_dir dumpfile=tablespace.dmp tablespaces=temp,example
5)导整个数据库
expdp system/manager@orcl directory=dump_dir dumpfile=full.dmp full=y;
expdp userid="'sys/passwd@orcl as sysdba'" full=y directory=DATA_PUMP_DIR dumpfile=full.dmp #使用sys用户导出写法

用impdp导入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1)导入用户(从用户scott导入到用户scott)
impdp scott/tiger@orcl directory=dump_dir dumpfile=expdp.dmp schemas=scott
impdp userid="'sys/passwd@orcl as sysdba'" schemas=scott dumpfile=scott.dmp directory=DATA_PUMP_DIR #使用sys用户导出写法
2)导入表(从scott用户中把表dept和emp导入到system用户中)
impdp system/manager@orcl directory=dump_dir dumpfile=expdp.dmp tables=scott.dept,scott.emp remap_schema=scott:system
3)导入表空间
impdp system/manager@orcl directory=dump_dir dumpfile=tablespace.dmp tablespaces=example
4)导入数据
impdb system/manager@orcl directory=dump_dir dumpfile=full.dmp full=y
impdp userid="'sys/passwd@orcl as sysdba'" full=y directory=DATA_PUMP_DIR dumpfile=full.dmp
5)追加数据
impdp system/manager@orcl directory=dump_dir dumpfile=expdp.dmp schemas=system table_exists_action

--#####--
--如果要导到的用户与导出dumpfile的用户名不一样则要使用remap_schema代替schemas,将旧用户名指向新用户名:
impdp user_new/pass_new directory=impexp dumpfile=lsdb.dmp loggfile=lsdb.log remap_schema=user_old:user_new

--如果要导到的表空间名称不一样,则要使用remap_tablespace将旧表空间名指向新表空间名:
impdp ls/lsdb123# directory=impexp dumpfile=lsdb.dmp loggfile=lsdb.log schemas=ls remap_tablespace=tablespace_old:tablespace_new

--如果要导到的用户名和表空间名与原来导出时的都不一样,那么要同时使用remap_schema和remap_tablespace:
impdp user_new/pass_new directory=impexp dumpfile=lsdb.dmp logfile=lsdb.log remap_schema=user_old:user_new remap_tablespace=tablespace_old:tablespace_new

--如果导出的dmp文件中有多个表空间,那么remap_tablespace写多个:
impdp ls/lsdb123# directory=impexp dumpfile=lsdb.dmp loggfile=lsdb.log schemas=ls remap_tablespace='(tablespace_old1:tablespace_new1,tablespace_old2:tablespace_new2)'

--如果原先已有数据,想使用覆盖导入使用table_exists_action=replace:
impdp ls/lsdb123# directory=impexp dumpfile= lsdb.dmp logfile= lsdb.log schemas= ls table_exists_action=replace

--如果expdp限制了单个文件大小使用%U导出多个文件(比如6个),则导入:
impdp lsdb/lsdb123# directory=impexp dumpfile=lsdb_%U.dmp logfile= lsdb.log schemas= lsdb parallel=6

expdp的compression参数选项(压缩)

*** COMPRESSION=[ALL | DATA_ONLY | METADATA_ONLY | NONE] ***
Oracle 11g中新增了几种压缩方法。

1
2
3
4
5
ALL: 对导出的元数据和表数据都进行压缩,得到的导出文件是最小的,耗时也是最长的。(据说压缩比可以达到 1/7)
DATA_ONLY: 仅对表数据进行压缩,对于大数据量的导出效果明显,会比METADATA_ONLY方式得到更小的压缩文件。
METADATA_ONLY: 仅对元数据进行压缩,而不会对表数据进行压缩,这种压缩执行后效果一般不是很明显,不过速度比较快。
NONE: 不进行任何的压缩,导出后的文件也是最大的。
DEFAULT: 默认方式,即不指定COMPRESSION参数,会采用默认的压缩方式METADATA_ONLY。

impdp的TABLE_EXISTS_ACTION参数选项

默认值是skip,但若设置了CONTENT=DATA_ONLY,则默认值是APPEND,不是SKIP。
*** TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE] ***

1
2
3
4
SKIP:跳过这张表,继续下一个对象。如果CONTENT设置了DATA_ONLY参数,则不能使用SKIP。
APPEND:会加载数据至对象,但不会影响已存在的行。
TRUNCATE:删除已存在的行,然后加载所有的数据。
REPLACE:drop已存在的表,然后create并加载数据。如果CONTENT设置了DATA_ONLY,则不能使用REPLACE。

导入过程中,常用查询语句

查询表空间使用量,如果不够,可以添加文件

1
2
SELECT FILE_NAME, TABLESPACE_NAME, BYTES / 1024 / 1024 "bytes MB",MAXBYTES / 1024 / 1024 "maxbytes MB"  FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'USERS';
ALTER TABLESPACE USERS ADD DATAFILE '/u01/app/oracle/oradata/sjzdb/users02.dbf' SIZE 5M AUTOEXTEND ON MAXSIZE 32767M;

查看SCHEMAS占用的表空间大小

1
SELECT OWNER, SUM(BYTES) / 1024 / 1024 / 1024 SCHEMA_SIZE_GIG  FROM SYS.DBA_SEGMENTS GROUP BY OWNER;

查询schemas下的所有表

1
SELECT TABLE_NAME FROM SYS.DBA_TABLES WHERE OWNER = 'AIR_FORECAST';

参考链接:
http://blog.sina.com.cn/s/blog_67d41beb0100ixnb.html
https://blog.csdn.net/bisal/article/details/51482968
http://www.htz.pw/2015/05/20/expdp的compression测试.html
https://www.cnblogs.com/lsdb/p/7660774.html