Oracle 18c 新特性:动态 Container Map 增强 Application Container 灵活性

盖国强,云和恩墨创始人,Oracle ACE总监,中国地区首位Oracle ACE和ACE总监,曾获评"中国首届杰出数据库工程师"奖,拥有近 20 年的数据库实施和顾问咨询经验,对于数据库性能优化及内部技术具有深入理解。著有《深入解析Oracle》、《循序渐进Oracle》等技术书籍。盖老师带来的主题是“稳筑基石,云帆万里-数据技术的发展和平台创新”。

主题背景:在数据库领域,随着开源技术的快速发展,市场正在分化,一方面是以Oracle、MySQL为龙头的数据生态,一方面随着MongoDB、ElasticSearch的成功IPO,以及 PostgreSQL、Redis 的奋发向上,百花齐放的时代已经来到,而这些变革的驱动力则是云浪潮。在这个主题中,将和大家分享我们对于行业的分析和展望,并对云时代企业级数据应用面对的挑战提出解决方案,同时分享云和恩墨在这一领域的探索和成功案例。

在 Oracle 18c 中,Container Map 的特性再次获得增强,实现了 动态 Container Map 的功能,允许在线动态更改容器映射。

(关注本公众号: Oranews 回复 2018OOW 可以在 “CDB Fleet” 目录找到这个 118 页的 PPT)

为了理解这个增强,我们需要回顾一下 Oracle 12.2 增加的 Container Map 的新特性,当然我相信我们还必须了解 Oracle Application Container 的概念。

简单来说,在有了多租户的体系结构之后,很多 PDB 都可能共用同一套应用架构和元数据,所以 Oracle 在数据库中引入了应用容器的概念,在应用容器中,首先存在一个 Application Root,可以在其中创建应用 SEED 数据库,种子数据库定义数据结构元数据等信息,然后其他和应用相关的数据库可以由此克隆而来,加快部署,想一想这样的例子,如果在云上为100家客户部署收费系统,通过这样的Clone就很便捷。

多租户加上应用容器(Application Container),整个数据库架构如下图所示:

在 Oracle 12.2 中增加的 Container Map 新特性,可以看做一个基于多租户 PDB 的 Sharding 架构,其基本原理是,如果我们在应用容器中构建一个分区表,其分区可以映射到不同的PDB 中,而在整个应用容器中,数据结构逻辑上是一个整体,各 PDB 仅能操作自己分区的数据,而应用在全局则可以看到所有的数据。

以下是一个示例,如果在容器级别建立应用元数据的地域分区,然后可以在创建数据表时引用启用,分区和 PDB 的名称相对应启用,则随后映射由此建立。

在应用容器全局查询,可以透明的访问数据,而针对特定分区的数据访问会被自动路由到特定的 PDB 执行:

来看一下测试过程。

首先创建一个应用容器,这个 PDB 的名称是:enmotech

SQL> create pluggable database enmotech as application container admin user enmoadm identified by EnmoAdm; Pluggable database created.

接下来创建两个区域数据库,分别是 BEIJING 和 CHENGDU:

SQL> alter session set container=enmotech; SQL> create pluggable database BEIJING admin user yhapadm identified by yhapadm; Pluggable database created. SQL> create pluggable database CHENGDU admin user yhapadm identified by yhapadm; Pluggable database created. SQL> alter pluggable database all open; Pluggable database altered.

接下来查看一下这几个数据库的角色,在 Application Root之下,是两个 Application PDB:

SQL> alter session set container=enmotech;

现在对应用容器进行初始化,在其中部署初始的元数据,创建 containermap ,然后创建数据表并对数据表启用 container_map ,最后完成这个应用元数据库的部署:

SQL> alter pluggable database application EMAPP begin install '1.0'; Pluggable database altered. SQL> create user eygle identified by eygle; User created. SQL> grant connect,resource,dba to eygle; Grant succeeded. SQL> create table eygle.containermap (CITY varchar2(20) not null) 2 partition by list (city) ( 3 partition beijing values('BEIJING'), 4 partition chengdu values('CHENGDU')); Table created. SQL> alter pluggable database set container_map='EYGLE.CONTAINERMAP'; Pluggable database altered. SQL> create table eygle.emp sharing=metadata ( empno number, ename varchar2(20), city varchar2(20)); Table created. SQL> alter table eygle.emp enable container_map; Table altered. SQL> alter table eygle.emp enable containers_default; Table altered. SQL> alter pluggable database application EMAPP end install '1.0'; Pluggable database altered.

在应用PDB中,需要先刷新同步元数据,否则对象信息并不可见:

SQL> alter session set container=BEIJING; Session altered. SQL> alter pluggable database application EMAPP sync; Pluggable database altered. SQL> desc eygle.emp Name Null? Type ----------------------------------------- -------- ---------------------------- EMPNO NUMBER ENAME VARCHAR2(20) CITY VARCHAR2(20)

在容器数据库中分别插入数据,注意,在 BEIJING 的数据库中只能插入相关分区的数据,如果试图插入不存在的分区或其他MAP区域数据,会显示出错:

