18C新特性之PDB snapshot Carousel,夠用嗎?

沃趣科技發表於2018-10-12

| 關於PDB快照Carousel

Oracle18c新特新 pdb snapshot Carousel提供了在pdb級別下手工或者自動生成快照的功能,為開發測試用例提供了便捷。CDB為local undo和歸檔模式下,指定MAX_PDB_SNAPSHOTS控制pdb最多生成快照的數量,當快照超過最大數量時,會覆蓋最舊的快照,我們可以通過快照生成我們想測試使用的相應pdb,下面將帶你領略下新特性的優勢與劣勢。

如下圖:pdb1_prod為生產PDB,然後建立refresh PDB pdb1_test_master,讓refreshPDB pdb1_test_master每天生成快照。當你需要測試用例時,那麼你可以指定snapshot建立PDB。

一個通用的策略是每天在同一時間生成PDB快照。另一種策略是在資料載入之前手動抓取快照。在這兩種情況下,都可以從snapshot Carousel中使用任何可用的快照恢復PDB。


1. PDB快照Carousel是如何工作的

資料庫按需或自動建立carousel中的連續副本。當達到快照限制時,資料庫將覆蓋舊的快照。PDB快照的檔案存放在檔案系統上的物理檔案。其不包含資料庫歸檔檔案archive log。預設存放在PDB的資料檔案相同的目錄中。系統自動生成的snapshot以snap_開始,唯一標示結尾的命名規則,包含了快照當前的SCN,並且副檔名為.PDB。


相關檢視:MAX_PDB_SNAPSHOTS、DBA_PDB_SNAPSHOTS、DBA_PDBS


|  設定PDB快照的最大數量

使用MAX_PDB_SNAPSHOTS引數設定PDB快照最大快照數,首先登入到需要設定的PDB中,通過檢視CDB_PROPERTIES查詢當前MAX_PDB_SNAPSHOT值,可以使用alter pluggabledatabase/alter database更改MAX_PDB_SNAPSHOTS值。

如下為設定PDB snapshot的例子

SET LINESIZE 1500
COL CON_ID FORMAT 99999
COL PROPERTY_NAME FORMAT a17
COL PDB_NAME FORMAT a9
COL VALUE FORMAT a12
COL DESCRIPTION FORMAT a90
SELECT r.CON_ID, p.PDB_NAME, PROPERTY_NAME,PROPERTY_VALUE AS value, DESCRIPTION 
FROM CDB_PROPERTIES r,CDB_PDBS p 
WHERE  r.CON_ID = p.CON_ID AND PROPERTY_NAME LIKE 'MAX_PDB%' 
ORDER BY PROPERTY_NAME;
CON_ID PDB_NAME  PROPERTY_NAME       VALUE    DESCRIPTION
----- --------- ----------------- --------- ---------------------------------------------------------------
 3  ORCLPDB     MAX_PDB_SNAPSHOTS    7      maximum number of snapshots for a given PDB
 3  ORCLPDB     MAX_PDB_STORAGE      UNLIMITED  Maximum Space Usage of Datafiles and Local Tempfiles in Container


下面語句將當前pdb的快照數設定為7

進入PDB
YAO.CHONG> alter session set container = ORCLPDB;
Session altered.
Elapsed: 00:00:00.01
YAO.CHONG> ALTER PLUGGABLE DATABASE SET MAX_PDB_SNAPSHOTS=7;
Pluggable database altered.


想要刪除所有的快照,我們只需要執行下面一條命令即可。

ALTER PLUGGABLE DATABASE SET MAX_PDB_SNAPSHOTS=0;
SET LINESIZE 150
COL CON_NAME FORMAT a10
COL SNAPSHOT_NAME FORMAT a25
COL SNAP_SCN FORMAT 9999999
COL FULL_SNAPSHOT_PATH FORMAT a45
SELECT CON_ID,CON_NAME,SNAPSHOT_NAME,SNAPSHOT_SCN AS snap_scn, FULL_SNAPSHOT_PATH 
FROM  DBA_PDB_SNAPSHOTS
ORDER BY SNAP_SCN;
##都沒了


| 配置自動生成PDB快照

預設情況下都是手動生成快照,使用SNAPSHOT MODE EVERY子句自動產生PDB快照。

SELECT SNAPSHOT_MODE "S_MODE", SNAPSHOT_INTERVAL/60 "SNAP_INT_HRS" FROM DBA_PDBS;
S_MODE SNAP_INT_HRS
------ ------------
MANUAL


更改自動建立模式為每24小時自動生成PDB快照

