知识拓展Oracle 12c多租户容器数据库简介

Posted 非功能之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识拓展Oracle 12c多租户容器数据库简介相关的知识,希望对你有一定的参考价值。

Orac1e Multitenant是在Oracle database12c中引入的新功能。这个功能可以在多租客容器数据库中,创建并维护许多可插拔数据库。Oracle使用两层数据库管理机制CDBPDB将数据库的整体运维和应用运维剥离,以实现它减少运维资本支出,使得应用更加关注应用的策略目的。多租户、数据隔离使得12c在商用数据库中有了更多发展的可能,随本文一起了解一下12c的多租户容器数据库吧。


一、多租户容器数据库的概念

Orac1e Multitenant是在Oracledatabase12c中引入的新功能。这个功能可以在多租客容器数据库中,创建并维护许多可插拔数据库。


首先简单介绍可插拔环境的术语:

多租户容器数据库(CDB):是指能够容纳一个或多个可插拔数据库的数据库。

容器:是指CDB中的数据文件和元数据的集合。

可插拔数据库(PDB):是指可以通过克隆另一个数据库轻松创建的数据容器。

如果有必要,也可以将可插拔数据库从一个CDB传送到另一个CBD。所有含有一组主数据文件和元数据的CDB都是根容器。每个CDB也会含有种子容器,它是用于创建其他可插拔数据库的模版。每个CDB都由一个根容器、一个种子容器和0个、l个或多个可插拔数据库构成。


关于Orac1e Multitenant的主要概念和示意图如下:

【知识拓展】Oracle 12c多租户容器数据库简介



关于上图解释如下:

1、种子容器(PDB$SEED)只是用于创建可插拔数据库的模版。你可以连接种子容器,但是该可插拔数据库是只读的,这意味着你不能使用它执行任何事务。

2、除了两个默认的容器(根和种子)外,上图所示的CDB还有两个可插拔数据库,它们分别为SALESPDB和HRPDB。

可插拔数据库需要使用独立的命名空间。在CDB中每个可插拔数据库必须都拥有唯一的名称,但是在可插拔数据库的内部可使用非CDB数据库的命名空间规则。例如,在某个可插拔数据库中(并不是CDB),表空间和用户必须拥有唯一的名称。

3、每个可插拔数据库都拥有本身的SYSTEM和SYSAUX表空间以及临时表空间。

4、如果可插拔数据库没有自带Temp文件,可以使用根容器的Temp文件。

5、每个可插拔数据库的SYSTEM表空间中都含有其本身的元数据,如用户和对象;通过可插拔数据库的DBA/ALL/USER级视图和根容器的CDB级视图,可以访问这些元数据。在CDB中定义的字符集也可以应用于它含有的所有PDB。

6、可以为CDB及其所有PDB设置时区时间,也可以单独为每个PDB设置时区时间。

7、上图展示了一个非RAC配置,因此仅有一套内存分配方案和一组后台进程。换言之,仅使用了一个实例。这个CDB中的所有可插拔数据库都使用同一个实例和同一组后台进程。

8、在使用RAC配置时,单个RAC示例中的所有连接共用该示例和其中的后台进程。

9、使用sys用户连接根容器后,可以启动和停止CDB实例。在连接可插拔数据库时,无法启动和停止CDB实例。

10、在启动时实例会读取初始化参数文件。使用特权用户连接根容器可以修改所有初始化参数。相对而言,使用特权用户连接可插拔数据库后,只能修改当前连接的可插拔数据库的参数。当你连接可插拔数据库并修改初始化参数时,这些修改操作仅会应用于你当前连接的可插拔数据库,并且会被保存下来。v$parameter视图的ISPDBMODIFIABLE列,含有当特权用户连接可插拔数据库时可以修改的数。

11、应用程序用户只能通过网络访问可插拔数据库。因此,必须使用监听器监听可插拔数据库的相应服务名称。如果监听器没有运行,应用用户就无法连接可插拔数据库。

12、单个可插拔数据库不能单独停止和启动(这不是指数据库实例)。在启动和停止可插拔数据库时,无法为其分配内存和启动/停止后台进程。更确切地说,可插拔数据库仅有打开和关闭两种状态。

13、CDB有一组控制文件。当特权用户连接根容器时,可以管理这些控制文件。

14、CDB有一个UNDO表空间。CDB中的所有可插拔数据库都使用同一个UNDO表空间(在使用RAC时,每个实例都有一个活动的撤销表空间)。

