来自 技术 2019-03-16 00:00 的文章

oracle 12c 多租户体系结构概念之数据字典、服务、

1.CDB中的数据字典体系结构

从用户和应用程序的角度来看,CDB中每个容器中的数据字典是独立的,就像在非CDB中一样。

Figure 18-3 Data Dictionary Architecture in a CDB

在CDB中,数据字典元数据只在root中保存,不存储在pdb中(non-CDB中是混合存储的)。而对象数据是保存在pdb中的。在pdb中如何访问root中的元数据和对象呢?依靠两个内部机制:metadata links 和object links;

如果要访问类似dba_objects性能视图,其元数据只保存在root中,此时就需要使用metadata links机制实现读取。另外,还有一些对象也只保存在root中,例如awr数据,DBA_HIST_ACTIVE_SESS_HISTORY、DBA_HIST_BASELINE等,如果要查询其数据则需要使用object link机制实现。Oracle数据库自动创建和管理metadata links 和object links,用户不能添加、修改或删除这些链接。

1) CDB中的容器数据对象

在CDB中,每个DBA_视图,都存在一个对应的CDB_视图。CDB_视图的owner就是对应的DBA_视图的owner。下图显示了dictionary视图的不同类别之间的关系。

Figure 18-4 Dictionary View Relationships in a CDB

2. CDB中的service

当您创建PDB时,数据库将自动在CDB中创建并启动服务。服务有一个属性,显示在DBA_SERVICES.PDB列中,该列将PDB标识为服务的初始当前容器。服务的名称与PDB相同。PDB名称必须是有效的服务名称,并且在CDB中必须是惟一的。例如,在图18-5中,名为hrpdb的PDB有一个名为hrpdb的默认服务。不能删除默认服务。

您可以为每个PDB创建额外的服务。每个附加服务都将其PDB表示为初始当前容器。在图18-5中,erppdb和hrpdb存在非默认服务。使用在非cdb中使用的相同技术创建、维护和删除其他服务。

SQL> SELECT NAME, PDB FROM V$SERVICES ORDER BY PDB, NAME;

NAME PDB

---------------- ------------------------------

SYS$BACKGROUND CDB$ROOT

SYS$USERS CDB$ROOT

db12c CDB$ROOT

db12cXDB CDB$ROOT

db12cbk CDB$ROOT

srvtest1 CDB$ROOT

pdb1 PDB1

srvpdb1 PDB1

pdb2 PDB2

pdb3 PDB3

srvpdb3 PDB3

11 rows selected.

SQL> SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS CUR_CONTAINER FROM DUAL;

CUR_CONTAINER

------------------------

CDB$ROOT

#切换容器方法

SQL> ALTER SESSION SET CONTAINER = hrpdb;

#RAC环境创建,修改,删除service

srvctl add service -db db12c -service pdb1 -pdb pdb1

srvctl modify service -db mycdb -service salesrep -pdb hrpdb

srvctl remove service -db mycdb -service salesrep

#单实例环境下创建与删除service,使用DBMS_SERVICE不能修改service

BEGIN

DBMS_SERVICE.CREATE_SERVICE(

service_name => 'salesrep',

network_name => 'salesrep.example.com');

END;

/

BEGIN

DBMS_SERVICE.DELETE_SERVICE(

service_name => 'salesrep');

END;

/

3. CDB中的用户:common user、local user

Common user:

