Oracle 12C

Oracle 12C

Oracle 12c 也在云端的基础上发展为多租户架构 新的数据库让企业可以在 单一实体机器中部署多个数据库 ,而且每个数据库都能以 动态插拔 的方式,在12c多租户架构下扩充、整合、升级与备份

杜奕锋认为,12c多租户云端架构的概念,是一种类虚拟化技术,没有真的采用虚拟化技术,而是 像虚拟化使用VM来打包执行环境的概念来设计数据库,在一个大数据库之下,由多个小的数据库组成,这就是所谓的多租户云端架构

 目前, 12c 的多租户架构最多可支持252个数据库 ,而且数据库管理员可以把多个数据库当作一个数据库来管理,不论升级或备份都可以插拔的方式完成。

Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个 数据库容器 (CDB)承载多个 可插拔数据库 (PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。


其实大家如果对 SQL SERVER 比较熟悉的话,这种CDB与PDB是不是感觉和SQL SERVER的单实例多数据库架构是一回事呢。像PDB$SEED可以看成是master、msdb等系统数据库,PDBS可以看成用户创建的数据库。而可插拔的概念与SQL SERVER中的用户数据库的分离、附加其实就是那么一回事。看来ORACLE也“抄袭”了一把SQL SERVER的概念,只是改头换面的包装了一番。

Oracle 数据库12c的组成包括三个部分

分别是:

1 最底层的CDB(Container Database)

CDB则是一个后端平台,让数据库管理员可以将多个PDB数据库当作一个来管理,对于终端用户来说并没有任何差异。

当数据库需要迁移时,拔出的PDB会携带自己的信息与设定,比如修补程序以及加密信息等,而若需要扩展PDB时,则需要另外增加内存才能应用。

2 中间层的Root

Root则是用来定义需要共享的后端内容,比如修补程序更新,只需要在Root做一次,在Root之上运作的PDB就可以多个一起完成更新;

3 最上层的PDB(Plugable Database)。

每个PDB都是一个可独立插拔与管理的数据库 ;

CDB 组件(Components of a CDB)

一个CDB数据库容器包含了下面一些组件:

ROOT 组件

ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SEED 组件

  Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。

SQL> show pdbs

    CON_ID CON_NAME            OPEN MODE  RESTRICTED

---------- -----------------------------------      ----------

         2 PDB$SEED                 READ ONLY  NO

         3 PDBORCL                  READ WRITE NO

PDBS

    CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。

这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。

1 )连接到CDB数据库

连接到CDB数据库容器非常简单,跟以前连接数据库是一样的

[oracle@chen12c ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Tue May 12 18:37:11 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

2 )查看数据库是否为CDB

SQL> select name, decode(cdb, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database;

NAME      Multitenant Option         OPEN_MODE                CON_ID

---------       --------------------------      --------------------              ----------

ORCL      Multitenant Option enabled     READ WRITE                  0

 

SQL> select cdb from v$database;

CDB

---

YES

3 )查看当前容器(Container)

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> select sys_context('userenv','con_name') "Container DB" from dual;

Container DB

--------------------------------------------------------------------------------

CDB$ROOT

4 )查看CDB容器中的PDBS信息

查看CDB中有多少个pluggable database

数据库起来后,缺省PDB为mount状态

SQL> set linesize 200

SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;

SQL> select con_id,dbid,name,open_mode from v$pdbs;

CON_ID   DBID     NAME     OPEN_MODE

---------- ----------  --------      ----------

         2  790056509  PDB$SEED   READ ONLY

         3 2636272535  PDBORCL    MOUNTED

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

         2 PDB$SEED                       READ ONLY  NO

         3 PDBORCL                        READ WRITE NO

5 )启动PDB数据库

方式1:

打开pdb数据库

SQL> alter pluggable database pdborcl open;

Pluggable database altered.

SQL> select con_id,dbid,name,open_mode from v$pdbs;

    CON_ID       DBID NAME     OPEN_MODE

---------- ---------- -------- ----------

         2  790056509 PDB$SEED READ ONLY

         3 2636272535 PDBORCL  READ WRITE

方式2:

SQL> select con_id,dbid,name,open_mode from v$pdbs;

    CON_ID       DBID   NAME     OPEN_MODE

---------     ----------  --------   ----------

         2  790056509 PDB$SEED READ ONLY

         3 2636272535 PDBORCL  MOUNTED

进入pdb数据库

SQL> alter session set container=pdborcl;

Session altered.

SQL> startup

Pluggable Database opened.

SQL> select con_id,dbid,name,open_mode from v$pdbs;

   CON_ID      DBID   NAME  OPEN_MODE

----------     ---------- -------- ----------

     3     2636272535 PDBORCL  READ WRITE

6 )关闭PDB数据库

SQL> alter pluggable database pdborcl close;

Pluggable database altered.

SQL> select name,open_mode from v$pdbs;

NAME     OPEN_MODE

--------      ----------

PDBORCL  MOUNTED