15、当特权用户连接根容器时,可以管理重做线程(每个实例的)。只有使用特权用户连接根容器,才能启用归档口志模式和切换联机重做日志。使用拥有SYSDBA权限的用户连接可插拔数据库,无法切换联机重做日志和归档日志模式。

16、CDB有一个警告日志文件和一组跟踪文件。所有相关的可插拔数据库的信息都会写入同一个CDB警告日志中。

每个容器都拥有唯一的容器ID。根容器的ID为1,种子容器的ID为2。后续创建的所有可插拔数据库都会被分配唯一的容器ID。

17、使用特权用户连接根容器后,可以启用和禁用闪回数据库功能。无法启用可插拔数据库级的闪回功能。

18、AWR、ADDM和ASH报告可以反映CDB中所有PDB的情况。显示每个可插拔数据库的资源使用情况。

19、在解决SQL性能问题时,通过v$SQL和v$SQLAREA等视图的con_ID列,可以查看指定可插拔数据库的信息。

 

总结CDB进行实例级统一管理的内容如下:

1、UNDO日志(UNDO表空间)、ALERT日志、归档日志等日志系统。

2、系统监听进程、并行进程、SMON、PMON、LGWR、DBWR等关键oracle进程。

3、系统监听、控制文件及RAC相关。

 

二、多租户数据库的资源管理

Oracle 12c的资源管理也通过CDB、PDB两层控制进行实现。

1、CDB层的参数设置

CDB层的参数设置与原oracle11g规范差距较小。主要的内存参数如下:

a)  SGA,共享内存全局区:数据库一启动就ORACLE就申请占用,可以通过ipcs –a查看其大小。查看SGA_MAX_SIZE参数可以得到其设置值。在数据库实例刚启动时,db_cache_size如果设置较大不会立即分配占用,OS计算内存会较低,随着系统运行逐渐扩大到指定值。其他部分的SGA内存运行期间不会改变;

b)  PGA,进程全局区:这部分内存并非一启动就分配,而是随着应用的使用变化而变化,有排序、并行、HASH JOIN时会增大,甚至会突破PGA_AGGREGATE_TARGET设置值,而长时间不使用时又会返回给操作系统;12c增加了新的内存参数PGA_ AGGREGATE _LIMITS,当PGA总使用量超过该值时,使用PGA最多的非关键进程会自动退出。

c)  连接到数据库的每个TCP连接本身会占用8M~10M左右内存。对于使用中间件共享连接池的应用,连接数基本固定,内存占用也就固定;对于直接连接数据库的应用,这部分内存占用随着数据库session数的增减而增减;

d)  操作系统自身内存的占用,包括常用软件如patrol等的内存占用。这部分占用无法给出固定值,简单计算可以按30%物理内存计算,且不低于2.4G,不高于15G。


2、PDB层的参数设置

PDB层的参数设置类似于单独一个数据库的参数设置,但参数的内容与效果与CDB参数并不完全相同。关于资源限制类的参数,PDB的所有资源都是向CDB参数框定的资源使用,不会超过CDB的参数限制。PDB的所有参数设置均不会出现在Oracle的spfile中,其都会存储在PDB_SPFILE$视图中,且只有CDB用户可以查看,在PDB的管理员用户中无法有效获取该视图值。

a)  CPU_COUNT

该参数指定了PDB能够同时占用的CPU核数,当该PDB业务突然异常增长时最多只能将指定数量的CPU占满,无法占用更多CPU资源,从而保证各PDB之间的CPU隔离。使用该参数实现CPU隔离的好处在于不依赖于resource_manager,限制非常严格,不足之处在于如果需要调整PDB的CPU,需要重启实现。此时可以通过RAC节点上PDB的轮启来降低对应用业务的影响。

默认值:0,PDB继承CDB设置

规范值:根据PDB申请核数设置。

b)  SGA_TARGET

PDB中该参数设置该PDB可以使用的最多SGA,不能大于CDB的SGA_TARGET。与CDB的SGA_TARGET在数据库启动时就占用不同,此部分内内存在PDB启动时并不会向CDB内存管理申请,在业务使用后才会分配。使用后SGA使用值最小值约为SGA_MIN(数据中心规范默认不设置)与SHARED_POOL_SIZE+DB_CACHE_SIZE。

默认值:0;

规范值:根据PDB申请核数结合内存分配表设置。

c)  SHARED_POOL_SIZE

