【12C】Oracle 12c 可插拔数据库之数据泵功能体验

                               《Oracle 12C 可插拔数据库之数据泵功能体验
此友有一颗热爱之心,承新年伊始在Oracle道路上一直坚持耕耘,这是第二篇关于12C新特性文章,作者高强涉猎广泛,从前台到后台全程扫雷,现担任电信行业项目经理,主导运维工作,大家如有这方面问题可与他交流。

邮箱: gaoqiangdba@163.com

QQ: 1253771276

#########################我是分隔符#############################
新年新群招募: 中国Oracle精英联盟 170513055
群介绍:本群是大家的一个技术分享社区,在这里可以领略大师级的技术讲座,还有机会参加Oracle举办的技术沙龙,与兴趣相投的小伙伴一起笑谈风云起,感悟职场情!
#########################我是分隔符#############################
前言:Oracle12c的datapump功能跟以前差不多,在多租户的环境中执行导入\导出以及使用一些更细化的参数的时候,几乎没有区别,依然很好用,效率很高。目前有很多的用户仍然在使用exp/imp工具在执行一些迁移、备份、过滤和转移数据的工作,相比起来,数据泵的效率更高、更易用并且更方便管理,但exp/imp在有些时候可以完成datapump不适用的情况。两者的操作风格和格式很相似,相信在您掌握了其中任一种工具之后,另一种会很容易上手。

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

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

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

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

