ITPub博客

多租户:防止意外创建可插拔数据库(PDB)- Lone-PDB

原创 Oracle 作者:jelephant 时间:2016-12-09 23:10:16 0 删除 编辑

       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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-12-07

  • 博文量
    136
  • 访问量
    610202