進入PDB裡面去執行
YAO.CHONG > alter session set container = ORCLPDB;
Session altered.
Elapsed: 00:00:00.01
YAO.CHONG> ALTER PLUGGABLE DATABASE SNAPSHOT MODE EVERY 24 HOURS;
Pluggable database altered.
Elapsed: 00:00:00.17
#確認自動生成快照的時間間隔
SELECT SNAPSHOT_MODE "S_MODE", SNAPSHOT_INTERVAL/60 "SNAP_INT_HRS" FROM DBA_PDBS;
S_MODE SNAP_INT_HRS
------ ------------
AUTO             24


下面是每2小時生成快照的例子

首先登入到CDB根目錄。以下語句從名為cdb1_pdb1的現有PDB建立cdb1_pdb3,並將其配置為每2小時自動獲取快照:

CREATE PLUGGABLE DATABASE cdb1_pdb3 FROM cdb1_pdb1
FILE_NAME_CONVERT=('cdb1_pdb1','cdb1_pdb3')
SNAPSHOT MODE EVERY 120 MINUTES;


| 手工建立PDB快照

使用ALTER PLUGGABLE DATABASE/CREATE PLUGGABLE DATABASE手動生成快照。使用ALTER PLUGGABLE DATABASE SNAPSHOT語句需要滿足的要求。

  • CDB必須是LOCAL UNDO模式

  • 使用者必須有許可權建立和刪除PDB

YAO.CHONG> ALTER PLUGGABLE DATABASE SNAPSHOT test_snapshot; 
Pluggable database altered.
Elapsed: 00:03:15.66/快照大小481M,3分鐘,


下面查詢出當前PDB的快照

SET LINESIZE 150
COL CON_NAME FORMAT a10
COL SNAPSHOT_NAME FORMAT a30
COL SNAP_SCN FORMAT 9999999
COL FULL_SNAPSHOT_PATH FORMAT a70
SELECT CON_ID, CON_NAME, SNAPSHOT_NAME,SNAPSHOT_SCN AS snap_scn, FULL_SNAPSHOT_PATH 
FROM DBA_PDB_SNAPSHOTS
ORDER BY SNAP_SCN;
CON_ID CON_NAME   SNAPSHOT_NAME        SNAP_SCN FULL_SNAPSHOT_PATH
------- ---------- -------------------- -------- ---------------------------------------------
  3 CDB1_PDB1  CDB1_PDB1_B4WEDLOAD   2962078 /disk1/oracle/dbs/snap_3489077498_2962078.pdb
  3 CDB1_PDB1  CDB1_PDB1_AFWEDLOAD   2962938 /disk1/oracle/dbs/snap_3489077498_2962938.pdb


如果你不指定快照名,系統自動生成唯一名稱的快照,下面即為不指定名字建立快照

ALTER PLUGGABLE DATABASE SNAPSHOT;
SET LINESIZE 150
COL CON_NAME FORMAT a10
COL SNAPSHOT_NAME FORMAT a25
COL SNAP_SCN FORMAT 9999999
COL FULL_SNAPSHOT_PATH FORMAT a45
SELECT CON_ID, CON_NAME, SNAPSHOT_NAME,SNAPSHOT_SCN AS snap_scn, FULL_SNAPSHOT_PATH 
FROM DBA_PDB_SNAPSHOTS
ORDER BY SNAP_SCN;
CON_ID CON_NAME   SNAPSHOT_NAME        SNAP_SCN FULL_SNAPSHOT_PATH
---------- ---------- ------------------------- -------- ----------------------------------------------------
 3 ORCLPDB    SNAP_3034367141_987737800  2995234 /home/oradata/ORCL/orclpdb/snap_3034367141_2995234.pdb


| 刪除PDB快照

將MAX_PDB_SNAPSHOTS設定為0,即刪除所有PDB快照,同時也關閉此功能。同樣也可以使用ALTER PLUGGABLE DATABASE刪除當前的快照。

SET LINESIZE 150
COL CON_NAME FORMAT a10
COL SNAPSHOT_NAME FORMAT a25
COL SNAP_SCN FORMAT 9999999
COL FULL_SNAPSHOT_PATH FORMAT a45
SELECT CON_ID,CON_NAME,SNAPSHOT_NAME,SNAPSHOT_SCN AS snap_scn, FULL_SNAPSHOT_PATH 
FROM  DBA_PDB_SNAPSHOTS
ORDER BY SNAP_SCN;
CON_ID CON_NAME   SNAPSHOT_NAME        SNAP_SCN FULL_SNAPSHOT_PATH
---------- ---------- ------------------------- -------- -----------------------------------------------------
 3 ORCLPDB    CDB_CNDBA_20180813151200   2970060 /home/oradata/ORCL/orclpdb/snap_3034367141_2970060.pdb
 3 ORCLPDB    SNAP_3034367141_987737800  2995234 /home/oradata/ORCL/orclpdb/snap_3034367141_2995234.pdb