[oracle@cafe ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 12.1.0.2.0 Production on Fri Jan 23 15:06:41 2015   

 

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

 

Connected to an idle instance.

 

SQL> startup            -----启动CDB

ORACLE instance started.

 

Total System Global Area  767557632 bytes

Fixed Size                  2929112 bytes

Variable Size             574623272 bytes

Database Buffers          184549376 bytes

Redo Buffers                5455872 bytes

Database mounted.

Database opened.

SQL> alter pluggable database tea open;           -----在CDB中启动可插拔数据库(PDBtea

 

Pluggable database altered.

 

SQL> alter session set container = tea;           -----切换到PDB中(tea)。

 

Session altered.

 

SQL> show con_name      

 

CON_NAME

------------------------------

TEA                                   -----经验证,已切换到tea数据库容器。

SQL> show parameter service;

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


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

[root@cafe /]# mkdir /oradump

[root@cafe /]# chmod -R 777 /oradump

[root@cafe /]# chown -R oracle.oinstall /oradump

SQL> create directory dump_dir as '/oradump';            -----在数据库中创建该目录的对象信息。

Directory created.

SQL> select directory_name,directory_path from dba_directories;

DIRECTORY_NAME      DIRECTORY_PATH

--------------      --------------

DUMP_DIR            /oradump

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

SQL> create table test(id number);

Table created.

SQL> insert into test values(1);

1 row created.

SQL> CREATE USER eric  IDENTIFIED BY gao ACCOUNT UNLOCK;  

User created.

SQL> grant dba to eric;

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    -----此行包含版本、导出操作开始的时间,该时间可用于计算导出总时间                      

                                                                            和记录操作时间点。

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

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的名字,可用于中途介入导入、导出过程中调整策略和查看状态。

Estimate in progress using BLOCKS method...

Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA

Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA

Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 4.265 MB                     -----估算本次导入、导出的总大小。

...省略多行...

Processing object type DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER

Processing object type DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER

Processing object type DATABASE_EXPORT/TABLESPACE                                 

. . exported "SYS"."KU$_USER_MAPPING_VIEW"               6.109 KB      38 rows

...省略多行...

. . exported "SYS"."NACL$_WALLET_EXP"                        0 KB       0 rows

. . exported "WMSYS"."WM$EXP_MAP"                        7.718 KB       3 rows

Master table "ERIC"."SYS_EXPORT_FULL_01" successfully loaded/unloaded

******************************************************************************

Dump file set for ERIC.SYS_EXPORT_FULL_01 is:

  /oradump/fullbak.dmp

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参数,否则可能会报错。

输出结果:

[oracle@cafe ~]$ expdp eric/gao@tea  estimate_only=y directory=dump_dir   logfile=n full=y

Export: Release 12.1.0.2.0 - Production on Fri Jan 23 22:08:30 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

Starting "ERIC"."SYS_EXPORT_FULL_01":  eric/********@tea estimate_only=y directory=dump_dir logfile=n full=y

Estimate in progress using BLOCKS method...

Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA

Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA

Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

.  estimated "SYS"."KU$_USER_MAPPING_VIEW"                  16 KB

.  estimated "ORDDATA"."ORDDCM_DOCS"                      1.25 MB

.  estimated "WMSYS"."WM$CONSTRAINTS_TABLE$"               320 KB

.  estimated "WMSYS"."WM$LOCKROWS_INFO$"                   192 KB

.  estimated "WMSYS"."WM$UDTRIG_INFO$"                     192 KB

.  estimated "LBACSYS"."OLS$AUDIT_ACTIONS"                  64 KB

.  estimated "LBACSYS"."OLS$DIP_EVENTS"                     64 KB

.  estimated "LBACSYS"."OLS$INSTALLATIONS"                  64 KB

.  estimated "LBACSYS"."OLS$PROPS"                          64 KB

...省略多行...

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

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

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

下面我们就来体验一下:

Export> status                    -----查看当前作业状态

Job: SYS_EXPORT_FULL_02           -----作业名,上面的全库导出我们也看到过有对应的名字

  Operation: EXPORT               -----操作类型:             

  Mode: FULL                      -----模式:全库导出  

  State: EXECUTING                -----状态:执行中           

  Bytes Processed: 0            

  Current Parallelism: 1          -----当前并行数,如果指定了parallel参数,便会影响该值,并且下面会对应的有worker1~workerN

  Job Error Count: 0

  Dump File: /oradump/fullbak.dmp

    bytes written: 4,096          -----已写入的字节

Worker 1 Status:

  Instance ID: 1

  Instance name: cup              -----实例名为cup,容器数据库CDB的名称

  Host name: cafe                 -----操作系统主机名

  Process Name: DW00              -----相关写进程,如果设置了parallel的话,会有更多DWNN。

  State: EXECUTING   

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

Export> continue_client

Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA

Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA

Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

Total estimation using BLOCKS method: 4.578 MB

Processing object type DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER

Processing object type DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER

Processing object type DATABASE_EXPORT/TABLESPACE

Processing object type DATABASE_EXPORT/PROFILE

暂停正在运行的导入/导出操作,该操作不会导致作业停止,只是暂时停止,类似于断点续传:

Export> stop_job

Are you sure you wish to stop this job ([yes]/no): yes

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

[oracle@cafe oradump]$ expdp eric/gao@tea attach=eric.SYS_EXPORT_FULL_02

Export: Release 12.1.0.2.0 - Production on Fri Jan 23 22:24:04 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

Job: SYS_EXPORT_FULL_02

  Owner: ERIC                          

  Operation: EXPORT                        

  Creator Privs: TRUE                          

  GUID: 0D537C91F12C103FE0537EE0A8C01C87

  Start Time: Friday, 23 January, 2015 22:24:16

  Mode: FULL                           

  Instance: cup

  Max Parallelism: 1

  Timezone: -07:00

  Timezone version: 18

  Endianness: LITTLE

  NLS character set: ZHS16GBK

  NLS NCHAR character set: AL16UTF16

  EXPORT Job Parameters:

  Parameter Name      Parameter Value:

     CLIENT_COMMAND        eric/********@tea directory=dump_dir dumpfile=fullbak.dmp logfile=fullbak.log full=y

  State: IDLING                       -----在这里我们看到job是处于暂停状态的 

  Bytes Processed: 0

  Current Parallelism: 1

  Job Error Count: 0

  Dump File: /oradump/fullbak.dmp

    bytes written: 4,096

Worker 1 Status:

  Instance ID: 1

  Instance name: cup

  Host name: cafe

  Process Name: DW00

  State: UNDEFINED   

启动暂停的作业:

Export> start_job

再次查看一下作业的状态有没有发生变化:

Export> status

Job: SYS_EXPORT_FULL_02

  Operation: EXPORT                        

  Mode: FULL                          

  State: EXECUTING                     

  Bytes Processed: 0

  Current Parallelism: 1

  Job Error Count: 0

  Dump File: /oradump/fullbak.dmp

    bytes written: 69,632

 

Worker 1 Status:

  Instance ID: 1

  Instance name: cup

  Host name: cafe

  Process Name: DW00

  State: EXECUTING         -----作业继续执行了                 

  Object Schema: SYS

  Object Name: KU$_USER_MAPPING_VIEW

  Object Type: DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE

  Completed Objects: 1

  Worker Parallelism: 1

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

Export> kill_job

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

 

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

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中的表,然后在数据库全备的文件中恢复该表,以验证导出的效果:

SQL> drop table test;

Table dropped.

SQL> select * from test;

select * from test

              *

ERROR at line 1:

ORA-00942: table or view does not exist          -----该表已不存在。

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

 

[oracle@cafe oradump]$ impdp eric/gao@tea directory=dump_dir dumpfile=fullbak.dmp logfile=imptab.log tables=test

 

Import: Release 12.1.0.2.0 - Production on Fri Jan 23 23:20:31 2015

 

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

 

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

Master table "ERIC"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded

Starting "ERIC"."SYS_IMPORT_TABLE_01":  eric/********@tea directory=dump_dir dumpfile=fullbak.dmp logfile=imptab.log tables=test

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA

. . imported "ERIC"."TEST"                               5.046 KB       1 rows  -----已导入1行数据,5K的数据量。

Processing object type DATABASE_EXPORT/SCHEMA/TABLE/STATISTICS/TABLE_STATISTICS

Processing object type DATABASE_EXPORT/STATISTICS/MARKER

Job "ERIC"."SYS_IMPORT_TABLE_01" successfully completed at Fri Jan 23 23:21:37 2015 elapsed 0 00:00:59

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

[oracle@cafe oradump]$ sqlplus eric/gao@tea

 

SQL*Plus: Release 12.1.0.2.0 Production on Fri Jan 23 23:26:53 2015

 

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

 

Last Successful login time: Fri Jan 23 2015 23:23:49 +08:00

 

Connected to:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

 

SQL> select * from test;

 

        ID

----------

         1

OK,数据已回来。

 

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

 

  数据泵的功能和适用情景还有很多,比如咱们开始提到的过滤数据和对象,还有在全数据库级、方案级、表级和表空间级实现导入导出等功能,由于篇幅有限,无法一一列举,希望有机会做更深入的分享和交流。
##########################################################################################
如果喜欢我的文章就请扫下面二维码吧!关注微信号:leonarding_public
在这里你能得到技术、实事、热点消息等新兴事物的思考和观点,别的地方可能没有的东西。我将为大家提供最新技术与资讯动态,传递正能量。



请使用浏览器的分享功能分享到微信等