7 )在容器间切换

SQL> show con_name

CON_NAME

------------------------------

PDBORCL

SQL> alter session set container=cdb$root;

Session altered.

SQL> show con_name

CON_NAME

------------------------------

CDB$ROOT

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

         2 PDB$SEED                       READ ONLY  NO

         3 PDBORCL                        MOUNTED

SQL> alter session set container=chen ;

ERROR:

ORA-65011: Pluggable database CHEN does not exist.

SQL> alter session set container=pdborcl;

Session altered.

SQL> show con_name

CON_NAME

------------------------------

PDBORCL

创建用户

1 切换到容器数据库

SQL> alter session set container=cdb$root;

Session altered.

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS

---------------- ------------

orcl             OPEN

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

         2 PDB$SEED                       READ ONLY  NO

         3 PDBORCL                        MOUNTED

2 创建用户(容器数据库)

SQL> create user chen identified by chen;

create user chen identified by chen

            *

ERROR at line 1:

ORA-65096: invalid common user or role name

SQL> ! oerr ora 65096

65096, 00000, "invalid common user or role name"

// *Cause:  An attempt was made to create a common user or role with a name

//          that was not valid for common users or roles.  In addition to

//          the usual rules for user and role names, common user and role

//          names must start with C## or c## and consist only of ASCII

//          characters.

// *Action: Specify a valid common user or role name.

//

错误信息的解析非常明确地告知“试图创建一个通用用户,必需要用C##或者c##开头”

SQL> create user c##chen identified by chen default tablespace users;

User created.

SQL> grant dba to c##chen;

Grant succeeded.

SQL> select username from dba_users where username='C##CHEN';

USERNAME

----------

C##CHEN

SQL> conn c##chen/chen

Connected.

SQL> create table t1(id number);

Table created.

SQL> declare

  2  begin

  3  for i in 1..10 loop

  4  insert into t1 values(i);

  5  end loop;

  6  end;

  7  /

PL/SQL procedure successfully completed.

SQL> show user

USER is "C##CHEN"

创建用户(可插拔数据库)

[oracle@chen12c ~]$ cd /u01/app/oracle/product/12.1.0/network/admin/


[oracle@chen12c admin]$ vim tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

ORCL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = chen12c)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl)

    )

  )

PDBORCL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = chen12c)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = pdborcl)

    )

  )


[oracle@chen12c admin]$ tnsping pdborcl

TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 12-MAY-2015 18:21:31

Copyright (c) 1997, 2014, Oracle.  All rights reserved.

Used parameter files:

/u01/app/oracle/product/12.1.0/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = chen12c)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdborcl)))

OK (0 msec)

--启动关闭PDB  

--pdb的管理可以在cdb中进行也可以在pdb中进行,  

--如果是cdb中进行,需要PLUGGABLE关键字(如下alter),  

--如果是pdb中直接和普通数据库一样(startup/shutdown immediate)  

--打开单个pdb  

alter  pluggable  database  pdborcl  open ;  

--打开所有pdb  

alter  pluggable  database  all  open ;  

--关闭所有pdb  

alter  pluggable  database  all  close  immediate;    

--进入pdb  

alter  session  set  container=pdborcl;  

--//  

conn sys/sys@localhost:1521/pdborcl  as  sysdba;  

[oracle@chen12c admin]$ sqlplus sys/oracle@pdborcl as sysdba

--进入cdb  

alter  session  set  container=cdb$root;  

--//  

conn /  as  sysdba;  

--创建用户  

--创建用户默认的是container=all,在cdb中只能创建全局用户(c##开头),  

--会在cdb和所有的pdb中创建该用户(但是pdb中的全局用户需要另外授权才能够在pdb中访问)。  

--在pdb中只能创建的用户为本地用户  

--创建全局用户  

create  user c##xff identified  by  xifenfei;   

--创建本地用户  

alter  session  set  container=pdborcl;  

create  user xxx identified  by  123;    

--用户授权  

--用户授权默认情况下是只会给当前container,在cdb中也可以指定container=all,对所有open的pdb且存在该用户都进行授权  

grant   connect   to  c##xff;  

grant  resource  to  c##xff container=all    

--修改参数  

--在cdb中修改,pdb会继承进去;如果在pdb中修改会覆盖pdb从cdb中继承的参数含义  

  alter  system  set  open_cursors=500 container=all;  

 show parameter open_cursors;  

  alter  session  set  container=pdborcl;  

 show parameter open_cursors;  

 --//  

  alter  system  set  open_cursors=100;  

 show parameter open_cursors;  

 conn /  as  sysdba  

 show parameter open_cursors;  

参考:

http://www.ctocio.com.cn/cloud/242/12680742.shtml

http://www.cnblogs.com/kerrycode/p/3386917.html

http://blog.csdn.net/zzvnzz/article/details/24840541

http://blog.itpub.net/11954956/viewspace-1079297/

请使用浏览器的分享功能分享到微信等