oracle12c新特点之可插拔数据库(Pluggable Database,PDB)

1.    12c PDB新特点的优势

1)    可以把多个PDB集成进一个平台。

2)    可以快速提供一个新的PDB或一个已有PDB的克隆。

3)    通过拔插技术,可以快速把存在的数据库重新部署到一个新平台上。

4)    多个PDB数据库补丁或升级一次完成。

5)    通过把单个PDB拔插到较高版本的不同CDB,可以补丁或升级一个PDB。网址:yii666.com

6)    从同一个CDB中众多PDB中分离出某个PDB的内容。

7)    分离这些PDB应用管理员的责任。

2.    12c PDB新特点的功能

1)    在一个CDB中,你可以拥有很多PDB。文章来源地址:https://www.yii666.com/article/764152.html

2)    PDB和12.1之前版本的普通数据库是向后兼容的。

3)    PDB对应用是透明的——你不需要改变客户端代码或数据库对象。

4)    RAC中每个实例作为一个整体打开CDB(因此CDB和其中的PDB数据库版本都是相同的)。

5)    会话仅仅看到它自己连接的那个PDB。

6)    你可以从一个CDB拔出一个PDB,然后插入另一个CDB。

7)    你可以在同一个CDB或不同CDB间克隆PDB。

8)    资源管理器随着PDB的功能得以扩展。

9)    通过SQL语句实现了实体PDB的操作(创建,拔出,插入,克隆,清除,设置打开模式)。

10)  当连接到所谓的“根”(root)时,CDB管理员来执行这些操作。

11)  所有的PDB能被一次备份,但可以分别单独恢复。

3.    12c PDB的详解

1)    每个PDB有自己的私有数据字典用于用户创建的数据库对象;另一方面,CDB作为一个整体也包含Oracle提供系统的数据字典,其中,每个数据字典定义自己的命名空间。换句话说,有全局数据字典(CDB级)和本地数据字典(PDB级)。

2)    有新的分开的数据字典架构,该架构允许一个PDB被快速从一个CDB拔出并插入一个不同的CDB。

3)    每个PDB只能看到Oracle提供系统的只读定义。

4)    有全局数据库参数,也有本地数据库参数。PDB参数仅仅属于特定的PDB,并且拔出后,PDB参数也将保持不变。

5)    数据库用户可以是全局的(CDB)或本地的(PDB)。SYS和SYSTEM用户一开始就在两级DB中存在。如果你在CDB中创建了一个新用户,那么你在PDB中也能看到这个用户。在PDB中创建的用户只能在该PDB中使用。文章来源地址https://www.yii666.com/article/764152.html

6)    临时表空间可以是全局或本地的。

7)    Redo日志和Undo表空间都是全局的(CDB级)。

8)    Data Guard在CDB级作为一个整体发挥作用;RMAN调度的备份也作为一个整体在CDB级完成;任何时候,你可以只备份一个PDB。文章地址https://www.yii666.com/article/764152.html

9)    应用连接PDB时,不需做代码修改;系统管理员可以连接CDB;连接串中的服务名确定目标PDB。

10)  PDB允许更加清晰的声明定义一个应用;一个PDB对同一个CDB里的其他PDB一无所知;每个PDB是个密闭的容器。这保证了新层面DB的独立和安全。

4.    连接到一个PDB

创建一个PDB时,一个服务也会被创建在该PDB内,并且,该服务被作为初始化容器。你可以通过下列语句显示目前的容器:

selectSys_Context('Userenv', 'Con_Name') "current container" from dual;

在12.1 SQL*Plus提示符下,你能用SHOW con_name来显式目前的容器。

在创建PDB时,也会启动服务。虽然服务的元数据被记录在PDB中,但名字和PDB名字是一样的。会话将被一个不能改变目前容器的用户创建。

客户端应用代码通常被设计成在代码外面确定连接描述信息。例如:代码也许使用TNS别名,允许在不改变代码的情况下改变连接串。

当然,在一个PDB中可以有多个服务。每个将表示它被定义为PDB初始目前容器。可以用常规方法创建、维护、清除PDB中另外的服务,但一定不要清除PDB中默认的服务。建立初始容器是一个PDB的会话的唯一方法是确定一个服务。

