【恩墨學院】從資料庫建立深入學習Oracle技術:那些年 mkplug 偷偷執行的Plugin操作

恩墨學院發表於2018-01-11


在很多Oracle文件中,可能大家都注意過Oracle用來進行測試的一個表空間,這個表空間中有一系列預置的使用者和資料,可以用於資料庫或BI的很多測試實驗。


這個表空間在使用模板建庫時是可以選擇的,在如下圖所示的這個介面中,可以選擇建庫時包含這個範例表空間(預設是未選擇的)。

 OCM 培訓課程


圖1 是否包含示例方案


在DBCA的的配置過程中,如果選擇了包含示例方案,則最後生成的 cloneDBCreation.sql 指令碼將會與標準模式有所改變,主要增加了如下語句(在11g、12c等新版本中基本沒有變化):


 OCM 培訓課程

看到這裡,再次引用了模板目錄中的檔案,透過 mkplug.sql 指令碼執行了 PlugIN 操作,如果我們看到Oracle 12c的Pluggable Database覺得有點陌生,那麼其實Plugin這個操作Oracle已經在默默的幫我們執行了好多年:


C:\>dir C:\oracle\10.2.0\assistants\dbca\templates\ex*


2005-09-07  13:02           983,040 example.dmp

2005-09-07  13:02        20,897,792 example01.dfb


透過mkplug.sql指令碼來載入這個範例表空間,來看一下這個指令碼的主要內容。

同樣,最重要的是透過dbms_backup_restore包從example01.dfb檔案中恢復資料檔案:


OCM 培訓課程

OCM 培訓課程


OCM 培訓課程



OCM 培訓課程

這個恢復完成之後,接下來最重要的部分就是透過傳輸表空間技術將example表空間匯入到當前的資料庫。


考慮一下這種情況,當進行跨資料庫遷移時,需要將一個使用者表空間中的資料遷移到另外一個資料庫,應該使用什麼樣的方法呢?


最常規的做法可能是透過EXP工具將資料全部匯出,然後在目標資料庫上IMP匯入,可是這種方法可能會比較緩慢。EXP工具同時還提供另外一種技術-可傳輸表空間技術,可以用於加快這個過程。


在exp –help的幫助中,可以看到這樣一個引數:


TRANSPORT_TABLESPACE 匯出可傳輸的表空間後設資料 (N)


透過這個選項,我們可以對一組自包含、只讀的表空間只匯出後設資料,然後在作業系統層將這些表空間的資料檔案複製至目標平臺,並將後設資料匯入資料字典(這個過程稱為插入,plugging),即完成遷移。


注意

傳輸表空間技術不能應用於SYSTEM表空間。

對於可傳輸表空間有一個重要概念:自包含(Self-Contained)

在表空間傳輸的中,要求表空間集為自包含的,自包含表示用於傳輸的內部表空間集沒有引用指向外部表空間集。自包含分為兩種:一般自包含表空間集和完全(嚴格)自包含表空間集。


常見的以下情況是違反自包含原則的:

§  索引在內部表空間集,而表在外部表空間集(相反地,如果表在內部表空間集,而索引在外部表空間集,則不違反自包含原則)。

§  分割槽表一部分割槽在內部表空間集,一部分在外部表空間集(對於分割槽表,要麼全部包含在內部表空間集中,要麼全不包含)。

§  如果在傳輸表空間時同時傳輸約束,則對於引用完整性約束,約束指向的表在外部表空間集,則違反自包含約束;如果不傳輸約束,則與約束指向無關。

§  表在內部表空間集,而lob列在外部表空間集,則違反自包含約束。


通常可以透過系統包DBMS_TTS來檢查表空間是否自包含,驗證可以以兩種方式執行:非嚴格方式和嚴格方式。


以下是一個簡單的驗證過程,假定在eygle表空間存在一個表eygle,其上存在索引儲存在USERS表空間:、


SQL> create table eygle as select rownum id ,username from dba_users;

SQL> create index ind_id on eygle(id) tablespace users;


以SYS使用者執行非嚴格自包含檢查(full_check=false):


OCM 培訓課程


執行嚴格自包含檢查(full_check=true):


OCM 培訓課程


反過來對於USERS表空間來說,非嚴格檢查也是無法透過的:


OCM 培訓課程


但是可以對多個表空間同時傳輸,則一些自包含問題就可以得到解決:


OCM 培訓課程


表空間自包含確認之後,進行表空間傳輸就很方便了,一般包含如下幾個步驟。

1.將表空間設定為只讀:

alter tablespace users read only;

2.匯出表空間。在作業系統提示符下執行:

exp username/passwd tablespaces=users transport_tablespace=y file=exp_users.dmp

此處的匯出檔案只包含後設資料,所以匯出檔案很小,匯出速度也會很快。

3.轉移。

將匯出的後設資料檔案(此處是exp_users.dmp)和傳輸表空間的資料檔案(此處是users表空間的資料檔案user01.dbf)轉移至目標主機(轉移過程如果使用FTP方式,應該注意使用二進位制方式)。

4.傳輸。

在目標資料庫將表空間插入到資料庫中,完成表空間傳輸。在作業系統命令提示符下執行下面的語句:

imp username/passwd tablespaces=users transport_tablespace=y file=exp_users.dmp datafiles='users01.dbf'

瞭解了Oracle的可傳輸表空間技術後,來看一下example表空間的插入,以下指令碼仍然來自mkplug.sql指令碼:


OCM 培訓課程


完成plugging之後,這個表空間就被包含在了新建的資料庫之中。


恩墨學院隸屬於雲和恩墨(北京)資訊科技有限公司,致力於提供專業高水準的與大資料培訓服務,挖掘培養大資料與資料庫人才。恩墨學院提供包括個人實戰技能培訓、個人認證培訓、企業內訓在內的全方位大資料和資料庫技術培訓。ACE級別超強師資,配備專業實驗室,沉浸式學習與訓練,專業實驗室、配備專業助教指導訓練。能迅速融入專家圈子,業內資源豐富,迅速積累職場人脈。課程包括:班、Oracle Oracle OCP考試等。



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

相關文章