一. 保持服务器端环境变量和数据库字符集一致
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/
,如需转载,请注明出处,否则将追究法律责任。