zoukankan      html  css  js  c++  java
  • 浅谈Oracle12c 数据库、用户、CDB与PDB之间的关系

    名词介绍:

    数据库:数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生 于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以 后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管 理的方式。
    C D B:CDB全称为Container Database,中文翻译为容器数据库。
    P D B:PDB全称为Pluggable Database,中文翻译为可插拔数据库。

    首先,我来谈一下数据库、user和schema之间的关系。在我看,数据库就像是含有好多小房间的一个大大的仓库,然后我们把这个大仓库分了好几块,这就是schema。分出来的小仓库得有人管理啊,管理的就叫做user。当然了,用户可以在这些小仓库内放置许多许多的货物,这个货物就是表和数据。至于很多人不懂user和schema之间的区别,我在此引用网上的一段话来解释下他们之间的关系:
    “user即Oracle中 的用户,和所有系统的中用户概念类似,用户所持有的是系统的权限及资源;而schema所涵盖的是各种对象,它包含了表、函数、包等等对象的“所在地”, 并不包括对他们的权限控制。好比一个房子,里面放满了家具,对这些家具有支配权的是房子的主人(user),而不是房子(schema)。你可以也是一个 房子的主人(user),拥有自己的房子(schema).可以通过alter session的方式进入别人的房子。如果你没有特别指定的话,你所做的操作都是针对你当前所在房子中的东西。至于你是否有权限使用(select)、搬 动(update)或者拿走(delete)这些家具就看这个房子的主人有没有给你这样的权限了,或者你是整个大厦(DB)的老大(DBA)。alter session set schema可以用来代替synonyms。如果你想调用其他schema的对象(有权限的前提下),但并没有建synonym,同时又不想把其他 schema名字放入代码中,就可以首先使用alter session set schema=<其他schema名字>。”
    这段话形象的阐释了user和schema的区别和联系。
    下面我再谈一下12c与之前的版本中的区别,那么大家来猜猜最“Strongly”的区别是什么呢。Bingo,就是pdb和cdb概念的引入。
    这里引用一下Oracle12c新特性的文档中的一张图来更方便的解释CDB和PDB的关系。

    CDB都有什么组成部分呢。其实通过上图我们可以清楚的看到:
    1、ROOT:root,又名CDB$ROOT,用来存储Oracle提供的metadata和common user 的。metadata的一个例子是Oracle提供的PL/SQL包的源代码。Common user 指的是一个所有容器都知道的数据库用户(注意,当我们想在数据库中创建 用户的时候,一般是不能往ROOT中创建的。我们需要先通过语句alter session set container = PDB’s name 转换到相应名称的PDB下再创建用户, 要想详细了解关于common user 和 local user 的区别的话,请参考Oracle 官方文档《Oracle Database Security Guide》)。 一个CDB只能有一个根。
    2、SEED:seed,又名PDB$SEED,是用来创建新的PDB的模版。但是,你不能在seed 里添加或者修改对象,一个CDB只能有一个SEED。
    3、PDB:PDB展现给用户和应用的形象就像是一个没有CDB的普通数据库一样。例 如,一个PDB可以包括支持一个特定应用程序所需的所有数据和代码。PDB 完全向后兼容Oracle12c之前版本的所有数据库。
    以上的每个组成部分都被称为容器(container),ROOT、SEED、PDB都是容器。而这些容器在CDB中都有他们自己唯一的容器ID和名称。我们可以很轻松的向CDB中插入一个PDB或者从CDB中拔出一个PDB。当我们将一个PDB插入CDB中时,相当于将这个PDB与CDB连接起来。反之则解除关系。
    什么?你问我Oracle为什么这么干,这令你感到麻烦并且困扰。那么,我告诉你。这其实大大方便了数据的迁移。我们可以很方便的将一个特定的PDB从一个CDB挪到另一个CDB上面而不改变里面的任何数据和架构。这难道不是很wonderful吗?当然,一个PDB只能在同一时间内插入一个CDB而不是多个。每一个PDB都有自己独一无二的全局唯一标识符(GUID)来预防PDB的错乱使用。

    实战::::
    plsql相关
    使用sql developer ,同连接cdb一样,只是选择“服务名”,然后服务名处填写“pdborcl”,即可。
    使用sqlplus, conn sys/passwd@//localhost:1521/pdborcl as sysdba。

    java开发连接Oracle 12c采用PDB遇到问题记录
    今天初次使用java连接Oracle 12c,遇到各种问题,为方便后续查询,在汇总了问题记录及解决方案如下。

    ORA-28040: No matching authentication protocol

    需要在 ...product12.1.0dbhome_1NETWORKADMINsqlnet.ora

    文件中加入

    SQLNET.ALLOWED_LOGON_VERSION=8

    ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

    SID应该是存在的id才可以。java连接Oracle 12c时,无法识别格式不正确的SID,应该跟下面的问题一样处理。

    ORA-01017: invalid username/password; logon denied

    在pdb模式下,连接串应该是这种格式

    jdbc:oracle:thin:@localhost:1521/pdborcl

    类似后面是冒号,或者locahost前加//的,都无法正常使用。

    alter session set container = pdborcl;

  • 相关阅读:
    JSP文件上传下载组件(2)
    JSP文件上传下载组件(1)
    FetchProfile类的作用
    html(二) -- 文本标签和实体字符
    html (一)-- 概述
    单元测试框架--junit
    内省和BeanUtils
    工厂模式
    反射
    观察者设计模式
  • 原文地址:https://www.cnblogs.com/itcui/p/7787687.html
Copyright © 2011-2022 走看看