前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多租户:防止意外创建可插拔数据库(PDB)- Lone-PDB

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

作者头像
Yunjie Ge
发布2022-04-24 09:05:40
5590
发布2022-04-24 09:05:40
举报
文章被收录于专栏:数据库与编程

Oracle 12c之前的数据库都是非CDB,从Oracle 12.1.0.2开始,不推荐使用非CDB体系结构,而是使用多租户架构。在多租户架构中,使用单个可插拔数据库(PDB)(也称为单租户或lone-PDB),可以不必支付多租户选项相关费用。 在标准版中,你不能无意中创建其他PDB;但在企业版中,你可能需要购买一些额外的许可证。 本文给出了一个例子,说明如何避免在Lone-PDB实例中创建多个用户定义的PDB。

  • 意外创建PDB
  • MAX_PDBS 参数(12.2 以上)
  • 防止意外创建PDB
  • 事故后清理

意外创建PDB

在检查当前实例时,我们可以看到已经存在用户定义的PDB。

代码语言:javascript
复制
SELECT con_id, name FROM v$pdbs;

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

SQL>

企业版中没有任何内容阻止您创建额外用户定义的可插拔数据库,即使您没有多租户选项。

代码语言:javascript
复制
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”。 这需要一段时间才能看到,我们将强制一个示例来检查它。

代码语言:javascript
复制
-- 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。

代码语言:javascript
复制
ALTER PLUGGABLE DATABASE pdb2 CLOSE;
DROP PLUGGABLE DATABASE pdb2 INCLUDING DATAFILES;

现在功能使用会发生什么?

代码语言:javascript
复制
-- 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以后,请使用此参数,而不是后面描述的触发器方法。

代码语言:javascript
复制
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),那么我们引发一个错误。

代码语言:javascript
复制
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;
/

在触发器就位后,我们尝试创建另一个可插拔数据库。

代码语言:javascript
复制
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>

如预期的,阻止创建第二用户定义的PDB。

事故后的清理

你需要做的是删除额外的PDB。 在这一点上,我不知道是否有其他机制来跟踪在实例中创建的PDB的最大数量,所以我不知道在实例中是否有遗留的错误记录。

有知道更多的内容可以留言给我。:)

如果你在容器数据库中意外创建了多个用户定义的PDB,并且你对潜在的许可违规情有独钟,您可能需要执行以下操作。

  • 创建一个没有PDB的新CDB实例。
  • 使用前面提到的触发器保护新的CDB实例。
  • 从原始CDB拔出感兴趣的PDB。
  • 将PDB插入新的干净CDB。
  • 丢弃原始CDB实例。

由于新的CDB从未有多于一个PDB,因此该实例不应该秘密跟踪任何违反许可证的行为。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山东Oracle用户组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档