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