ITPub博客

首页 > 数据库 > Oracle > 12c 数据泵常用功能总结

12c 数据泵常用功能总结

原创 Oracle 作者:SnowDBA 时间:2015-02-27 17:13:24 0 删除 编辑
一. 保持服务器端环境变量和数据库字符集一致
SYS@cdb >select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

[oracle@snow ~]$ echo $LANG
en_US.UTF-8

如果需要调整环境变量可以使用下面的命令
[oracle@snow ~]$ export LANG=AMERICAN_AMERICA.AL32UTF8

二. 创建作业的准备工作
1, 目录
尽量不要使用ORACLE_HOME挂载点,防止导出文件过大导致挂载点空间不足使数据库挂起。
create or replace dp_dir as ‘/oradump’;

select owner,directory_name,directory_path from dba_directories;

grant read,write on directory dp_dir to dp

2, pdb所需环境
1,登录cdb,查看pdb。如果此时pdb1是mount状态可以切换到pdb1下执行alter database open命令和普通数据库一样。或者使用alter pluggable database all open开启所有的pdb。

SYS@cdb >show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO

2,切换到pdb1
SYS@cdb >alter session set container=pdb1;

3,单独创建一个dba权限的数据泵用户
SYS@cdb >grant dba to dp identified by dp;

4,创建一个数据泵目录dp_dir,路径为oracle家目录
SYS@cdb >create or replace directory dp_dir as '/home/oracle';

5,设置tnsnames.ora,增加pdb1的链接。HOST按照自己主机的地址添加,SERVICE_NAME为pdb的示例名,这里为pdb1
[oracle@snow ~]$ cd $ORACLE_HOME/network/admin
[oracle@snow admin]$ cat tnsnames.ora
pdb1=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.228.12)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)

调用方法为:expdp dp/dp@pdb1 directory=dp_dir dumpfile=hr_pdb1.dmp logfile=hr_pdb1.log schemas=hr

三. 参数文件的使用
某些数据泵命令含有引号,比如ogg表级别同步时经常用到的FLASHBACK_TIME或者使用sys用户的/as sysdba字据。当命令中含有引号时,最好使用参数文件。

[oracle@snow ~]$ vi hrexp.par
userid="/ as sysdba"
directory=dp_dir
dumpfile=hr.dmp
logfile=hr.log
schemas=hr

$ expdp parfile=hrexp.par

四. OGG表级初始化需要注意的一致性问题

1, 取得当前的scn
SYS@ora12c >select current_scn from v$database;

CURRENT_SCN
-----------
2096937

2,使用FLASHBACK_SCN参数一致性导出数据
由于语句比较长,在employees 后面采用了换行符号\,注意employee与\之间有空格。下一行的>是回车后自动生成的,表示后面的内容和前面的是一行的。
[oracle@snow ~]$ expdp dp/dp directory=dp_dir dumpfile=20150226.dmp tables=hr.employees \
> flashback_scn=2096937

3,使用FLASHBACK_TIME参数一致性导出数据
在这里建议使用参数文件的方式,这样会省去很多转移符

[oracle@snow ~]$ vi flashback.par
userid=dp/dp
directory=dp_dir
dumpfile=20150226_1.dmp
logfile=20150226_1.log
tables=hr.employees
flashback_time="to_timestamp('2015-02-09 16:00:00','yyyy-mm-dd hh24:mi:ss')"

[oracle@snow ~]$ expdp parfile=flashback.par

五. 导出数据库元数据
[oracle@snow ~]$ expdp dp/dp@pdb1 directory=dp_dir dumpfile=tbs.dmp full=y include=tablespace content=metadata_only

[oracle@snow ~]$ impdp dp/dp@pdb1 directory=dp_dir dumpfile=tbs.dmp sqlfile=tbs.sql content=metadata_only

如果expdp中include=table,在到处作业时数据泵会导出所有相关依存对象,比如与表相关的index,constrain,triggerexpdp dp/dp@pdb1 directory=dp_dir dumpfile=tbs.dmp full=y include=table content=metadata_only

看看生成的sql语句全貌
[oracle@snow ~]$ more tbsp.sql