该参数指定了PDB中最小保留的共享池大小,PDB刚启动时,使用的共享池会小于设定值,业务使用后,Oracle可以保证其最低使用不低于设置值。。

默认值:0

规范值:不低于1.5G,根据PDB申请核数结合内存分配表设置。

d)  DB_CACHE_SIZE

该参数指定了PDB中最小保留的数据cache大小,测试表明,Oracle可以严格保证单PDB的数据cache不被挤占。

默认值:0

规范值:不低于2G,根据PDB申请核数结合内存分配表设置。

e)  MAX_MBPS

该参数指定了PDB可以占用的最大存储带宽,其中不包括DBWR、control file等关键IO。

通过在PDB中设置该值来避免单个PDB的IO占用过高影响其他PDB。

默认值:0,无限制

规范值:不低于200。

f)  MAX_IOPS

该参数指定了PDB可以占用的最大存储IOPS,其中不包括DBWR、control file等关IO。

通过在PDB中设置该值来避免单个PDB的IO占用过高影响其他PDB。

默认值:0,无限制

规范值:不低于6000

g)  PGA_AGGREGATE_TARGET和PGA_AGGREGATE_LIMITS

PGA设置值,与CDB参数设置值含义相近,其使用值不超过PGA_AGGREGATE_LIMITS,同时在CDB内存出现竞争时,各PDB使用PGA最大值不会超过CDB的PGA_AGGREGATE_LIMITS。


三、多租户数据库的管理

1、容器数据库的登录与检查

服务器端可以使用sqlplus/ as sysdba进入root容器,然后使用如下命令方式进入我们想要连接的PDB。

altersession set container=PDB_NAME;

之后可以使用showpdbs;检查PDB的状态,如果在root容器输入此命令,则可以检查所有PDB的状态。

使用easyconnect的方式进行连接:

connsystem/sys@192.168.xx.xx:1521/PDB_NAME or SERVICE_NAME

进入PDB之后可以使用show con_id/con_name 获取当前连接PDB的ID和名称。


2、容器数据库的启停

只有使用特权用户连接根容器,才能启动和停止CDB。启动和停止根容器的处理过程,与启动和停止非CDB数据库的处理过程相同。要启动CDB,应先使用sys用户连接它,然后执行startup命令:

sqlplus/ as sysdba

SQL>startup;

启动CDB不会直接启动所有相关的可插拔数据库。下面的命令可以启动所有可插拔数据库:

SQL>alterpluggable database all open;

在PDB的session中则可以执行startup&shutdown启停自身库。

要关闭CDB,可执行下面的命令:

SQL>shutdownimediate;

就像处理非CDB数据库一样,这行代码会关闭CDB实例并断开所有连接该数据库的用户。如果该CDB中还有正在运行的可插拔数据库,它们也会被关闭,而且连接它们的用户也会被断开。


3、数据字典视图

12c中提供了新的CDB级别的数据字典视图,其与原先的数据字典视图关系如下:


SQL>select view_name from dba_views where view_name like ‘CDB%’;

常用的CDB视图比如CDB_PDBS、CDB_TABLESPACES、CDB_USERS等等。

在DBA字典视图则提供了PDB内的信息。

SQL>select table_name from dict where table_name like ‘DBA%’;


4、性能视图

当从一个PDB中查询v$视图将只显示PDB相关的信息。

当从ROOT中查询时,v$视图和CDB_视图可以返回多个容器的行,这些视图返回有一个额外的con_id列,用于区分不同容器的数据。


结束语

12c的多租户容器数据库为多租户、多实例的用户提供了一套不同以往的解决方案。目前我们还无法比对多租户数据库对比虚拟机层面的多实例会有多少的性能差异。但其的设计架构确实为DBA管理数据库提供了很大的方便。相信各位熟悉Oracle的读者会对12c有更深了解和感受,切分了CDB和PDB,究竟在商业应用中会有怎么样的表扬,让我们拭目以待吧。


非功能之路

长按二维码关注

一起来涨姿势吧~



以上是关于知识拓展Oracle 12c多租户容器数据库简介的主要内容,如果未能解决你的问题,请参考以下文章

Oracle12c多租户如何连接到CDB或PDBCDB与PDB容器切换

Oracle12C多租户管理用户角色权限

oracle12c 多租户管理四(容器连接切换)

oracle12c 多租户管理四(容器连接切换)

Oracle12C 多租户管理

Oracle 12c 多租户常用管理命令