Common user在root和各PDB中都有相同的ID,能连接(有create session权限)root和所有pdb执行操作。Common user要么由oracle提供(如sys ,system),要么由用户创建(用户名必须以C##、c##开头)。

Local User:

Local User不是共用的数据库用户,只能在单个PDB中操作。

Local User具有以下特点:

l Local User是特定于某个PDB的,可能在这个PDB中拥有一个schema。

l Local User可以管理PDB,包括打开和关闭它。具有SYSDBA权限的Common User可以将SYSDBA权限授予Local User。在这种情况下,权限用户仍然是本地的。

l 一个PDB中的Local User不能登录到另一个PDB或CDB$ROOT。

l Local User的名称不能以字符c##或c##开头。

l Local User的名称只能在其PDB中是唯一的。

4. CDB中的角色:common role、local role

用户创建的common role也必须以C##orc##开头;

每个oracle提供的角色都是通用的。在oracle提供的脚本中,授予oracle提供的用户和角色的每个权限或角色都是通用的,只有一个例外:系统权限在本地授予公共角色PUBLIC(参见“在CDB中授予PUBLIC”)。用户创建的角色要么是本地的,要么是通用的。

当符合以下条件时,用户只能对公共角色执行公共操作,例如,向该角色授予公共权限:

•用户是当前容器为root的Common User。

•用户通常拥有SET CONTAINER权限,这意味着该权限适用于所有容器。

•用户有权限控制执行指定操作的能力,该权限已被普遍授予(参见“CDB中普遍授予的角色和权限”)。

例如,要创建公共角色,Common User必须具有通常授予的create角色和SET容器权限。在CREATE ROLE语句中,CONTAINER=ALL子句指定角色是公共的。

5. CDB中的授予权限与角色

就像在非CDB中一样,CDB中的用户可以授予角色和权限。CDB中的一个关键区别是Local授予和Common授予的角色和权限之间的区别。Local授予的权限或角色只能在授予它的容器中执行。Common授予的权限或角色可以在每个现有的和未来的容器中执行。

用户和角色可以是Common的,也可以是Local的。然而,权限本身既不是Common的,也不是Local的。如果用户使用CONTAINER=CURRENT子句在Local授予权限,那么被授予者具有只能在当前容器中执行的权限。如果用户使用CONTAINER=ALL子句授予权限,那么被授予者拥有在任何现有和将来的容器中都可以执行的权限。

The basic principles of granting are as follows:

    Both common and local phenomena may grant and be granted locally.Only common phenomena may grant or be granted commonly.

    Table 18-5 Local Grants

    Phenomenon

    May Grant Locally

    May Be Granted Locally

    May Receive a Role or Privilege Granted Locally

    Common User

    Yes

    N/A

    Yes

    Local User

    Yes

    N/A

    Yes

    Common Role

    N/A

    YesFoot1

    Yes

    Local Role

    N/A

    YesFoot2

    Yes

    Privilege

    N/A

    Yes

    N/A

    Footnote 1

    Privileges in this role are available to the grantee only in the container in which the role was granted, regardless of whether the privileges were granted to the role locally or commonly.

    Footnote 2

    Privileges in this role are available to the grantee only in the container in which the role was granted and created.

    Table 18-6 Common Grants

    Phenomenon

    May Grant Commonly

    May Be Granted Commonly

    May Receive Roles and Privileges Granted Commonly

    Common User Account

    Yes

    N/A

    Yes

    Local User Account

    No

    N/A

    No

    Common Role

    N/A

    YesFoot3

    Yes

    Local Role

    N/A

    No

    No

    Privilege

    N/A

    Yes

    N/A

    Footnote3

    Privileges that were granted commonly to a common role are available to the grantee across all containers. In addition, any privilege granted locally to a common role is available to the grantee only in the container in which that privilege was granted to the common role.

    在CDB中,PUBLIC是一个common角色。在PDB中,Local授予PUBLIC的权限只允许所有Local和common user帐户在此PDB中使用这些权限。

    授予Oracle-supplied的用户和角色的每个权限和角色都是Common,但是授予PUBLIC的系统权限是Local授予的。存在此例外是因为您可能希望撤销Oracle数据库中默认包含的某些权限,例如SYS.UTL_FILE包的EXECUTE权限。

    Oracle建议用户不要将权限和角色Common的授予PUBLIC。

    6. CDB中的通用审计配置(Common Audit Configurations)

    对于混合模式和统一审计,Common Audit Configurations是可见的,并跨所有PDBs强制执行。

    审计配置要么是本地的,要么是通用的。适用于其他本地或常见现象(如用户和角色)的范围规则都适用于审计配置

    注意:审计初始化参数存在于CDB级别,而不是每个PDB中。

    PDB支持的审计选项:

    l Object auditing

    l Audit policies:Local audit policies、Common audit policies

    common audit configuration存储在root的sys用户下;local audit configuration存储在PDB的sys用户下;

    Audit trails存储在相关PDB的sys或者audsys用户下;PDB的OS和XML audit trails存储在初始化参数AUDIT_FILE_DEST指定的目录下;

    Figure 18-8 Architecture of a CDB