单个对象的提取DDL可以使用dbms_metadata.get_ddl
SYS@cdb >alter session set container=pdb1;
SYS@cdb >set long 9999
SYS@cdb >set pages 100
SYS@cdb >select dbms_metadata.get_ddl('TABLE','EMPLOYEES','HR') from dual;

六. include/exclude
include: 我们只需要的内容
include=tablespace:只对表空间作业,其它的表、索引、统计信息等等都不关心。

exclude: 我们不想要的内容
exclude=index: 作业中不包含index,其它的都保留。

七. remap异构复制
有时候需要将用户及其对象和数据移动到其他数据库时候,可能会需要重命名。这时候可以采用数据泵中remap_schema参数来处理。

导出schema为HR的所有内容
[oracle@snow ~]$ expdp dp/dp directory=dp_dir dumpfile=hr.dmp logfile=hr.log schemas=hr

导入schema为HR的所有内容,并且重名为hr_new。 如果此时数据库中没有hr_new用户,数据泵会自动创建。
[oracle@snow ~]$ impdp dp/dp directory=dp_dir dumpfile=hr.dmp remap_schema=hr:hr_new

如果只需要元数据,并不需要数据可以使用content=metadata_only参数来实现
[oracle@snow ~]$ impdp dp/dp directory=dp_dir dumpfile=hr.dmp remap_schema=hr:hr_new_2 content=metadata_only

八. 估算作业大小
使用estimate_only=y来计算导出文件的大小。这里可以估算全库full=y,可以估算schemas,也可以估算某些表
[oracle@snow ~]$ expdp dp/dp estimate_only=y full=y logfile=n

九. 导出文件已经存在、导入对象已经存在
[oracle@snow ~]$ expdp dp/dp@pdb1 directory=dp_dir dumpfile=full_pdb1.dmp logfile=full_pdb1.log full=y reuse_dumpfiles=y

[oracle@snow ~]$ vi tables_imp.par
userid=dp/dp
directory=dp_dir
dumpfile=tables.dmp
logfile=tables.log
tables=
HR.REGIONS,
HR.LOCATIONS,
SH.PROMOTIONS,
SH.CUSTOMERS,
SH.COUNTRIES
table_exists_action=replace

十. 关于性能优化的几个用法
1. 并行
[oracle@snow ~]$ expdp dp/dp@pdb1 directory=dp_dir dumpfile=full_%U.dmp parallel=2 logfile=full.log full=y reuse_dumpfiles=y

Oracle建议并行度不要大于服务器上CPU数量的两倍,这一点和rman的通道不同,rman的每一个通道基本上会耗尽一颗cpu(启用压缩)。

2. 压缩
[oracle@snow ~]$ expdp dp/dp@pdb1 directory=dp_dir dumpfile=hr_cb.dmp logfile=hr.log schemas=hr reuse_dumpfiles=y compression=all compression_algorithm=basic

压缩比例分为:BASIC , LOW , MEDIUM, HIGH
下面的测试分别将各种压缩参数执行了一遍,对比一下结果发现即使最小压缩low也能节省将近50%的空间!
[oracle@snow ~]$ du -sh hr*
196K hr_ch.dmp  <—HIGH   34.5%
220K hr_cm.dmp  <—MEDIUM 38.7%
240K hr_cb.dmp  <—BASIC  42.25%
240K hr_c.dmp   <—默认    42.25%
280K hr_cl.dmp  <—LOW    49.29%
568K hr.dmp     <—不压缩

十一. 空间不足的救命稻草
如果在expdp导出时候目录空间不够了可以进入交互模式,向其它目录空间追加数据泵文件
[oracle@snow ~]$ expdp dp/dp@pdb1 directory=dp_dir dumpfile=full_%U.dmp parallel=2 logfile=full.log full=y reuse_dumpfiles=y
...
...
Ctrl+c进入交互模式
Export> add_file=<其它目录>:data.dmp

十二. 12c新特性
1. 将视图导出为表
$ expdp dp/dp@pdb1 directory=dp_dir dumpfile=vm.dmp views_as_tables=sales_rockies

