在多租户(容器)数据库中如何创建PDB:方法1 从种子创建PDB
基于版本:19c (12.2.0.3) AskScuti
创建方法:从零开始创建一个PDB(从PDB$SEED创建新的PDB)
对应路径:Creating a PDB --> Creating From Scratch
在容器数据库CDB里面如何创建PDB,官方文档给出了一张创建PDB技术选项图,图片如下:

内容总览
1. 概述
2. 使用位置子句创建
2.1 FILE_NAME_CONVERT
2.2 CREATE_FILE_DEST
3. 不使用位置子句创建
3.1 定义传统OMF参数
3.2 定义新参数
1. 概述
使用种子(PDB$SEED)创建新的PDB,过程是把PDB$SEED中的数据文件复制到 CREATE PLUGGABLE DATABASE 语句中定义的目标目录中。如下图:

整体过程为:
1). 从 PDB$SEED 中复制数据文件
2). 创建 SYSTEM 和 SYSAUX 表空间
3). 创建新目标目录,并在根容器中记录元数据进行关联
4). 创建临时表空间 TEMP
5). 创建公共用户 SYS 和 SYSTEM
6). 创建默认服务
2. 使用位置子句创建
所谓使用位置子句的意思就是:在创建的语句中直接指定目标目录。
2.1 FILE_NAME_CONVERT
使用 FILE_NAME_CONVERT 参数,例如:
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb2
SQL> create pluggable database pdb2 admin user henry identified by henry roles=(connect) file_name_convert=('/u01/app/oracle/oradata/CDB1/pdbseed','/u01/app/oracle/oradata/CDB1/pdb2');
查看创建的PDB2
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- --------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
注意:语句中的 roles=(connect)是直接授予了该用户的 create session 系统权限,就是允许连接登陆(connect是角色权限包,里面包含 create session 系统权限)
2.2 CREATE_FILE_DEST
使用 CREATE_FILE_DEST 参数,例如:
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb3 SQL> create pluggable database pdb3 admin user henry identified by henry roles=(connect) create_file_dest='/u01/app/oracle/oradata/CDB1/pdb3';
查看创建的PDB3
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- --------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
5 PDB3 MOUNTED
注意:仔细观察上面两个参数的使用。一个参数指定两个路径(种子路径,新路径),一个参数指定一个路径(新路径)。
如果觉得在语句中指定路径有些麻烦,可以提前定义好相关OMF参数。OMF具体使用在后续博文中,发布后连接更新在此处。现在只需了解OMF(Oracle Managed Files) 就是自动管理文件路径名称和大小的,可以简化用户管理的一种机制。
3. 不使用位置子句创建
如果在创建PDB时不指定路径,则可以使用OMF提前定义好。
3.1 定义传统OMF参数
数据库有个传统的OMF参数:DB_CREATE_FILE_DEST
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb4 SQL> show parameter db_create_file_dest; SQL> alter system set db_create_file_dest='/u01/app/oracle/oradata/CDB1/pdb4'; System altered. SQL> create pluggable database pdb4 admin user henry identified by henry roles=(connect); Pluggable database created.
查看创建的PDB4
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- --------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
5 PDB3 MOUNTED
6 PDB4 MOUNTED
SQL> select name from v$datafile where con_id=6;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5B9ECD51E0530E01A8C0E0DD/datafile
/o1_mf_system_gnz3rh9k_.dbf
/u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5B9ECD51E0530E01A8C0E0DD/datafile
/o1_mf_sysaux_gnz3rh9m_.dbf
/u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5B9ECD51E0530E01A8C0E0DD/datafile
/o1_mf_undotbs1_gnz3rh9n_.dbf
注意:观察 db_create_file_dest 这个参数是如何管理PDB4文件的。另外,如果下次创建PDB,则需要继续改这个参数到新的路径下。
3.2 定义新参数
在12c中,引入了一个新的参数:PDB_FILE_NAME_CONVERT
这个参数的使用其实和 2.1 小节很类似,只不过这个参数是提前定义好的(种子路径,新路径)。
SQL> !mkdir /u01/app/oracle/oradata/CDB1/pdb5 SQL> show parameter pdb_file_name_convert SQL> alter system set pdb_file_name_convert='/u01/app/oracle/oradata/CDB1/pdbseed','/u01/app/oracle/oradata/CDB1/pdb5'; System altered. SQL> create pluggable database pdb5 admin user henry identified by henry roles=(connect); Pluggable database created.
查看创建的PDB5
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- --------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
5 PDB3 MOUNTED
6 PDB4 MOUNTED
7 PDB5 MOUNTED
SQL> select name from v$datafile where con_id=7;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5BA0CD51E0530E01A8C0E0DD/datafile
/o1_mf_system_gnz44ft4_.dbf
/u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5BA0CD51E0530E01A8C0E0DD/datafile
/o1_mf_sysaux_gnz44ft6_.dbf
/u01/app/oracle/oradata/CDB1/pdb4/CDB1/8FCFFACD5BA0CD51E0530E01A8C0E0DD/datafile
/o1_mf_undotbs1_gnz44ft7_.dbf
注意:这里好像有个问题,仔细观察数据文件的路径,我们创建PDB5指定的 pdb_file_name_convert 这个参数好像没用上,路径依然使用的是我们创建PDB4时候的路径。原因是因为 OMF 这个参数 DB_CREATE_FILE_DEST 进行了全局指定,因此也了解到,当这两个参数同时定义的时候,使用的是 DB_CREATE_FILE_DEST。
尝试取消DB_CREATE_FILE_DEST,创建PDB6。
SQL> alter system set DB_CREATE_FILE_DEST=''; System altered. SQL> create pluggable database pdb6 admin user henry identified by henry roles=(connect); Pluggable database created.
查看创建的PDB6
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- --------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
4 PDB2 MOUNTED
5 PDB3 MOUNTED
6 PDB4 MOUNTED
7 PDB5 MOUNTED
8 PDB6 MOUNTED
SQL> select name from v$datafile where con_id=8;
NAME
-----------------------------------------------
/u01/app/oracle/oradata/CDB1/pdb5/system01.dbf
/u01/app/oracle/oradata/CDB1/pdb5/sysaux01.dbf
/u01/app/oracle/oradata/CDB1/pdb5/undotbs01.dbf
这时候,用上了我们创建的 pdb5 文件路径。
在多租户(容器)数据库中如何创建PDB:方法1 从种子创建PDB的更多相关文章
- oracle12之 多租户容器数据库架构
解读: 这张幻灯片展示了三个被部署的应用程序的整合 三个不同的非cdbs成为一个单一的.幻灯片中的图形显示了一个多租户 容器数据库有四个容器:根和三个可插入的数据库.每一个 可插入数据库有它自己的专用 ...
- 使用JDBC从数据库中查询数据的方法
* ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...
- Ext.net中Combobox如何绑定数据库中的值-通用方法
今天在项目中再次碰到了问题,就是Combobox中的值如果是直接绑定很简单.简单添加项就行了.代码如下: <ext:ComboBox ID=" /> </Items> ...
- 由浅入深讲解数据库中Synonym的使用方法
1.Synonym的概念 Synonym(同义词)是SQL Server 2005的新特性.推出已经有几年的时间了.我们可以简单的理解Synonym为其他表的别名.本文中使用Northwind数据库为 ...
- 各个数据库中top 的表示方法
Select Top在不同数据库中的使用用法: 1. Oracle数据库 SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. Infomix数据库 SELECT FI ...
- 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据
package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...
- 数据库中substring的使用方法 CONVERT(varchar(12) , getdate(), 112 )
Sqlserver中经常要操作一些时间类型的字段转换,我又不太记得住,所以搜集了以下的一些SqlserverConvertDateTime相关的资料发表在自己的小站里,方便自己以后要用的时候寻找,望对 ...
- php写入数据到mysql数据库中出现乱码解决方法
乱码情况: 在选择数据库前加入一句代码即可 mysql_query("set names utf8"); 最后效果
- [EntityFramework]记录Linq中如何比较数据库中Timestamp列的方法(如大于0x00000000000007D1的记录)
Timestamp对于EF实体的类型是byte[] class Program { static void Main(string[] args) { using (var context = new ...
随机推荐
- opencv —— src.at<Vec3b>(i, j)[0]、src.at<uchar>(i, j)、src.ptr<uchar>(i) 访问图像的单个像素
动态地址访问像素:src.at<Vec3b>(i, j)[0].src.at<uchar>(i, j) int b = src.at<Vec3b>(i, j)[0 ...
- SpringBoot从1.5.1→2.2.4项目加包扫雷一:Error:(8, 44) java: 程序包org.springframework.boot.web.support不存在
更换成新包即可import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
- NodeJS_0001:关于install的方式
最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用比较混乱.其实博主在这之前对这两个参数的理解也是模糊的,各种查资料和实践后对它们之间的异同 ...
- DataReader类型化数据读取与装箱性能研究
前言 在各种ORM框架或者SQL映射框架(例如MyBatis,SOD框架之SQL-MAP功能)中,都有将查询的结果映射为内存对象的需求,包括映射到实体类.简单类型(例如Java的POJO,.NET的P ...
- 博客前端live2D实现
1.本来以为没那么简单,结果看了大佬的https://www.cnblogs.com/liuzhou1/p/10813828.html#4431992的简单明了.效果如下,可随鼠标移动. ①这里添加在 ...
- AGC001 E - BBQ Hard [组合数]
这题就是要求 \(\sum_{i=1}^{n} \sum_{j=i+1}^{n} C(a_i+a_j+b_i+b_j,a_i+a_j)\) 考虑搞一搞,\(C(a_i+a_j+b_i+b_j,a_i+ ...
- 与第三方系统对接,生成Cloud出入库单据
案例: Cloud的采购订单同步到第三方系统,第三方系统入库后同步生成Cloud采购入库单. 解决方案:调用采购订单的下推API,先生成保存状态的采购入库单(采购入库单中的仓库是必填项,可以在采购订单 ...
- equals 为什么要把常量写在前面?
看例子 使用str1.equals("abc"); 如果str1是null,空是没有equals方法的,会抛出空指针异常 如果"abc".equals(str1 ...
- Android 基础知识 -- BroadcastReceiver
BroadcastReceiver 广播,是一种事件传递机制,可以跨应用进行事件传递(系统级). 在使用广播的时候,不宜添加过多的逻辑或者耗时(广播内不允许开辟线程)操作,超过10秒,导致ANR 1 ...
- jQuery---创建和添加节点
创建和添加节点 //创建jq对象 var $li = $('<a href="http://web.itcast.cn" target="_blank"& ...