下面的例子中,看如何用容易的语法连接到Orale12c中被叫做“cdb1”的CDB,并且连接到其中一个PDB:

sqlplusSys/Sys@localhost:1521/cdb1 AS SYSDBA

CONNECTScott/tiger@localhost:1521/My_PDB

5.    创建并打开一个新的Oracle12c可插拔数据库(PDB)

现在,我们将要创建并打开一个名叫my_pdb新的可插拔数据库(PDB)。每个CDB都有一个叫做 PDB$Seed 的标准的PDB模板。我们实际是通过克隆该模板来创建一个新PDB。看下面例子:

sqlplussys/pass@localhost:1521/cdb1 as sysdba

create pluggable database My_PDB

admin user App_Admin identified by pass

file_name_convert = ('/pdbseed/', '/my_pdb/');

“ file_name_convert”子句确定新文件名如何从模板库派生出来,这点和我们知道的rman差不多。在PDB创建期间,Oracle仅拷贝system和sysaux表空间的两个数据 文件,undo,redo等其余数据库文件是CDB全局的文件,并且它们属于特定的叫做CDB$Root的容器。

“admin user”子句是必须的,在扩展格式,给新用户赋予了权限和角色,该用户仅在my_pdb内可以创建新会话。

在创建完可插拔数据库后,新的PDB处于MOUNTED模式。在新PDB中创建一个新会话前,必须先打开它。因此,我们可以用下面的命令打开它:

alter pluggabledatabase My_PDB open;

6.    检查容器数据库(CDB)和可插拔数据库(PDB)文件

select con_id,tablespace_name, file_name

fromcdb_data_files

where file_Namelike '%/cdb1/pdbseed/%'

or file_Namelike '%/cdb1/my_pdb/%'

order by 1, 2;

CON_IDTablespace_Name File_Name

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

2 SYSAUX /home/oracle/oradata/cdb1/pdbseed/sysaux01.dbf

2 SYSTEM /home/oracle/oradata/cdb1/pdbseed/system01.dbf

3 SYSAUX /home/oracle/oradata/cdb1/My_PDB/sysaux01.dbf

3 SYSTEM /home/oracle/oradata/cdb1/My_PDB/system01.dbf

7.    Open all Oracle 12c Pluggable Databases (PDB)

RAC每个实例中的每个CDB中的PDB有它自己的打开模式(Open_Mode )和限制状态(Restricted status)。打开模式的可能值为MOUNTED,READ ONLY,和 READ WRITE;当PDB打开时,限制状态可能的值为YES和NO,否则为null;

启动一个实例(这回打开这个CDB)并不会打开PDB。“alterpluggable database”语句被用来设置PDB的打开模式。在该SQL语句中,可以给一个特定PDB名或用关键字“all”,例如:

alter pluggabledatabase all open;

8.    关闭CDB中所有的Oracle12c可插拔数据库

下列语句关闭CDB中所有的PDB:

alter pluggabledatabase all close;网址:yii666.com<

9.    克隆同一个CDB中一个现有的Oracle12cPDB

下面,我们将克隆同一个CDB中的现有的PDB。为此,在开始克隆前,必须先关闭该PDB,然后以READ ONLY模式打开:

alterpluggable database My_PDB close;

alterpluggable database My_PDB open read only;

createpluggable database My_Clone

fromMy_PDB

file_name_convert= ('/my_pdb', '/my_clone');

alterpluggable database My_PDB close;

alterpluggable database My_PDB open;

alterpluggable database My_Clone open;

10.  从容器数据库(CDB)中拔出可插拔数据库(PDB)

下面,展示如何从cdb1中拔出my_pdb。“into”关键字后必须跟PDB描述的全路径,被该操作以XML格式产生:

alterpluggable database My_PDB

unpluginto '/home/oracle/oradata/cdb1/my_pdb/my_pdb.xml';

“my_pdb.xml“文件确定数据文件的名字和全路径等信息。这些信息在插入操作时会用到。注意:PDB还是其从中拔出的CDB的一部分,只是现在状态变为了拔出(UNPLUGGED)而已。

拔出操作实际上对数据文件做了一些改变,以便记录PDB被正确成功的拔出。因为它还是CDB得一部分,你能给它做一个RMAN备份。这提供了一个归档拔出日志的方便方法。

