【12C】Oracle 12c 可插拔資料庫之資料泵功能體驗

leonarding發表於2015-02-16
                               《Oracle 12C 可插拔資料庫之資料泵功能體驗
此友有一顆熱愛之心,承新年伊始在Oracle道路上一直堅持耕耘,這是第二篇關於12C新特性文章,作者高強涉獵廣泛,從前臺到後臺全程掃雷,現擔任電信行業專案經理,主導運維工作,大家如有這方面問題可與他交流。

郵箱: 

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
在這裡你能得到技術、實事、熱點訊息等新興事物的思考和觀點,別的地方可能沒有的東西。我將為大家提供最新技術與資訊動態,傳遞正能量。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-1437098/,如需轉載,請註明出處,否則將追究法律責任。

相關文章