首页 > 代码库 > 玩转Oracle之12c 可插拔数据库数据泵功能体验

玩转Oracle之12c 可插拔数据库数据泵功能体验

数据泵可以高效备份、复制、保护和传输大量的数据和源数据。在导入和导出过程中可以做到过滤数据和对象,并且能够在全数据库级、方案级、表级和表空间级实现导入导出。

Oracle12c的datapump功能跟以前差不多,在多租户的环境中执行导入\导出以及使用一些更细化的参数的时候,几乎没有区别,依然很好用,效率很高。目前有很多的用户仍然在使用exp/imp工具在执行一些迁移、备份、过滤和转移数据的工作,相比起来,数据泵的效率更高、更易用并且更方便管理,但exp/imp在有些时候可以完成datapump不适用的情况。两者的操作风格和格式很相似,相信在您掌握了其中任一种工具之后,另一种会很容易上手。

数据泵可以高效备份、复制、保护和传输大量的数据和源数据。在导入和导出过程中可以做到过滤数据和对象,并且能够在全数据库级、方案级、表级和表空间级实现导入导出。

在此,我们简单体验一下数据泵在可插拔数据库中的基本操作过程,你将会发现,跟以前传统的非插拔数据库几乎没有太大区别。 

在Oracle12c的可插拔数据库环境中,首先启动CDB:

[oracle@cafe ~]$ export ORACLE_SID=cup  -----CDB的名字自定义为cup,顾名思义cup作为容器储存数据库,我们的PDB自定义为tea。

 

[js] view plaincopy
 
  1. [oracle@cafe ~]$ sqlplus / as sysdba  
  2.   
  3. SQL*Plus: Release 12.1.0.2.0 Production on Fri Jan 23 15:06:41 2015      
  4.   
  5. Copyright (c) 1982, 2014, Oracle.  All rights reserved.  
  6.   
  7. Connected to an idle instance.  
  8.   
  9. SQL> startup            -----启动CDB  
  10. ORACLE instance started.  
  11.   
  12. Total System Global Area  767557632 bytes  
  13. Fixed Size                  2929112 bytes  
  14. Variable Size             574623272 bytes  
  15. Database Buffers          184549376 bytes  
  16. Redo Buffers                5455872 bytes  
  17. Database mounted.  
  18. Database opened.  
  19.   
  20.   
  21. SQL> alter pluggable database tea open;           -----在CDB中启动可插拔数据库(PDB)tea。  
  22.   
  23. Pluggable database altered.  
  24.   
  25. SQL> alter session set container = tea;           -----切换到PDB中(tea)。  
  26.   
  27. Session altered.  
  28.   
  29. SQL> show con_name         
  30.   
  31. CON_NAME  
  32. ------------------------------  
  33. TEA                                   -----经验证,已切换到tea数据库容器。  
  34. SQL> show parameter service;  

 

做数据泵的导出需要首先创建目录对象,主要用于作为导出目的地存放导出文件用,应该事检查操作系统中有充足的空间可用并且该空间在数据库服务器本地。这样做的好处之一是可以对目录结构等信息达到保密的安全效果,不赞成使用默认的路径,因为可能会导致空间不足问题,以至于影响数据库正常功能。

在数据库系统中创建相关目录:

 

[js] view plaincopy
 
  1. [root@cafe /]# mkdir /oradump  
  2. [root@cafe /]# chmod -R 777 /oradump  
  3. [root@cafe /]# chown -R oracle.oinstall /oradump  
  4.   
  5.   
  6. SQL> create directory dump_dir as ‘/oradump‘;            -----在数据库中创建该目录的对象信息。  
  7. Directory created.  
  8.   
  9. SQL> select directory_name,directory_path from dba_directories;  
  10. DIRECTORY_NAME      DIRECTORY_PATH  
  11. --------------      --------------  
  12. DUMP_DIR            /oradump  

 

插入测试数据,以备验证后期验证导出、导入的效果:

 

[js] view plaincopy
 
  1. SQL> create table test(id number);  
  2. Table created.  
  3.   
  4. SQL> insert into test values(1);  
  5. 1 row created.  
  6.   
  7.   
  8. SQL> CREATE USER eric  IDENTIFIED BY gao ACCOUNT UNLOCK;     
  9. User created.  
  10.   
  11. SQL> grant dba to eric;  
  12. Grant succeeded.  
接下来我们执行一次全库导出: 

 

expdp eric/gao directory=dump_dir dumpfile=fullbak.dmp  logfile=fullbak.log full=y

