zoukankan      html  css  js  c++  java
  • Oracle 18c 新特性:动态 Container Map 增强 Application Container 灵活性

    数据技术嘉年华等你来

    活动预告:11.16-17日,北京市东三环中路61号富力万丽酒店,相聚数据技术嘉年华,(99元票务)免费购票倒计时,点击查看大会详情。


    盖老师带来主题“稳筑基石,云帆万里-数据技术的发展和平台创新”,敬请期待~


    点击“阅读原文”或者扫描下图二维码注册购票,即将售罄,赶快参与鸭!


    640?wx_fmt=jpeg


    盖国强,云和恩墨创始人,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),整个数据库架构如下图所示:

    640?wx_fmt=png


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

    640?wx_fmt=png


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

    640?wx_fmt=png

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

    640?wx_fmt=png


    来看一下测试过程。


    首先创建一个应用容器,这个 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;

    640?wx_fmt=jpeg


    现在对应用容器进行初始化,在其中部署初始的元数据,创建 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 增加的动态容器映射特性,允许我们增加、分拆分区数据,进一步的增强了灵活性。

    640?wx_fmt=png


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






    近期文章

    删了库之后,不要着急跑路

    一道面试题看数据库性能和安全的方方面面

    Percona发布XtraBackup for MySQL 8.0

    独立发布的Oracle严重CVE-2018-3110公告

    Oracle宣布在云上正式上线 自治事务处理数据库

    为什么看了那么多灾难,还是过不好备份这一关

    640?wx_fmt=jpeg

  • 相关阅读:
    es6 常用方法
    vue HTTP 请求(vue-resource)
    vue 常用语法糖
    js中slice,SubString和SubStr的区别
    浅谈JavaScript中forEach与each
    vue 新版本 webpack 代理 跨域设置
    js 动态添加class封装(es6语法)
    jsonp promise 封装
    location.origin兼容IE
    给zTree的treeNode添加class
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312238.html
Copyright © 2011-2022 走看看