编辑手记:在Oracle12.2 中提供了多种创建PDB的方式,能够更快速便捷地实现数据库的扩展和变更。今天我们来介绍通过SQL*Plus管理的方式。
注:文档内容来自于官方文档翻译,想了解更多信息请参阅官方文档。
1
PDB的创建
在创建PDB之前,需要满足以下条件:
CDB必须存在。
CDB必须处于读/写模式。
操作用户必须是当前CDB root或application container的公共用户。
操作用户必须具有CREATE PLUGGABLE DATABASE的系统特权。
必须为每个容器确定唯一的容器名称。每个容器名称在单个CDB中必须是唯一的,并且每个容器名称在通过特定侦听器访问实例的所有CDB的范围内必须是唯一的。
PDB名称用于区分PDB与CDB中的其他PDB。 PDB名称遵循与服务名称相同的规则,其中包括不区分大小写。
如果要在具有物理standby数据库的Oracle DG配置中创建PDB,则必须在创建PDB之前完成其他任务。
如果要创建包含使用了透明数据加密过的数据的PDB,或者创建启用了数据库保险库的PDB,则会有更多的前提条件
通过SQL*Plus 的方式创建PDB共有以下几种方式。
Creating a PDB Using the Seed
可以使用CREATE PLUGGABLE DATABASE语句在CDB中使用CDB seed的文件创建PDB。
实现过程如下:
还可以使用此语句在application container中使用application seed或CDB seed的文件创建application PDB。
实现过程如下:
两种方式的使用场景:
当application container包含application seed时,并且在application root目录中运行CREATE PLUGGABLE DATABASE语句以从seed创建 application PDB时,将使用应用程序种子application seed 创建 application PDB。 但是,当application container不包含application seed,并且在application root 目录中运行CREATE PLUGGABLE DATABASE语句以从seed 创建 application PDB时,将使用CDB种子(PDB $ SEED)创建 application PDB。
创建步骤
对于CDB root,使用CDB root的文件在CDB中创建PDB;
对于application root,使用application root的文件创建PDB;
对于没有application root的容器,都使用CDB root的文件在CDB中创建PDB
创建PDB后,它处于mount模式,其状态为NEW。 可以通过查询V$ PDBS视图中的OPEN_MODE列来查看PDB的打开模式。 通过查询CDB_PDBS或DBA_PDBS视图的STATUS列来查看PDB的状态。
该过程PDB有一个新的默认服务被创建。该服务与PDB具有相同的名称,可用于访问PDB。 必须为客户端正确配置Oracle Net Services才能访问此服务
必须以read/write模式为Oracle数据库打开新的PDB,以完成新PDB到CDB的集成。 如果尝试在read only模式下打开PDB,则会返回错误。 在read/write模式下打开PDB后,其状态为NORMAL。
只有完成备份才能实现必要的恢复
最简单的创建语法:
CREATE PLUGGABLE DATABASE salespdb ADMIN USER salesadm IDENTIFIED BY password;
预定义PDB管理员的创建语法:
CREATE PLUGGABLE DATABASE salespdb ADMIN USER salesadm IDENTIFIED BY password ROLES=(DBA);
指定存储、表空间、文件位置等相关内容的创建语法:
CREATE PLUGGABLE DATABASE salespdb ADMIN USER salesadm IDENTIFIED BY password
STORAGE (MAXSIZE 2G) DEFAULT TABLESPACE sales DATAFILE '/disk1/oracle/dbs/salespdb/sales01.dbf' SIZE 250M AUTOEXTEND ON
PATH_PREFIX = '/disk1/oracle/dbs/salespdb/'
FILE_NAME_CONVERT = ('/disk1/oracle/dbs/pdbseed/', '/disk1/oracle/dbs/salespdb/');
Creating a PDB by Cloning an Existing PDB or Non-CDB
可以使用CREATE PLUGGABLE DATABASE语句从源PDB或从非CDB克隆PDB。通过克隆,将源PDB或非CDB克隆为新的PDB,并自动将克隆插入CDB。要使用该技术,需要在创建语句中包含有from子句指定源。
源可以是本地CDB中的PDB,远程CDB中的PDB或Non-CDB。 CREATE PLUGGABLE DATABASE语句将与源关联的文件复制到新位置,并将文件与目标PDB关联。 当CDB处于ARCHIVELOG模式和本地撤消模式时,源PDB可以在读/写模式下打开,并在操作期间完全起作用。 因此支持热PDB克隆。
克隆的一个用途是测试。 通过克隆,可以创建一个或多个PDB或Non-CDB,并单独安全地进行测试。 例如,在将application与production PDB一起使用之前,可以在克隆的PDB上测试新的application或修改过的的application。
若源PDB在远程CDB中,必须使用DBlink克隆PDB,在CDB中创建包含克隆的PDB的DBlink。
从包含新PDB的CDB root目录发出CREATE PLUGGABLE DATABASE语句时,必须指定到包含正在FROM子句中克隆PDB的远程CDB的DBlink。 DBlink连接到远程CDB的根目录,或从包含新PDB的CDB连接到远程源PDB。
当源为Non-CDB时,必须在FROM子句中指定指向非CDB的DBlink。
在所有克隆方案(本地,远程和Non-CDB)中,当application root目录是运行CREATE PLUGGABLE DATABASE语句时的当前容器时,将在application container中创建克隆的PDB。 在这种情况下,源PDB的application名称和版本必须与克隆的应用程序名称和应用程序容器的版本相匹配。
如果目标CDB没有具有相同名称的公共用户,则该用户帐户被锁定在目标PDB中。 对于每个锁定的用户,可以选择以下选项处理:
1、关闭PDB,连接到根目录,并创建具有相同名称的公共用户。 当PDB在读/写模式下打开时,共同授予用户的角色和特权的差异将得到解决,可以解锁用户。 在此过程中,本地授予用户的权限和角色保持不变。
2、在PDB中创建新的本地用户,并使用数据泵将锁定的用户数据导出/导入到新的本地用户模式中。
3、保留用户锁定。
4、删除用户。
Creating a PDB by Relocating It
可以使用CREATE PLUGGABLE DATABASE语句将PDB从一个CDB重定位到另一个CDB。必须包括指定PDB的当前位置的FROM子句;包括RELOCATE子句以指定正在移动PDB而不是克隆。在操作完成之后,PDB被添加到PDB被重定位到的CDB。使用这种技术是以最少停机时间重定位PDB的最快方式,被重定位的PDB可以在读/写模式下打开并且在重定位过程期间完全起作用。
第一种情况,在CDB之间relocate PDB。
第二种情况是relocate 一个PDB到application container。
当PDB重新定位时,有以下两个选项:AVAILABILITY MAX和AVAILABILITY NORMAL。使用AVAILABILITY MAX子句将连接从PDB的旧位置重定向到新位置。
也可以通过以下的间接方式将连接从PDB的旧位置重定向到新位置。
如果系统使用Oracle Internet Directory(Oracle的LDAP目录服务),则可以在中央位置更新连接信息,而不是在多个客户端配置文件中更新。
如果在旧位置和新位置为PDB使用相同的侦听器,则在重新定位完成时,新连接将自动路由到PDB的新位置。
如果PDB使用不同的侦听器,并且通过local_listener和remote_listener参数的配置使用它们各自侦听器的交叉注册,则重新定位是无缝的,因为PDB的服务的可用性和位置将被自动注册到侦听器。
第三种情况是从远端CDB relocate PDB。
在这种情况下,运行CREATE PLUGGABLE DATABASE语句时,新PDB所属的root取决于当前容器:
若当前容器是CDB root时,会在CDB根目录中创建新的PDB。
若当前容器是application container的application目录时,新的PDB将作为application PDB创建。
Creating a PDB by Plugging an Unplugged PDB into a CDB
该技术使用描述PDB的XML元文件和相关的数据库文件将PDB插入到CDB中。这些文件可以单独使用,也可以压缩为一个.pdb后缀的文件。如以下两种情况:
第二种情况,将PDB插入到application root。如下图所示:
可以使用CREATE PLUGGABLE DATABASE语句插入PDB,必须包括一个USING子句,指定描述PDB或.pdb归档文件的XML元文件。源CDB是从其拔下PDB的CDB。 目标CDB是要插入PDB的CDB。 源CDB和目标CDB可以是相同的CDB或不同的CDB。
插入步骤如下:
1、登录SQL*Plus,确保当前的容器是目标CDB或者目标application container。
若当前容器是目标CDB root的时候,会创建PDB并插入CDB,若当前容器是application container,则会创建相应的application PDB。
2、执行DBMS_PDB.CHECK_PLUG_COMPATIBILITY包,确保PDB与CDB兼容;
3、如果PDB还未从源CDB拔下,先拔下来。
4、执行 CREATE PLUGGABLE DATABASE包,使用Using语句指定XML元文件、.pdb归档文件及其他相关参数。
5、将新的PDB以read/write模式打开
6、对新的PDB进行备份。
Creating a PDB as a Proxy PDB
代理PDB提供对远程CDB中的另一个PDB的访问。可以使用CREATE PLUGGABLE DATABASE语句通过引用其他PDB来创建代理PDB。
当需要远程PDB的本地上下文环境时,可以使用代理PDB。 另外,当不同CDB中的application container具有相同的application时,它们的application 肉体可以与代理PDB保持同步。
代理PDB创建图解如下:
第二种情况,创建application container中的代理PDB
在创建代理PDB的过程中,始终需要DBlink。创建完成之后,该DBlink不再被使用,代理PDB直接与被引用的PDB通信。
直接通信需要包含引用的PDB的CDB的侦听器的端口号和主机名,默认情况下,代理PDB使用以下值:
侦听器端口号:1521
如果引用的PDB的侦听器不使用默认端口号,则必须使用PORT子句指定侦听器的端口号。 您可以在创建代理PDB时指定端口号,也可以更改代理PDB以更改端口号。
侦听器主机名:包含引用的PDB的CDB的主机名
如果引用的PDB的侦听器不使用默认主机名,则必须使用HOST子句指定侦听器的主机名。 您可以在创建代理PDB时指定主机名,也可以更改代理PDB以更改主机名。
Creating a PDB Using a Non-CDB
使用Non-CDB创建PDB的时候,有以下几种方式:
1、通过创建Non-CDB的库创建PDB
该方法是使用Non-CDB创建PDB的最简单的方法,但它需要将Non-CDB的文件复制到新位置。前提条件是无论是Non-CDB还是将要用于PDB插入的新的CDB,必须是12.1或者更新的版本。
2、使用DBMS_PDB的包创建XML元文件
XML元文件描述Non-CDB的数据库文件,此方法需要比通过克隆Non-CDB创建PDB更多的步骤,但它允许在某些情况下使用Non-CDB创建PDB而不移动Non-CDB文件。
3、使用Oracle DataPump 的导入的导出功能创建PDB。
从一个Non-CDB中导出相关文件,并导入到PDB中,在执行导入时,在用户名后面指定PDB的连接标识符。 例如,如果PDB的连接标识符是hrpdb,则在运行Oracle Data Pump Import实用程序时输入以下内容:
impdp user_name@hrpdb ...
4、通过ogg复制创建PDB
将来自Non-CDB的数据复制到PDB, 当新建的PDB与源Non-CDB同步时,可以故障转移到PDB。
2
将PDB从CDB中拔出
要拔出PDB,需要连接到其CDB root或application root目录,并使用ALTER PLUGGABLE DATABASE语句指定XML文件或.pdb文件。
当指定XML文件(.xml扩展名)时,它将包含有关PDB的元数据,被拔除后, SQL语句创建XML文件,并且它包含在目标CDB上启用CREATE PLUGGABLE DATABASE语句以插入PDB所需的信息。
指定.pdb文件时,它包含描述PDB和PDB使用的文件(例如数据文件和元文件)的XML文件的压缩归档。 .pdb文件允许您将单个压缩文件(而不是多个文件)复制到新位置,以将PDB插入CDB。
该过程图解如下:
第二种情况,从application container中拔出:
必须关闭PDB,然后才能出。 当拔下PDB时,同一CDB中的其他PDB处于mount模式。 拔除操作会在PDB的数据文件中进行一些更改以记录。 因为它仍然是CDB的一部分,所以被拔出的PDB包含在整个CDB的RMAN备份中。以备将来需要时使用。
当然,也可以从CDB中完全删除PDB。 在拔出的PDB上支持的唯一操作是 dropping PDB。如果需要将PDB插回到同一个CDB中, 必须先从CDB中删除该PDB,并且 PDB只有在插入CDB时才可用。
在Drop PDB的过程中,可以使用一下语句指定要不要保留PDB的文件。
1、keep datafiles选项保留PDB的文件
2、Including datafiles则将PDB文件一起从CDB磁盘中删除。
文章转自数据和云公众号,原文链接