一旦你备份了它,你就可以把它从字典库里移走——但是,当然,为了今后的插入操作,你必须保留这些数据文件。

droppluggable database My_PDB keep datafiles;

11.  Oracle 12c可插拔数据库——拔插和克隆操作

11.1.  把My_PDB插入cdb2

1)    连接到目标容器数据库,这里是目录/home/oracle/oradata/cdb2下的cdb2

sqlplus sys/pass@localhost:1521/cdb2 as sysdba

2)    然后,确认将要被插入的PDB和新的主容器数据库是兼容的

exec DBMS_PDB.Check_Plug_Compatibility(PDB_Descr_File=>'/home/oracle/oradata/cdb1/my_pdb/my_pdb.xml');

如果不兼容,该过程会报错。

3)     现在,插入PDB。using关键字后必须跟上PDB描述的绝对路径,即,先前拔出操作时产生的.XML文件。

create pluggable database My_PDB

using '/home/oracle/oradata/cdb1/my_pdb/my_pdb.xml'

move

file_name_convert = ('/cdb1/', '/cdb2/');

alter pluggable database My_PDB open;

11.2.  从拔出的PDB克隆创建一个PDB

该例子建议保留一个被拔出的PDB的备份,这会有很多应用场景,例如:

1)    在一个开发部门,允许研发者和测试者快速、重复的提供一个开始;

2)    支持自学;

3)    提供一个交付新应用的方法;

为了演示,假设你已经拔出了MY_PDB1,并把它放在了合适的目录下,并设置为只读。

create pluggable database MY_PDB1 as clone

using

'/home/oracle/oradata/bk_pdbs/my_pdb1/my_pdb1.xml'

copy

file_name_convert =

('/bk_pdbs/my_pdb1/', '/cdb1/my_pdb1/');

alter pluggable database my_pdb1 open;

“as clone”SQL子句确保新的PDB得到一个正确的、全局的唯一标识。然后,你能看到你的GUIDs:

selectPDB_Name, GUID

fromDBA_PDBs

orderby Creation_scn;

注意:PBD被从CBD拔出后以及后来插入另一个CBD,DBA_PDBs.GUID就会一直伴随着它。服务器代码会强制CBD内PDB的唯一性,但并不强制CBD间的唯一性。

11.3.  把一个非CBD库当做PDB插入一个已有的CBD库

这里,我将展示给你如何把12.1前的数据库转变为一个PDB。你共有几个方法做到这点:

1)    可传输表空间/数据泵;

2)    复制;

3)    把原来的非CBD库升级到12c,并把它插入12c CDB;

因为头两个方法曾经都是标准方法,我们这里将只描述最后一个。

注意:不是一个升级步骤就能完成所有任务,它是一个两阶段操作:首先,把你现存的数据库升级为12.1非CDB库;接着,把你的非CDB库插入现存的CDB中——仅仅插入PDB和接着完成一个插入后步骤。

Ø  第一步,先把12.1前的库升级为12c版本;

Ø  第二步,连到非CDB库,以便产生表示文件,正如拔出一个PDB部分所示:

shutdownimmediate

startupmount

alterdatabase open read only;

begin

DBMS_PDB.Describe(PDB_Descr_File=> ‘/home/oracle/oradata/noncdb/noncdb.xml’);

end;

/

shutdownimmediate

Ø  下一步是连接到接收CDB库——cdb2,并用表示文件将非cdb库的数据文件插入。

createpluggable database noncdb_pdb

asclone

using'/home/oracle/oradata/noncdb/noncdb.xml'

source_file_name_convert= none

copy

file_name_convert= ('/noncdb/', '/cdb2/noncdb_pdb/')

storageunlimited;

Ø  现在打开库,最后完成插入,关闭,再打开,把限制状态设置为YES:

alterpluggable database noncdb_pdb open;

alterpluggable database noncdb_pdb close;

alterpluggable database noncdb_pdb open restricted;

Ø  最后,运行一个Oracle提供的SQL*Plus脚本来移去现在本地字典中的数据,因为,在新版本中,定义Oracle系统的元数据仅仅在整个CDB中存储一次。

altersession set container = ExNonCDB;

@?/rdbms/admin/noncdb_to_pdb.sql

Ø  作为最后一步,打开新被接收的先前的非CDB库。

alterpluggable database noncdb_pdb open;

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png