$ impdp dp/dp@pdb1 directory=dp_dir dumpfile=vm.dmp tables=sales_rockies

2. 导入数据时开启transform=disable_archive_logging:Y 避免生成redo日志
[oracle@snow ~]$ impdp dp/dp directory=dp_dir dumpfile=hrc.dmp \
> transform=disable_archive_logging:Y


十三. 监控数据泵运行状态
开启两个并行通道导出全库数据
[oracle@snow ~]$ expdp dp/dp@pdb1 directory=dp_dir dumpfile=full_%U.dmp parallel=2 logfile=full.log full=y reuse_dumpfiles=y

1. 在sqlplus中通过视图监控
[oracle@snow ~]$ sqlplus / as sysdba

col owner_name for a10
col opration for a10
col job_name for a20
col state for a10
col operation for a20

正在运行的job名称
SYS@cdb >select owner_name,operation,job_name,state from dba_datapump_jobs;

OWNER_NAME OPERATION JOB_NAME STATE
---------- -------------------- -------------------- ----------
DP EXPORT SYS_EXPORT_FULL_03 EXECUTING

col usernmae for a10
col process for a10
set line 120

正在运行的job sid,serial#
SYS@cdb >select sid,serial#,username,process,program from v$session s,dba_datapump_sessions d where s.saddr=d.saddr;

SID SERIAL# USERNAME PROCESS PROGRAM
---------- ---------- ------------------------------ ---------- ------------------------------------------------
272 1079 DP 85198 ude@snow.oracle.com (TNS V1-V3)
254 2395 DP 85204 oracle@snow.oracle.com (DM00)
30 339 DP 85206 oracle@snow.oracle.com (DW00)
21 1657 DP 85208 oracle@snow.oracle.com (DW01)

2. OS进程,ora_dmNN为主进程,ora_dwNN为工进程,多个并行就会有相对应的工进程
[oracle@snow ~]$ ps -ef | egrep 'ora_dm|ora_dw' | grep -v egrep
oracle 6326 1 7 01:09 ? 00:00:01 ora_dm00_cdb
oracle 6328 1 89 01:09 ? 00:00:22 ora_dw00_cdb
oracle 6330 1 93 01:09 ? 00:00:17 ora_dw01_cdb

3. 追踪警告日志
[oracle@snow trace]$ tail -200f alert_cdb.log
…
Mon Feb 09 20:09:17 2015
DM00 started with pid=53, OS id=85204, job DP.SYS_EXPORT_FULL_03
Mon Feb 09 20:09:18 2015

DW00 started with pid=56, OS id=85206, wid=1, job DP.SYS_EXPORT_FULL_03
Mon Feb 09 20:09:21 2015
Thread 1 cannot allocate new log, sequence 28
Private strand flush not complete
Current log# 3 seq# 27 mem# 0: /u01/app/oracle/oradata/cdb/redo03.log
Mon Feb 09 20:09:23 2015

DW01 started with pid=64, OS id=85208, wid=2, job DP.SYS_EXPORT_FULL_03
Mon Feb 09 20:09:24 2015
Thread 1 advanced to log sequence 28 (LGWR switch)
Current log# 1 seq# 28 mem# 0: /u01/app/oracle/oradata/cdb/redo01.log
Mon Feb 09 20:09:24 2015
Archived Log entry 16 added for thread 1 sequence 27 ID 0x767a0947 dest 1:

十四. 后台执行安全第一
数据泵作业、rman作业都是比较耗时的工作,而且依赖执行命令的窗口。如果窗口被关闭,作业很可能就挂掉了,所以最好使用后台执行方式,并且通过tail日志来跟踪输出。当然这样做就不能使用交互方式来中断数据泵了。

后台执行方式
nohup expdp \'/ as sysdba\' directory=dp_dir dumpfile=para_%u.dmp parallel=5 schemas=scott; &

数据泵是DBA经常使用的一个工具,总结一下记录下来以备不时之需。

全文完!










来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29047826/viewspace-1443034/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-06-21

  • 博文量
    223
  • 访问量
    1633613