多租戶:防止意外建立可插拔資料庫(PDB)- Lone-PDB

jelephant發表於2016-12-09

       Oracle 12c之前的資料庫都是非CDB,從Oracle 12.1.0.2開始,不推薦使用非CDB體系結構,而是使用多租戶架構。在多租戶架構中,使用單個可插拔資料庫(PDB)(也稱為單租戶或lone-PDB),可以不必支付多租戶選項相關費用。 在標準版中,你不能無意中建立其他PDB;但在企業版中,你可能需要購買一些額外的許可證。 本文給出了一個例子,說明如何避免在Lone-PDB例項中建立多個使用者定義的PDB。

 1.意外建立PDB  
 2.MAX_PDBS 引數(12.2 以上)  
 3.防止意外建立PDB  
 4.事故後清理 
  
意外建立PDB 
 
 在檢查當前例項時,我們可以看到已經存在使用者定義的PDB。

SELECT con_id, name FROM v$pdbs;

    CON_ID NAME
---------- --------------------------
         2 PDB$SEED
         3 PDB1

SQL>

企業版中沒有任何內容阻止您建立額外使用者定義的可插拔資料庫,即使您沒有多租戶選項。

CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdbadmin IDENTIFIED BY Password1 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/pdb2/');

ALTER PLUGGABLE DATABASE pdb2 OPEN;

SELECT con_id, name FROM v$pdbs;

    CON_ID NAME
---------- -------------------------
         2 PDB$SEED
         3 PDB1
         4 PDB2

SQL>

完成此操作後,資料庫將在DBA_FEATURE_USAGE_STATISTICS檢視中報告“detected usage”。 這需要一段時間才能看到,我們將強制一個示例來檢查它。

-- Force usage sample.
EXEC DBMS_FEATURE_USAGE_INTERNAL.exec_db_usage_sampling(SYSDATE);


COLUMN name  FORMAT A40
COLUMN detected_usages FORMAT 999999999999

SELECT name,
       detected_usages,
       aux_count,
       last_usage_date
FROM   dba_feature_usage_statistics
WHERE  name = 'Oracle Pluggable Databases'
ORDER BY name;

NAME			              DETECTED_USAGES  AUX_COUNT LAST_USAG
------------------------------------- --------------- ---------- ---------
Oracle Pluggable Databases			  16           2 04-OCT-16

SQL>

我在一個測試例項上這樣做,所以它已經檢測到功能的使用幾次。 這裡要注意的重要一點是AUX_COUNT列,它指示當前執行的使用者定義的PDB的數量。 使用多租戶架構會導致檢測到的使用情況,而不考慮PDB的數量,因此單獨這一點並不表示是否需要購買多租戶選項。 如果此功能的AUX_COUNT列大於1,您需要購買選項!

讓我們刪除剛剛建立的PDB。

ALTER PLUGGABLE DATABASE pdb2 CLOSE;
DROP PLUGGABLE DATABASE pdb2 INCLUDING DATAFILES;

現在功能使用會發生什麼?

-- Force usage sample.
EXEC DBMS_FEATURE_USAGE_INTERNAL.exec_db_usage_sampling(SYSDATE);


COLUMN name  FORMAT A40
COLUMN detected_usages FORMAT 999999999999

SELECT name,
       detected_usages,
       aux_count,
       last_usage_date
FROM   dba_feature_usage_statistics
WHERE  name = 'Oracle Pluggable Databases'
ORDER BY name;

NAME				      DETECTED_USAGES  AUX_COUNT LAST_USAG
------------------------------------- --------------- ---------- ---------
Oracle Pluggable Databases			   17          1 04-OCT-16

SQL>

請注意,AUX_COUNT列現在的值為“1”。

MAX_PDBS 引數 (12.2 以上)

Oracle 12c R2包括一個新初始化引數MAX_PDBS,它允許您設定使用者定義的PDB數量的上限。如果您使用的是12c R2以後,請使用此引數,而不是後面描述的觸發器方法。

SQL> ALTER SYSTEM SET max_pdbs=1;

System altered.

SQL> CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdb_adm IDENTIFIED BY Password1;
CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdb_adm IDENTIFIED BY Password1
*
ERROR at line 1:
ORA-65010: maximum number of pluggable databases created

SQL> 


防止意外建立PDB

12c R2之前,我們可以使用系統觸發器防止意外建立PDB。 對資料庫上的任何“CREATE”DDL觸發以下觸發器,其中ORA_DICT_OBJ_TYPE系統定義的事件屬性設定為“PLUGGABLE DATABASE”。 它檢查並檢視已有多少使用者定義的PDB。 如果使用者定義的PDB的數量超過允許的最大值(1),那麼我們引發一個錯誤。

CONN / AS SYSDBA

CREATE OR REPLACE TRIGGER max_1_pdb_trg
  BEFORE CREATE ON DATABASE
  WHEN (ora_dict_obj_type = 'PLUGGABLE DATABASE')
DECLARE
  l_max_pdbs PLS_INTEGER := 1;
  l_count    PLS_INTEGER;
BEGIN
  SELECT COUNT(*) 
  INTO   l_count
  FROM   v$pdbs 
  WHERE  con_id > 2;
    
  IF l_count >= l_max_pdbs THEN
    RAISE_APPLICATION_ERROR(-20001, 'More than 1 PDB requires the Multitenant option.' );
  END IF;
END;
/

在觸發器就位後,我們嘗試建立另一個可插拔資料庫。

CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdbadmin IDENTIFIED BY Password1
  FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/pdb2/');

CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdbadmin IDENTIFIED BY Password1
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: More than 1 PDB requires the Multitenant option.
ORA-06512: at line 12

SQL>

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px '.PingFang SC'; color: #454545} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #454545; min-height: 14.0px} p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #454545} span.s1 {font: 12.0px 'Helvetica Neue'} span.s2 {font: 12.0px '.PingFang SC'}

如預期的,阻止建立第二使用者定義的PDB 


 事幫後的清理 

 你需要做的是刪除額外的PDB 在這一點上,我不知道是否有其他機制來跟蹤在例項中建立的PDB的最大數量,所以我不知道在例項中是否有遺留的錯誤記錄。


 有知道更多的內容可以留言給我。:) 


 如果你在容器資料庫中意外建立了多個使用者定義的PDB,並且你對潛在的許可違規情有獨鍾,您可能需要執行以下操作。

  1.建立一個沒有PDB的新CDB例項。

 2.使用前面提到的觸發器保護新的CDB例項。

 3.從原始CDB拔出感興趣的PDB

 4.PDB插入新的乾淨CDB

 5.丟棄原始CDB例項。

 由於新的CDB從未有多於一個PDB,因此該例項不應該秘密跟蹤任何違反許可證的行為。

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

相關文章