Oracle 12c R2版本 Application Containers 特性(一)

在Oracle Database 12c R2版本中,Oracle带来新的Application Containers特性,该特性对原有的多租户功能进行了增强,在CDB root容器中可以创建一个叫做Application root的容器,类似于CDB root,可在其内创建多个依赖于Application root的Application PDBs,其架构图如下:

“Application”

在Application Container特性下还有另一个概念,被命名为“Application”,我们可以把“Application”理解为一个区域,“Application”只能创建在Application root中,其内可以创建表、视图、函数等公共对象,然后可在Application PDBs中使用sync同步命令,来实现“Application”内的公共对象共享到Application PDBs中。

本篇文章中,通过"Application Root/PDBs"与"Application"的创建开始带你认识Application Container特性,在第二篇中将带你了解“Application”内的公共对象(Application Common Objects),并通过实验让你对其有一个更加直观的认识。

Application root的创建

Application root与普通的PDB创建语句相似,在创建语句中需要指定“as application container”子句。

首先我们先设置db_create_file_dest:

创建一个名qdatacon1的Application root:

这样一个名为qdatacon1的Application root就已经成功创建 ,可以通过视图dba_pdbs.application_root字段查看是否是Application root,如下:

dba_pdbs.application_root字段为YES

将QDatacon1打开:

注意,当在使用Application Containers特性时需要使用数据文件的OMF的管理方式,虽然在不使用OMF管理时依然可以成功创建Application root以及Application PDBs,但当“Application”内包含表空间后,在Application PDBs中进行同步“Application”时会报ORA-01537错误,无法将“Application”内的表空间同步到Application PDBs中。错误代码如下:

Application root的基本管理与普通的PDB基本上没有区别, 包括Application root的cloning/unplug/plugin等。但需要注意as application container的使用,比如下面unplug/plugin的过程:

当然,如果你想将Application root拔出后,以普通PDB的方式插入CDB中,那么去掉

as application container子句即可。

Application PDBs的创建

Application PDB在创建时必须连接到相应Application root中,而不是CDB root,当连接到Application root中时,只需按照创建普通PDB的方式创建即可,无需额外子句指定,创建完成的PDB既是相应Application root中的Application PDB。

切换到Application root中创建Application PDB:qdcpdb1

切换到CDB中:

在CDB$root中通过show pdbs显示时,可以看到的Application PDB与普通的PDB并没有什么区别。

可以通过cdb_pdbs视图,来查看Application PDB属于哪个Application root

当Applicatoin PDB创建成功,可以使用sync命令将它与Application root中定义的Application进行同步。

alter pluggable database application all sync;

Applications

文章的开篇提到,可以把“Application”做为一个区域来理解,而“Application”只能在Application root中创建及管理,相关命令如下:

application_clauses::=

在“Application”的维护命令中可能最常用的就是install、patch、upgrade以及uninstall,下面对三个命令做简单描述。

Install an Application

当使用alter pluggable database带有begin install子句时,即开始一个“Application”的安装,这里可以理解为一个区域的开始,当安装完成后在Application PDB中使用sync命令同步相应的“Application”将会被自动安装在本PDB内。

QDatacon1:

这样我们开始了一个qdcon1_reg1的“Application”,使用end install命令封闭qdcon1_reg1,如下:

可以通过dba_applications视图查看,已经安装的Application,如下:

Application安装完成后,可以在该Application root下的Application PDB中使用sync命令来进行同步,如下:

查看dba_applications视图,确认qdcon1_reg1是否已经安装

可以看到qdcon1_reg1已经安装完成,安装完成后qdcon1_reg1中的公共对象会以特定的方式被共享到相应的Application PDB中,如下:

表tdata已经被共享到qdcpdb1中。

在Application root中可以通过dba_app_pdb_status视图,查看Application被安装到哪些Application PDB中,如下:

Patch an Application

在上面的小结中,当我们使用end install子句将“Application”封闭后,如果想再次在“Application”中创建对象(table/view/packages/sequence等),以及对“Application”内已经存在的对象进行alter操作时,我们可以使用patch子句对现有的“Application”进行修补操作。

如下示例,开始一个patch,并且在application内创添加表以及更改现存表的表结构:

删除Application内的表:

删除失败

结束patch:

查看patch信息