ALTER PLUGGABLE DATABASE DROP SNAPSHOT CDB_CNDBA_20180813151200;
再次查詢PDB快照已經被刪除
CON_ID CON_NAME   SNAPSHOT_NAME        SNAP_SCN FULL_SNAPSHOT_PATH
---------- ---------- ------------------------- -------- ---------------------------------------------------
 3 ORCLPDB    SNAP_3034367141_987737800  2995234 /home/oradata/ORCL/orclpdb/snap_3034367141_2995234.pdb


| 從snapshot建立PDB

alter system set db_create_file_dest ='/home/oradata/ORCL/orclpdb';
conn / as sysdba
YAO.CHONG> create pluggable database pdb_snap_test from orclpdb using snapshot test_snapshot;
Pluggable database created.
Elapsed: 00:00:39.13
YAO.CHONG> show pdbs;
CON_ID CON_NAME              OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED              READ ONLY  NO
 3 ORCLPDB            READ WRITE NO
 4 PDB_SNAP_TEST          MOUNTED
YAO.CHONG> alter pluggable database PDB_SNAP_TEST open;
Pluggable database altered.
Elapsed: 00:00:09.28
YAO.CHONG> alter pluggable database PDB_SNAP_TEST close;
Pluggable database altered.
Elapsed: 00:00:01.11
YAO.CHONG> drop pluggable database PDB_SNAP_TEST including datafiles;
Pluggable database dropped.
Elapsed: 00:00:00.67


| 基於SCN或時間點生產快照庫

在閱讀官方文件時,看到生成PDB可以基於SCN,我心中不禁暗喜,當再仔細查閱一番則不然,簡直萬念俱寂、黯然銷魂。提供的基於SCN生成的快照庫只能是基於當前生成快照時間點的SCN,似乎有些雞肋。

create pluggable database pdb_snap_test from orclpdb using snapshot at SCN 3620951;

與recover database until scn指定scn方式開啟資料庫不同,pdb snapshot Carousel指定scn生成的PDB只能是建立snapshot時的固定scn,並且生成快照與snapshot生成pdb的過程中佔據了大量的物理空間與IO資源。

那麼問題來了,說了這麼多關於PDB snapshot Carousel的優勢與好處,是否就說明已經找到了最佳的解決方案呢?

Hold on.

凡事有利也有弊,同樣PDB snapshot Carousel也不能倖免。

快照數量受限

雖然能夠做到Carousel輪轉,但畢竟數量有限,較為死板。在使用者的實際測試環境中條件複雜多變,會限制測試環境的搭建.

佔據大量物理空間與IO資源

對於當前使用者動輒幾十T的資料量,在生成snapshot與snapshot建立pdb的過程中,消耗的時間和佔據的物理資源是巨大的。

拘泥固定時間點

對於PDBsnapshot Carouse而言,只能基於固定時間,即快照點建立,無法根據測試需要靈活指定時間點。面對不斷變化的測試需求,如此死板的模式明顯是不可能滿足要求的。

版本受限

最後是客觀條件的限制,利用新特性需要滿足是在18C的環境下且啟用了PDB功能,但目前很多使用者依然是10G\11G\12C的環境,因此也僅僅只能遠觀而無法上手,對於實際工作很難產生推動作用。

說到這,是否還有更好的解決辦法呢?

答案是必須有!

沃趣科技QBackup資料庫備份容災雲平臺 ,可基於指定的的任意時間點建立開發測試環境,精確到秒級。是一款集合了CDP備份,歷史資料秒極恢復,災備保護等功能的一體化雲平臺。

支援主流的Oracle、MySQL資料庫,可同時對大量資料庫做集中式備份和管理,並對備份進行持續校驗以確保資料的可恢復性。此外,QBackup還可用於應用測試、預釋出、效能優化、POC等諸多應用場景。


|  作者簡介

姚崇·沃趣科技高階資料庫技術專家

熟悉Oracle資料庫內部機制,豐富的資料庫及RAC叢集層故障診斷、效能調優、OWI、資料庫備份恢復及遷移經驗。

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

相關文章