参数解释:

 

  • directory:指定的是咱们刚创建的目录对象中的路径别名,在dba_directories中对应着directory_name字段。
  • dumpfile:自定义导出文件的filename。
  • logfile:可以把整个导入、导出过程中的操作信息输出到文件中,以便后期验证备份效果和排错用。
  • full:等于y的时候为全库导出模式。

 

注意:导出所用的用户不要用sys,一般用具有dba角色的用户即可,system也可用。

导出过程:

[oracle@cafe ~]$ expdp eric/gao@tea directory=dump_dir dumpfile=fullbak.dmp   logfile=fullbak.log full=y 
Export: Release 12.1.0.2.0 - Production on Fri Jan 23 18:34:12 2015    -----此行包含版本、导出操作开始的时间,该时间可用于计算导出总时间和记录操作时间点。

 

[js] view plaincopy
 
  1. Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.  
  2.   
  3. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production  
  4. With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options  
  5. Starting "ERIC"."SYS_EXPORT_FULL_01":  eric/********@tea directory=dump_dir dumpfile=fullbak.dmp logfile=fullbak.log full=y   
"ERIC"."SYS_EXPORT_FULL_01"为当前执行的job的名字,可用于中途介入导入、导出过程中调整策略和查看状态。 

 

 

[js] view plaincopy
 
  1. Estimate in progress using BLOCKS method...  
  2. Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA  
  3. Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA  
  4. Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA  
  5. Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA  
  6. Total estimation using BLOCKS method: 4.265 MB     
估算本次导入、导出的总大小。 

 

 

[js] view plaincopy
 
  1. ...省略多行...  
  2. Processing object type DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER  
  3. Processing object type DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER  
  4. Processing object type DATABASE_EXPORT/TABLESPACE                                    
  5. . . exported "SYS"."KU$_USER_MAPPING_VIEW"               6.109 KB      38 rows  
  6. ...省略多行...  
  7. . . exported "SYS"."NACL$_WALLET_EXP"                        0 KB       0 rows  
  8. . . exported "WMSYS"."WM$EXP_MAP"                        7.718 KB       3 rows  
  9. Master table "ERIC"."SYS_EXPORT_FULL_01" successfully loaded/unloaded  
  10. ******************************************************************************  
  11. Dump file set for ERIC.SYS_EXPORT_FULL_01 is:  
  12.   /oradump/fullbak.dmp  
  13. Job "ERIC"."SYS_EXPORT_FULL_01" successfully completed at Fri Jan 23 18:49:29 2015 elapsed 0 00:12:55      
此行包含job名称,完成时间和总共使用时间,有时可能没有elapsed,可以根据该操作刚开始的时间做减法,算总时间。 

 

查看一下导出的文件: 

[root@cafe oradump]# ls -lh            

总用量 2.8M

-rw-r----- 1 oracle oinstall 2.8M 1月  23 18:49 fullbak.dmp 

导出的实际容量和其估算的容量还是有一定出入的,因此建议在准备存储空间的时候多预留一些。

-rw-r--r-- 1 oracle oinstall 9.4K 1月  23 18:49 fullbak.log

我们也可以只估算导出文件的大小而不进行实际的导出操作: 

expdp eric/gao@tea  estimate_only=y directory=dump_dir  logfile=n full=y

此处我们使用了estimate_only参数,将该参数置于y状态即可开启估算功能,此处不需要写dumpfile参数,否则可能会报错。 

输出结果:

 

[js] view plaincopy
 
  1. [oracle@cafe ~]$ expdp eric/gao@tea  estimate_only=y directory=dump_dir   logfile=n full=y  
  2.   
  3. Export: Release 12.1.0.2.0 - Production on Fri Jan 23 22:08:30 2015  
  4.   
  5. Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.  
  6.   
  7. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production  
  8. With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options  
  9. Starting "ERIC"."SYS_EXPORT_FULL_01":  eric/********@tea estimate_only=y directory=dump_dir logfile=n full=y   
  10. Estimate in progress using BLOCKS method...  
  11. Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA  
  12. Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA  
  13. Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA  
  14. Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA  
  15. .  estimated "SYS"."KU$_USER_MAPPING_VIEW"                  16 KB  
  16. .  estimated "ORDDATA"."ORDDCM_DOCS"                      1.25 MB  
  17. .  estimated "WMSYS"."WM$CONSTRAINTS_TABLE                 320 KB  
  18. .  estimated "WMSYS"."WM$LOCKROWS_INFO                    192 KB  
  19. .  estimated "WMSYS"."WM$UDTRIG_INFO                      192 KB<br>.  estimated "LBACSYS"."OLS$AUDIT_ACTIONS"                  64 KB  
  20. .  estimated "LBACSYS"."OLS$DIP_EVENTS"                     64 KB  
  21. .  estimated "LBACSYS"."OLS$INSTALLATIONS"                  64 KB  
  22. .  estimated "LBACSYS"."OLS$PROPS"                          64 KB  
  23. ...省略多行...  
  24. Total estimation using BLOCKS method: 4.265 MB  

 

此处我们看到,该值跟咱们上一次做实际全库导出过程中算的值一样。 

Job "ERIC"."SYS_EXPORT_FULL_01" successfully completed at Fri Jan 23 22:10:18 2015 elapsed 0 00:01:32

数据泵有一个好处,那就是交互操作模式,我们可以在作业运行中去监控运行状态,并且可以暂停、启动作业,也可以终止作业。

查看正在执行的导入导出状态:

 

[js] view plaincopy
 
  1. Export> status                    -----查看当前作业状态  
  2. Job: SYS_EXPORT_FULL_02           -----作业名,上面的全库导出我们也看到过有对应的名字  
  3.   Operation: EXPORT               -----操作类型:                
  4.   Mode: FULL                      -----模式:全库导出     
  5.   State: EXECUTING                -----状态:执行中              
  6.   Bytes Processed: 0               
  7.   Current Parallelism: 1          -----当前并行数,如果指定了parallel参数,便会影响该值,并且下面会对应的有worker1~workerN  
  8.   Job Error Count: 0  
  9.   Dump File: /oradump/fullbak.dmp   
  10.     bytes written: 4,096          -----已写入的字节  
  11.     
  12. Worker 1 Status:  
  13.   Instance ID: 1  
  14.   Instance name: cup              -----实例名为cup,容器数据库CDB的名称  
  15.   Host name: cafe                 -----操作系统主机名  
  16.   Process Name: DW00              -----相关写进程,如果设置了parallel的话,会有更多DWNN。  
  17.   State: EXECUTING      

 

返回导入/导出命令行输出状态: 

 

[js] view plaincopy
 
  1. Export> continue_client  
  2. Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA  
  3. Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA  
  4. Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA  
  5. Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA  
  6. Total estimation using BLOCKS method: 4.578 MB  
  7. Processing object type DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER  
  8. Processing object type DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER  
  9. Processing object type DATABASE_EXPORT/TABLESPACE  
  10. Processing object type DATABASE_EXPORT/PROFILE  
暂停正在运行的导入/导出操作,该操作不会导致作业停止,只是暂时停止,类似于断点续传:

 

 

[js] view plaincopy
 
  1. Export> stop_job  
  2. Are you sure you wish to stop this job ([yes]/no): yes  

 

附加正在运行的作业,在这里就用到了咱们一再提到的job名称了,使用attach参数指定作业名称就可附加到正在执行或者是暂停的作业中去: 

 

[js] view plaincopy
 
  1. [oracle@cafe oradump]$ expdp eric/gao@tea attach=eric.SYS_EXPORT_FULL_02  
  2.   
  3. Export: Release 12.1.0.2.0 - Production on Fri Jan 23 22:24:04 2015  
  4.   
  5. Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.  
  6.   
  7. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production  
  8. With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options  
  9.   
  10. Job: SYS_EXPORT_FULL_02  
  11.   Owner: ERIC                             
  12.   Operation: EXPORT                           
  13.   Creator Privs: TRUE                             
  14.   GUID: 0D537C91F12C103FE0537EE0A8C01C87  
  15.   Start Time: Friday, 23 January, 2015 22:24:16  
  16.   Mode: FULL                             
  17.   Instance: cup  
  18.   Max Parallelism: 1  
  19.   Timezone: -07:00  
  20.   Timezone version: 18  
  21.   Endianness: LITTLE  
  22.   NLS character set: ZHS16GBK  
  23.   NLS NCHAR character set: AL16UTF16  
  24.   EXPORT Job Parameters:  
  25.   Parameter Name      Parameter Value:  
  26.      CLIENT_COMMAND        eric/********@tea directory=dump_dir dumpfile=fullbak.dmp logfile=fullbak.log full=y   
  27.   State: IDLING                       -----在这里我们看到job是处于暂停状态的    
  28.   Bytes Processed: 0  
  29.   Current Parallelism: 1  
  30.   Job Error Count: 0  
  31.   Dump File: /oradump/fullbak.dmp  
  32.     bytes written: 4,096  
  33.     
  34. Worker 1 Status:  
  35.   Instance ID: 1  
  36.   Instance name: cup  
  37.   Host name: cafe  
  38.   Process Name: DW00  
  39.   State: UNDEFINED      

 

启动暂停的作业: 

 

[js] view plaincopy
 
  1. Export> start_job  
再次查看一下作业的状态有没有发生变化: 

 

 

[js] view plaincopy
 
  1. Export> status  
  2. Job: SYS_EXPORT_FULL_02  
  3.   Operation: EXPORT                           
  4.   Mode: FULL                             
  5.   State: EXECUTING                        
  6.   Bytes Processed: 0  
  7.   Current Parallelism: 1  
  8.   Job Error Count: 0  
  9.   Dump File: /oradump/fullbak.dmp  
  10.     bytes written: 69,632  
  11.     
  12. Worker 1 Status:  
  13.   Instance ID: 1  
  14.   Instance name: cup  
  15.   Host name: cafe  
  16.   Process Name: DW00  
  17.   State: EXECUTING         -----作业继续执行了                    
  18.   Object Schema: SYS  
  19.   Object Name: KU$_USER_MAPPING_VIEW  
  20.   Object Type: DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE  
  21.   Completed Objects: 1  
  22.   Worker Parallelism: 1  

 

终止数据泵作业,在作业执行中途遇到问题不得不停止的时候,可以用kill_job命令终止操作:

 

[js] view plaincopy
 
  1. Export> kill_job  
  2. Are you sure you wish to stop this job ([yes]/no): yes  

 

终止之后系统中不会有实际的导出文件生成: 

[oracle@cafe oradump]$ ls -lt

总用量 4       -rw-r--r-- 1 oracle oinstall 1398 1月  23 22:31 fullbak.log

查看数据泵输出的日志,我们看一下终止操作在日志中的信息: 

 

[js] view plaincopy
 
  1. Job "ERIC"."SYS_EXPORT_FULL_02" stopped due to fatal error at Fri Jan 23 22:31:01 2015 elapsed 0 00:06:48  

 

我们删除数据库tea中的表,然后在数据库全备的文件中恢复该表,以验证导出的效果:

 

[js] view plaincopy
 
  1. SQL> drop table test;  
  2. Table dropped.  
  3.   
  4.   
  5. SQL> select * from test;  
  6. select * from test  
  7.               *  
  8. ERROR at line 1:  
  9. ORA-00942: table or view does not exist          -----该表已不存在。  

 

然后从全备份中单独导入test表,在这里我们用全备的备份集,使用table参数保证单独导入该表,保证减小系统开销:

 

[js] view plaincopy
 
  1. [oracle@cafe oradump]$ impdp eric/gao@tea directory=dump_dir dumpfile=fullbak.dmp logfile=imptab.log tables=test   
  2.   
  3. Import: Release 12.1.0.2.0 - Production on Fri Jan 23 23:20:31 2015  
  4.   
  5. Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.  
  6.   
  7. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production  
  8. With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options  
  9. Master table "ERIC"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded  
  10. Starting "ERIC"."SYS_IMPORT_TABLE_01":  eric/********@tea directory=dump_dir dumpfile=fullbak.dmp logfile=imptab.log tables=test   
  11. Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE  
  12. Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA  
  13. . . imported "ERIC"."TEST"      5.046 KB       1 rows  -----已导入1行数据,5K的数据量。  
  14. Processing object type DATABASE_EXPORT/SCHEMA/TABLE/STATISTICS/TABLE_STATISTICS  
  15. Processing object type DATABASE_EXPORT/STATISTICS/MARKER  
  16. Job "ERIC"."SYS_IMPORT_TABLE_01" successfully completed at Fri Jan 23 23:21:37 2015 elapsed 0 00:00:59  

 

验证表test已经恢复到了删除之前的状态:

 

[js] view plaincopy
 
  1. [oracle@cafe oradump]$ sqlplus eric/gao@tea  
  2. SQL*Plus: Release 12.1.0.2.0 Production on Fri Jan 23 23:26:53 2015  
  3. Copyright (c) 1982, 2014, Oracle.  All rights reserved.  
  4. Last Successful login time: Fri Jan 23 2015 23:23:49 +08:00  
  5. Connected to:  
  6. Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production  
  7. With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options  
  8. SQL> select * from test;  

 

OK,数据已回来。在实际项目中,可能数据量、环境和客户要求都比此次试验规模庞大、情况复杂,但是万变不离其宗,切记一定实现规划好备份空间,密切的关注备份状态。

 
转:http://www.csdn.net/article/2015-02-02/2823788

玩转Oracle之12c 可插拔数据库数据泵功能体验