SQL> insert into eygle.emp values(1,'EYGLE','BEIJING'); 1 row created. SQL> insert into eygle.emp values(2,'KAMUS','BEIJING'); 1 row created. SQL> insert into eygle.emp values(3,'YANGTINGKUN','SHANGHAI'); insert into eygle.emp values(3,'YANGTINGKUN','SHANGHAI') * ERROR at line 1: ORA-65391: violation of container map partitions

注意我接下来切换到另外一个 PDB ,结果发现前面未提交的数据会对后续的操作形成阻塞,事实上这说明 alter session set container 这个 DDL 没有隐式提交之前的事务,必须切换回到原PDB下提交事务:

SQL> alter session set container=CHENGDU; Session altered. SQL> desc eygle.emp; ERROR: ORA-04043: object eygle.emp does not exist SQL> alter pluggable database application EMAPP sync; alter pluggable database application EMAPP sync * ERROR at line 1: ORA-65023: active transaction exists in container BEIJING SQL> commit; commit * ERROR at line 1: ORA-65023: active transaction exists in container BEIJING SQL> alter session set container=BEIJING; Session altered. SQL> commit; Commit complete. SQL> alter session set container=CHENGDU; Session altered. SQL> alter pluggable database application EMAPP sync; Pluggable database altered. SQL> insert into eygle.emp values(3,'LAOXIONG','CHENGDU'); 1 row created. SQL> insert into eygle.emp values(4,'600','BEIJING'); insert into eygle.emp values(4,'600','BEIJING') * ERROR at line 1: ORA-65391: violation of container map partitions SQL> commit; Commit complete.

此时可以观察效果,在不同PDB只能查询和操作各自PDB的信息,而在Application Root 则可以查询全部数据:

SQL> alter session set container=CHENGDU;

SQL> select * from eygle.emp; EMPNO ENAME CITY ---------- -------------------- -------------------- 3 LAOXIONG CHENGDU SQL> alter session set container=BEIJING; Session altered. SQL> select * from eygle.emp; EMPNO ENAME CITY ---------- -------------------- -------------------- 1 EYGLE BEIJING 2 KAMUS BEIJING SQL> alter session set container=ENMOTECH; Session altered. SQL> select * from eygle.emp; EMPNO ENAME CITY CON_ID ---------- -------------------- -------------------- ---------- 1 EYGLE BEIJING 5 2 KAMUS BEIJING 5 3 LAOXIONG CHENGDU 9

在 18c 增加的动态容器映射特性,允许我们增加、分拆分区数据,进一步的增强了灵活性。

这就是关于 Dynamic Container Map 的增强。如果有哪位在生产环境使用了 Application Container 特性,请在留言中告诉我们。谢谢

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2018-11-12

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

Elasticsearch SQL

Elasticsearch 6.3.0 正式发布了,其中有一个重要特性:原生支持 SQL 了,不需要任何外部其他的库、处理方式等等,开箱即用。

18010
来自专栏杨建荣的学习笔记

通过top命令抓取cpu高消耗的sql (44天)

top命令在linux环境维护中很实用,虽然功能缺失不够sar那么全面。今天和大家分享一个通过top命令来抓取性能sql的案例。 通过top命令抓取了如下的信息...

40360
来自专栏程序猿

小米开源soar一款对SQL进行优化和改写的自动化工具

SOAR(SQL Optimizer And Rewriter)是一个对SQL进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开...

29610
来自专栏杨建荣的学习笔记

分分钟搭建MySQL Group Replication测试环境(二)(r12笔记第41天)

之前总结过一篇,分分钟搭建MySQL Group Replication测试环境(r11笔记第82天),但是有一个地方还有待改善,那就是那个脚本仅仅支持s...

39270
来自专栏数据和云

以12c Identity类型示范自我探索式学习方法

作者简介: ? Oracle ACE总监,ACOUG联合创始人,云和恩墨的联合创始人,致力于通过不断的技术探索,帮助中国用户理解和接触新技术,推广数据库技术应...

43540
来自专栏杨建荣的学习笔记

数据库收缩数据文件的尝试(三)(r11笔记第22天)

不知道大家在数据库运维中是否会有这样的困扰,一个数据文件里没有多少数据,但是数据文件的大小却调不下来,尝试使用resize来调整屡屡失败。如果一个数据文件里...

354120
来自专栏hadoop学习笔记

Spring Boot中对自然语言处理工具包hanlp的调用详解

HanLP 是基于 Java开发的 NLP工具包,由一系列模型与算法组成,目标是普及自然语言处理在生产环境中的应用。而且 HanLP具备功能完善、性能高效、架构...

7500
来自专栏北京马哥教育

TokuDB的特点验证

随着数据量越来越大,越来越频繁的遇到需要进行结构拆分的情况,每一次拆分都耗时很久,并且需要多方配合,非常的不想搞这个事情。于是在@zolker的提醒...

39870
来自专栏.net core新时代

删除数据库日志文件的方法

       你曾经有在执行SQL的时候,数据库报事务日志已满,然后执行报错。然后纠结于怎么删除数据库日志,捣鼓半天吗,现在就提供两种删除日志文件的方法,希望能...

25650
来自专栏CDA数据分析师

【干货】大数据量下,58同城mysql实践!

WOT(World Of Tech)2015,互联网运维与开发者大会将在北京举行,会上58同城将分享《大数据量下,58同城mysql实战》的主题,干货分享抢先看...

30290

扫码关注云+社区

领取腾讯云代金券