在qdcpdb1中同步qdcon1_reg1

tdata的表结构与texte表均同步完成

Upgrade an Application

对“Application”我们可以使用patch来对其进行修补操作,但修补操作只限添加/更改等,无法对已经存在“Application”中的公共对象进行删除操作,如果我们想对公共对象进行删除操作,可以使用UPGRADE子句对现有的“Application”进行升级,在升级的过程中,Oracle会首先自动创建Application root的Clone版本,Clone版本创建完成后,Application PDBs将指向Clone版本的Application root,“Application”将继续执行升级操作,升级完成之后,Application root的Clone版本将继续被保留,并且为不同步“Application”的Application PDB提供服务,同步“Application”后的Application PDB将指向升级后的Application root。

升级现有的qdcon1_reg1:

F1956732192_4_1即为qdatacon1的clone版本

删除tdata表,并且创建新表tmeta:

结束升级,并查看版本信息:

在qdcpdb1中同步qdcon1_reg1

tdata被删除/tmeata的创建已同步到qdcpdb1中。

Uninstall an Application

“Application”的卸载后并不会从数据字典中将该“Application”删除,它会被标记为UNINSTALL,以便“Application”不可以进行upgrade/patch/uninstall等操作,当uninstall命令发出后,需要将该“Application”中包含的对象全部删除。

uninstall同样会产生clone版本的Application root

删除对象且结束uninstall:

因为对象并没有全部删除,导致end uninstall失败,下面继续drop用户和表空间:

查看被uninstall的qdcon1_reg1状态:

在qdcpdb1中查看公共对象情况:

表texte是extended data-linked方式,数据存储在Application root的qdata_tbs中,因为qdata_tbs已经被删除,所以在qdcpdb1中查询时报错,而tmeta为metadata-linked方式,数据存储在本地,所以可以在未做同步时可以查询。

同步qdcon1_reg1:

同步完成。

本篇文章先到这里,下一篇文章将讲解“Application”内公共对象(Application Common Objects)的三种形式。

原文发布于微信公众号 - 沃趣科技(woqutech)

原文发表时间:2017-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

centos7下安装php+memcached简单记录

1)centos7下安装php 需要再添加一个yum源来安装php-fpm,可以使用webtatic(这个yum源对国内网络来说恐怕有些慢,当然你也可以选择其它...

3808
来自专栏友弟技术工作室

IPFS星际文件系统之-- 环境配置

IPFS(InterPlanetary File System)是一个点对点的分布式超媒体分发协议,它整合了过去几年最好的分布式系统思路,为所有人提供全球统一的...

1684
来自专栏小狼的世界

利用PUT方式上传文件的方法研究

虽然没有POST方法使用广泛,但是PUT方法却是向服务器上传文件最有效率的方法。POST上传文件时,我们通常需要将所有的信息组合成 multipart 传送过去...

861
来自专栏实用工具入门教程

如何部署 Bacula Server

Bacula是一种开源网络备份解决方案,允许您创建备份并执行计算机系统的数据恢复。它非常灵活和强大,这使得它在配置时稍微麻烦,适合在许多情况下进行备份。备份系统...

3053
来自专栏IT笔记

SpringBoot开发案例之配置静态资源文件路径

前言 SpringBoot本质上是为微服务而生的,以JAR的形式启动运行,但是有时候静态资源的访问是必不可少的,比如:image、js、css 等资源的访问。 ...

1.6K10
来自专栏纯洁的微笑

springboot(一):入门篇

什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使...

3057
来自专栏java闲聊

AvtiveMQ与SpringBoot结合

2017
来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

十一、pycharm远程代码调试

 第三方登录和支付,都需要有服务器才行(回调url),我们可以用pycharm去远程调试服务器代码

1520
来自专栏乐沙弥的世界

使用CRM方式管理heartbeat

1、在heartbeat v2之后的版本,可以将haresources方式管理的资源转化为基于CIB方式进行管理 2、使用CRM(CIB)管理,需要配置ha...

1254
来自专栏扎心了老铁

springboot 注册服务注册中心(zk)的两种方式

在使用springboot进行开发的过程中,我们经常需要处理这样的场景:在服务启动的时候,需要向服务注册中心(例如zk)注册服务状态,以便当服务状态改变的时候,...

3755

扫码关注云+社区

领取腾讯云代金券