文章目录

  • 多租户构型
  • 多租户概念
  • 数据字典视图
  • 多租户的驱动程序
  • CDB和根容器
    • # 会话切换
  • PDB:可插入容器
  • 设置可插拔数据库
  • 在多租户容器数据库中进行交互
  • 创建容器数据库
    • 使用DBCA创建CDB
    • 使用SQL*Plus创建CDB
    • # 练习:创建容器数据库
  • 创建可插入容器
    • # 练习:从种子中创建一个可插入数据库
    • # 练习:把一个PDB克隆到另一个PDB
    • 把非CDB插入CDB
      • 本地
      • 问题:没有执行noncdb_to_pdb.sql
      • 远程
    • 把拔出的PDB插入PDB
    • 拔出并删除PDB
  • 把12.1版本以前的非CDB数据库迁移到CDB
  • 建立到CDB、PDB的连接
    • 理解CDB和PDB服务名
    • 为CDB或PDB创建服务
    • 在CDB中切换连接
  • 启动关闭CDB、PDB
    • CDB实例的启动
    • 打开和关闭PDB
      • # 使用ALTER PLUGGABLE DATABASE命令
    • 自动启动PDB
  • EM
  • 表空间的体系结构
  • 用户管理
    • # 练习:管理公共、本地用户和角色

多租户构型

多租户概念

Oracle多租户环境包含一个容器数据库(CDB)和一个或多个可插入数据库(PDB)。容器是一组表空间,对外则表示为一个逻辑数据库。

CDB创建后,将包含至少两个容器。

  1. 根容器(CDB$ROOT)是环境的管理容器。一般来说,只有DBA会连接到根容器。
  2. 种子容器(PDB$SEED)是一个已提供的只读容器,可以复制,以创建可插入容器(名字随意)。

要点

  • 有一个数据库CDB
  • 有一个数据库实例、一个系统全局区(SGA)和一组后台进程
  • PDB只不过是一组表空间和一个服务
  • PDB服务通过数据库侦听器提供给用户
  • 连接到一个PDB服务时,会话的范围就仅限于与PDB相关联的表空间
  • 根容器中定义的对象可以由所有PDB共享、访问
  • PDB中定义的对象(包括用户)是PDB私有的
  • 每个PDB都有自己的数据字典,定义其本地对象,其指针指向在根容器的数据字典中定义的共享对象

可插入数据库是一组表空间,包括SYSTEM表空间和数据字典。这个数据字典定义容器的本地对象,即用户及其模式对象(例如表)。连接到容器时执行的所有PL/SQL、SELECT、DML、DDL命令只影响这些本地对象。

当连接到根容器时,查询所有容器的数据字典,就可以(如果有适当的权限)看到整个图像。在根容器中,可以创建用户和角色,它们会传播到所有容器。然而,这些用户在任何一个容器中拥有的特权可以是不同的。

使用Oracle多租户与其他选项时,要考虑一些事项:

  • 所有容器都必须使用相同的字符集。这时候一个自然的限制,因为只有一个数据库CDB
  • 必须在CDB级别配置Data Guard,因为只有一个重做流。然而,可以排除裴勇数据库中的一些PDB

    注意,从12.1.0.2版本之后才实现这个功能

  • Database Vault 必须在每个PDB中单独配置。在PDB之间没有重叠的领域
  • 【未列举完,待续…】

数据字典视图

SQL> show pdbsCON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           MOUNTED

CDB中表空间的唯一标识符不是它的名字,而是用容器ID限定的名字。

SQL> select con_id, name, tablespace_name from v$containers join cdb_tablespaces using(con_id) order by con_id;CON_ID NAME                                                                             TABLESPACE_NAME
---------- -------------------------------------------------------------------------------- ------------------------------1 CDB$ROOT                                                                         SYSTEM1 CDB$ROOT                                                                         USERS1 CDB$ROOT                                                                         SYSAUX1 CDB$ROOT                                                                         UNDOTBS11 CDB$ROOT                                                                         TEMP3 PDB1                                                                             SYSTEM3 PDB1                                                                             SYSAUX3 PDB1                                                                             USERS3 PDB1                                                                             TEMP3 PDB1                                                                             UNDOTBS110 rows selected

V$PDBSV$CONTAINS相同,但它去掉了指向根容器的行

多租户的驱动程序

Oracle Multitenant(multi-tenant 多租户)选项主要用于服务器整合。

在非CDB环境中,每个数据库实例都有自己的SGA、后台进程和数据字典。他们可能有自己的Oracle Home,或者运行在不同的机器上。这是一个潜在的重大开销。


创建一个CDB,把每个数据库运行为一个可插入容器,将节省资源:只有一个后台进程、一个SGA(通常是远小于各个SGA的总和)、许多数据字典的一个副本,以及一个Oracle Home。CDB体系结构支持共享这些资源,节省了资源。


当合并服务器时,不应该要求应用程序做出更改,每个先前孤立的数据库都应该完全独立与其他数据库,这是至关重要的。如果这些条件不能满足,整合操作所需的资源可能超过它节省了的资源。Oracle多租户体系结构保证不需要更改应用程序,以前独立的应用程序完全彼此独立。最终用户和开发人员无法确定数据库已从非CDB数据库转换为可插入的容器。维护各种应用程序管理员和用户之间的职责分离;此外,很大程度上,每个PDB可以有自己的DBA,像非CDB那样管理。

或许最重要的是工作负载的管理。许多经验丰富的DBA喜欢管理一个大的数据库,而不是许多小数据库。这与一个问题相关:打补丁和升级。

  • 打补丁和升级(此后称为更新)会修改运行Oracle实例或数据字典(或两个)的二进制文件。如果一个更新只影响二进制文件(不定的最简单形式),那么Oracle多租户会大大减少工作量;

    修补一个运行CDB的Oracle Home,实际上会修补其中所有PDB。

  • 如果更新包括修改数据字典的脚本,通常就不需要在PDB中进行处理

    然而,有时并非如此。
    共享对象在根容器中定义,用指针指向每一个可插入容器中的共享对象。如果这些引用需要更新,就会自动进行。

  • 在最坏的情况下(如重大升级),PDB中的对象可能失效。在这种情况下,他们必须重新编译。这可以手工完成,或者在用户会话访问对象时完成。

在所有情况下,Oracle保证,进行任何形式的更新,都不会使之前有效的用户处于不可逆转的状态。

重要的数据字典结构在根容器中只定义一次,这就提供了一个非常快捷、简单的升级方法。考虑下面情况:一个CDB是12.1.0.1版本,包含了许多PDB。为了应用12.1.0.2不定集,DBA可以在同一台机器上安装新的Oracle Home,创建CDB的一个新版本12.1.0.2。然后DBA可以从旧12.1.0.1 CDB上拔掉PDB,将其插入新的12.1.0.2 CDB。该操作所设计的停机时间可能是每个PDB不到十分钟。根据DBA和用户方便的时间表,可以单独移动PDB。插入和拔出的技术将在第32章详细讨论。

CDB和根容器

CDB是数据库,由实例安装和打开。根容器(CDB$ROOT)是管理共享资源的容器。其中主要组件如下:

  • 控制文件 ctl
  • 撤销表空间 undo
  • 重做日志 redo
  • 实例SGA和后台进程 sga
  • 数据字典 meta data
  • 公共用户和角色

根容器将有至少四个表空间:SYSTEMSYSAUXUNDOTEMP

SQL> select con_id, name, tablespace_name from v$containers join cdb_tablespaces using(con_id) order by con_id;CON_ID NAME                                                                             TABLESPACE_NAME
---------- -------------------------------------------------------------------------------- ------------------------------1 CDB$ROOT                                                                         SYSTEM1 CDB$ROOT                                                                         USERS1 CDB$ROOT                                                                         SYSAUX1 CDB$ROOT                                                                         UNDOTBS11 CDB$ROOT                                                                         TEMP3 PDB1                                                                             SYSTEM3 PDB1                                                                             SYSAUX3 PDB1                                                                             USERS3 PDB1                                                                             TEMP3 PDB1                                                                             UNDOTBS110 rows selected

它还有传播到所有PDB的公共用户和角色,并拥有Oracle提供的、每个PDB都需要的所有对象。这些对象报包括(例如)所提供的所有PL/SQL包。影响这些共享资源的操作只能通过一个连接到根容器的会话来实现。

# 会话切换

根容器是唯一一个可以不通过数据库侦听器来连接的容器。如果登录到服务器,把ORACLE_SID环境变量设置为CDB实例的名字,就可以连接到根容器。不能以这种方式连接到PDB,因为只有一个实例,只有一个名字。

连接根容器后,可以将会话移动到另一个容器。(如下)

[oracle@oracle ~]$ cat .bash_profile_cdb
export ORACLE_SID=cdb[oracle@oracle ~]$ sqlplus /  as sysdba ;SQL*Plus: Release 12.2.0.1.0 Production on Tue May 18 09:15:12 2021Copyright (c) 1982, 2016, Oracle.  All rights reserved.Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionSQL> show con_name;CON_NAME
------------------------------
CDB$ROOTSQL> show pdbsCON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           MOUNTEDSQL> alter session set container=pdb1;
ERROR:
ORA-01089: immediate shutdown or close in progress - no operations are
permitted
Process ID: 14608
Session ID: 13 Serial number: 64280SQL> show pdbs ;CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           READ WRITE NOSQL> alter session set container=pdb1;Session altered.SQL> show con_name;CON_NAME
------------------------------
PDB1

PDB:可插入容器

PDB有一个像非CDB一样的SYSTEM表空间。只有针对PDB的用户元数据存储在PDB的SYSTEM表空间中。除外,还有对根容器中定义的公共对象的逻辑链接。PDB中的对象名字与非CDB或CDB相同,如OBJ$TAB$SOURCE$

因此,PDB似乎是作为独立数据库的引用程序。一般规则(也有少数例外)是,PDB中引用程序的DBA不知道可能有一个或多个其他PDB共享CDB中的资源。

每一个PDB容器有一个独特的容器ID号和容器名。这些记录在控制文件中,通过视图V$CONTAINSV$PDBS显示出来。当连接到一个可插入容器时,会过滤掉没有引用当前容器的行。

当然,在根容器中,所有的容器都是可见的

SQL> select con_id, name, tablespace_name from v$containers join cdb_tablespaces using(con_id) order by con_id;CON_ID NAME                                                                             TABLESPACE_NAME
---------- -------------------------------------------------------------------------------- ------------------------------1 CDB$ROOT                                                                         SYSTEM1 CDB$ROOT                                                                         USERS1 CDB$ROOT                                                                         SYSAUX1 CDB$ROOT                                                                         UNDOTBS11 CDB$ROOT                                                                         TEMP3 PDB1                                                                             SYSTEM3 PDB1                                                                             SYSAUX3 PDB1                                                                             USERS3 PDB1                                                                             TEMP3 PDB1                                                                             UNDOTBS110 rows selected

V$PDBSV$CONTAINS相同,但它去掉了指向根容器的行

设置可插拔数据库

配置容器有如下4种方法

  1. PDB$SEED中创建新的PDB
    这个方法创建一个新的PDB,其中只包含SYSTEMSYSAUXTEMP表空间。
    这通常用于新的应用程序实现。

  2. 从非CDB中创建一个新的PDB
    该方法使用一个现有的数据库(它必须是版本12.x),将它转换成一个可插入容器,再插入CDB中。
    这通常是整合过程的一部分。
    不可能转换回CDB。

  3. 把一个PDB克隆为新的PDB
    源可以是相同的或不同的CDB。
    该方法可以用于从生产PDB中创建测试或开发环境

  4. 插入一个拔出的PDB
    PDB可以从CDB中拔出,然后插入相同或不同的CDB。这可以用于重新定位或升级PDB

在多租户容器数据库中进行交互

数据库部署为非CDB数据库时,经常有必要在它们之间共享数据。这通常需要使用数据库链接(DBLink)来访问其他数据库中的表。

把它们作为PDB配置到相同的CDB后,可以使用相同的方法。但是由于两个PDB中的对象驻留在相同的容器中,因此可以创建数据库链接的快速版本(称为快速 intra-DBA链接)。通常,数据库链接使用传输控制协议。在Oracle多租户环境下,可以使用IPC优化数据库链接通信。

记住,一个PDB不知道另一个PDB或非CDB数据库驻留在什么地方,所以不管这两个数据库驻留在什么地方,数据库链接的定义和使用都是相同的。所有应用程序用户都使用链接作为容器之间唯一的交流方式。

在根容器内部,可以查询所有PDB中的对象,但只能在严格控制的方式下查询。普通用户可以在根容器中定义,并传播到所有容器。如果每个容器(包括根容器)中的这个用户拥有相同定义的表或视图或同义词,就可以在select语句中使用contains子句,从根容器开始查询这个对象的所有副本。

SQL> show user
USER is "SYS"
SQL> show con_nameCON_NAME
------------------------------
CDB$ROOT
SQL>  select con_id, name, dummy from containers(sys.dual) natural join v$containers ;CON_ID NAME                                                                             DUMMY
---------- -------------------------------------------------------------------------------- -----3 PDB1                                                                             X1 CDB$ROOT                                                                         X

参考:https://www.pianshen.com/article/11401826988/
在最新版本的 Oracle Database 12.1.0.2 中,新特性提供了 PDB Containers 子句,用以从 CDB$ROOT 层面直接聚合查询多个 PDB 中同一张表的数据。在新特性文档中该段如下描述:

创建容器数据库

创建数据库之后,不可能将非CDB转换成CDB,反过来也不行。

容器数据库和实例区别于非CDB的两个属性必须在创建时指定,以后永远不能更改。这些属性是实例中的内存结构(用实例参数ENABLE_PLUGGABLE_DATABASE=TRUE启动实例时启用该属性)和控制文件结构(在CREATEDATABASE命令中添加ENABLE PLUGGABLE DATABASE子句,来启用该属性)。当创建非CDB时,最简单的方法无疑是使用数据库创建助理(Database Creation Assistant,DBCA)

使用DBCA创建CDB



[oracle@oracle ~]$ export ORACLE_SID=cdb2f
[oracle@oracle ~]$ sqlplus / as sysdbaSQL*Plus: Release 12.2.0.1.0 Production on Tue May 18 17:14:37 2021Copyright (c) 1982, 2016, Oracle.  All rights reserved.Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionSQL> show pdbs ;CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           READ WRITE NO
SQL> show con_nameCON_NAME
------------------------------
CDB$ROOT
SQL>

使用SQL*Plus创建CDB

CDB与非CDB的区别是内存结构和物理结构。要启用必要的内存结构,应该把参数ENABLE_PLUGGABLE_DATABASE设置为TRUE,启动一个实例。然后在CREATE DATABASE命令中,包括ENABLE PLUGGABLE DATABASE,在控制文件和数据字典中创建必要的基于磁盘的结构。

其他实例参数和关键字可以为种子容器数据文件指定名称,也可以由Oracle托管文件(OMF)机制自动生成。在启用OMF的情况下启动实例,会自动在DB_CREATE_FILE_DEST参数指定的任何目录或ASM磁盘组下创建所有文件名。这适用于根容器、种子容器和所有后续可插入容器的数据文件。另外,指定PDB_FILE_NAME_CONVERT参数,会重新映射给根容器指定的名称,生成种子和可插入容器的名称。这个参数包括配对的字符串,带有隐式通配符的后缀和前缀。考虑下面设置:

pdb_file_name_convert='/u01/oradata/cdba', '/u02/oradata/seed'

如果CDB的根容器在目录/u01/oradata/cdba下有用于SYSTEM或SYSAUX或TEMP的文件,那么种子容器在/u02/oradata/seed中创建其文件。此外,也可以在CREATE DATABASE命令中指定这些。

create database cdba
logfile
group 1 ('/u01/my/oradata/cdba/redo1a.log') size 50m,
group 2 ('/u01/my/oradata/cdba/redo2a.log') size 50m
datafile '/u01/my/oradata/cdba/system01.dbf' size 500m
sysaux datafile '/u01/my/oradata/cdba/sysaux01.dbf' size 500m
default temporary tablespace temp tempfile '/u01/my/oradata/cdba/temp01.dbf' size 500m
undo tablespace undotbs datafile '/u01/my/oradata/cdba/undotbs01.dbf' size 500m
enable pluggable database
seed file_name_convert=('cdba', 'seed') ;

# 练习:创建容器数据库

创建一个简单的参数文件initcdba.ora

[oracle@oracle ~]$ whoami
oracle
[oracle@oracle ~]$ echo $ORACLE_HOME
/u01/app/oracle/product/12.2.0/db_1
[oracle@oracle ~]$ vim $ORACLE_HOME/dbs/initcdba.ora
control_files='/u01/my/oradata/cdba/control.ctl'
db_name=cdba
memory_target=1g
enable_pluggable_database=true

启动CDBA实例(nomount)

[oracle@oracle ~]$ export ORACLE_SID=cdba
[oracle@oracle ~]$ echo $ORACLE_SID
cdba
[oracle@oracle ~]$ sqlplus / as sysdbaSQL*Plus: Release 12.2.0.1.0 Production on Tue May 18 13:52:23 2021Copyright (c) 1982, 2016, Oracle.  All rights reserved.Connected to an idle instance.SQL> create spfile from pfile ;File created.SQL> startup nomount;
ORACLE instance started.Total System Global Area 1073741824 bytes
Fixed Size                  8801008 bytes
Variable Size             692061456 bytes
Database Buffers          364904448 bytes
Redo Buffers                7974912 bytes

创建根容器和种子容器的目录

mkdir -p /u01/my/oradata/cdba
mkdir /u01/my/oradata/seed

创建容器数据库

/*
注意所有文件都显式命名,并根据环境进行调整。
*/
create database cdba
logfile
group 1 ('/u01/my/oradata/cdba/redo1a.log') size 50m,
group 2 ('/u01/my/oradata/cdba/redo2a.log') size 50m
datafile '/u01/my/oradata/cdba/system01.dbf' size 500m
sysaux datafile '/u01/my/oradata/cdba/sysaux01.dbf' size 500m
default temporary tablespace temp tempfile '/u01/my/oradata/cdba/temp01.dbf' size 500m
undo tablespace undotbs datafile '/u01/my/oradata/cdba/undotbs01.dbf' size 500m
enable pluggable database
seed file_name_convert=('cdba', 'seed') ;

运行脚本CATALOG.SQL和CATPROC.SQL,创建数据字典和提供的包。在CDB环境中,在SQL*Plus会话中运行SQL脚本不像在非CDB数据库中那么简单。它们必须通过提供的Perl脚本调用,从一个操作系统提示行上运行,以了解CDB的本质,并可以在根容器和种子容器中创建对象。

$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -b catalog $ORACLE_HOME/rdbms/admin/catalog.sql
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -b catproc $ORACLE_HOME/rdbms/admin/catproc.sql

检查CDB的物理结构

select name, cdb from v$database;
select name, con_id, open_mode from v$containers;
select con_id, name from v$datafile;
select con_id, name from v$tempfile;
select * from v$controlfile; select con_id, member from v$logfile;
select sys_context('userenv', 'con_name') from dual;
show con_name;

注意
在生成种子容器的文件名时,转换了根容器的文件名,控制文件和日志文件(不像数据文件和临时文件)与任何一个容器都不相关。

/*
sed 's#ORACLE_SID=.*#ORACLE_SID=cdb1#' /home/oracle/.bash_profile
## i 插入修改
sed -i 's#ORACLE_SID=.*#ORACLE_SID=cdb1#' /home/oracle/.bash_profile## 创建密码文件?
orapwd file=$ORACLE_HOME/dbs/orapwcdb1 password=oracle force=y format=12
*/

用DBCA创建一个CDB

创建可插入容器

有以下4种技术可创建可插入数据库

  1. 克隆种子容器
  2. 克隆已有PDB
  3. 插入以前拔出的PDB
  4. 插入一个非CDB数据库

# 练习:从种子中创建一个可插入数据库

每个容器数据库都有一个只读的种子数据库容器PDB$SEED,用于快速创建一个新的可插入数据库。从PDB$SEED中创建爱你一个新的PDB时,不管是使用SQL*Plus、SQL Developer还是Enterprise Manager Cloud Control 12c,都会发生以下事情。每一步都是用CREATE PLUGGABLE DATABASE语句手动或通过DBCA执行的:

  • PDB$SEED中的数据文件复制到PDB中
  • 创建本地版本的SYSTEM、SYSAUX和TEMP表空间
  • 初始化本地元数据目录(指针指向根容器中的公共只读对象)
  • 创建公共用户(包括SYS和SYSTEM)
  • 创建一个本地用户,授予当地PDB_DBA角色

    这是PDB管理员,用于创建PDB。

  • 为PDB创建一个默认服务,用侦听注册

这些步骤创建和移动的数据相对较少,所以PDB的创建很快。为新PDB生成的文件名取决于环境。最简单的方法是启用OMF。如果出于某种原因不能完成,PDB_FILE_NAME_CONVERT实例参数(包含配对的字符串)可以从种子PDB的数据文件名称中生成新的名称。作为最后的手段,文件名映射或完全限定的文件名可以在CREATE PLUGGABLE DATABASE命令中指定。


假设CDB名为cdba
ORACLE_SID=cdba

以SYS的身份连接根容器,启用OMF

sqlplus / as sysdba
alter system set db_create_file_dest='/u01/my/omf/oradata';

使用管理用户pdba_admin创建一个名为pdba的PDB

create pluggable database pdba admin user pdba_admin identified by pdba_admin;
select con_id, name, open_mode from v$pdbs;
select con_id, name, open_mode from v$containers;
select con_id, pdb_id, pdb_name, status from cdb_pdbs;
select con_id, file_name from cdb_data_files;
select con_id, name from v$datafile;

打开新的PDB

alter pluggable database pdba open ;
select con_id, name, open_mode from v$containers;
select con_id, pdb_id, pdb_name, status from cdb_pdbs;

注意,用数据库侦听注册服务,它包含一个用于根容器的服务和一个用于PDB的服务

lsnrctl status

# 练习:把一个PDB克隆到另一个PDB

如果需要一个已有数据库类似的新数据库,可以克隆CDB中的一个现有数据库。新的PDB与源PDB相同,只有PDB名字不同。

这个练习克隆之前创建的容器CDB中的PDB1

[oracle@oracle seed]$ export ORACLE_SID=cdb
[oracle@oracle seed]$ sqlplus / as sysdbaSQL*Plus: Release 12.2.0.1.0 Production on Tue May 18 15:53:24 2021Copyright (c) 1982, 2016, Oracle.  All rights reserved.Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionSQL> show pdbs ;CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           READ WRITE NO4 PDB2                           READ WRITE NO
SQL> show con_idCON_ID
------------------------------
1
SQL> show con_nameCON_NAME
------------------------------
CDB$ROOT
SQL>

以只读模式打开PDB1

alter pluggable database pdb1 close immediate;
alter pluggable database pdb1 open read only ;

进行克隆,使用OMF生成文件名(使用file_name_convert

SQL> SQL> create pluggable database pdb3 from pdb1 ;
create pluggable database pdb3 from pdb1*
ERROR at line 1:
ORA-65016: FILE_NAME_CONVERT must be specifiedSQL> create pluggable database pdb3 from pdb1 file_name_convert=('pdb1', 'pdb3');Pluggable database created.

打开两个PDB

SQL> show pdbsCON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           READ ONLY  NO4 PDB2                           READ WRITE NO5 PDB3                           MOUNTED
SQL> alter pluggable database pdb3 open ;
SQL> alter pluggable database pdb1 close ;
SQL> alter pluggable database pdb1 open ;
SQL> select con_id, name, open_mode from v$containers; CON_ID NAME                                                                             OPEN_MODE
---------- -------------------------------------------------------------------------------- ----------1 CDB$ROOT                                                                         READ WRITE2 PDB$SEED                                                                         READ ONLY3 PDB1                                                                             READ WRITE4 PDB2                                                                             READ WRITE5 PDB3                                                                             READ WRITE

把非CDB插入CDB

如果有一个12c以前版本的数据库,就必须先把它升级到12c,或者使用Data Pump移动该数据库。

[oracle@oracle ~]$ sqlplus / as sysdbaSQL*Plus: Release 12.2.0.1.0 Production on Tue May 18 16:39:57 2021Copyright (c) 1982, 2016, Oracle.  All rights reserved.Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionSQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.SQL> startup mount;
ORACLE instance started.Total System Global Area 2801795072 bytes
Fixed Size                  8624648 bytes
Variable Size             738199032 bytes
Database Buffers         2046820352 bytes
Redo Buffers                8151040 bytes
Database mounted.
SQL> alter database open read only ;Database altered.SQL> exec dbms_pdb.describe('/tmp/rptqa12c.xml');PL/SQL procedure successfully completed.

文件包含的信息描述了数据库的数据文件,安装了哪些组件,以及某些重要的实例参数。

注意
撤销表空间、控制文件、重做日志会被丢弃

[oracle@oracle ~]$ cat /tmp/rptqa12c.xml
<?xml version="1.0" encoding="UTF-8"?>
<PDB><xmlversion>1</xmlversion><pdbname>orcl</pdbname><cid>0</cid><byteorder>1</byteorder><vsn>203424000</vsn><vsns><vsnnum>12.2.0.1.0</vsnnum><cdbcompt>12.2.0.0.0</cdbcompt><pdbcompt>12.2.0.0.0</pdbcompt><vsnlibnum>0.0.0.0.24</vsnlibnum><vsnsql>24</vsnsql><vsnbsv>8.0.0.0.0</vsnbsv></vsns><dbid>1588245314</dbid><ncdb2pdb>1</ncdb2pdb><cdbid>1588245314</cdbid><guid>B79B65C80EC72748E055000000000001</guid><uscnbas>2989622</uscnbas><uscnwrp>0</uscnwrp><undoscn>7</undoscn><rdba>4194824</rdba><tablespace><name>SYSTEM</name><type>0</type><tsn>0</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>8</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/system01.dbf</path><afn>1</afn><rfn>1</rfn><createscnbas>7</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>104960</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><fdbid>1588245314</fdbid><fcpsb>2989621</fcpsb><fcpsw>0</fcpsw><frlsb>1408558</frlsb><frlsw>0</frlsw><frlt>1060464587</frlt><autoext>1</autoext><maxsize>4194302</maxsize><incsize>1280</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><tablespace><name>SYSAUX</name><type>0</type><tsn>1</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>8</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/sysaux01.dbf</path><afn>3</afn><rfn>3</rfn><createscnbas>4665</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>116480</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><fdbid>1588245314</fdbid><fcpsb>2989621</fcpsb><fcpsw>0</fcpsw><frlsb>1408558</frlsb><frlsw>0</frlsw><frlt>1060464587</frlt><autoext>1</autoext><maxsize>4194302</maxsize><incsize>1280</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><tablespace><name>UNDOTBS1</name><type>2</type><tsn>2</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>8</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/undotbs01.dbf</path><afn>4</afn><rfn>4</rfn><createscnbas>1406609</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>13440</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><fdbid>1588245314</fdbid><fcpsb>2989621</fcpsb><fcpsw>0</fcpsw><frlsb>1408558</frlsb><frlsw>0</frlsw><frlt>1060464587</frlt><autoext>1</autoext><maxsize>4194302</maxsize><incsize>640</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><tablespace><name>TEMP</name><type>1</type><tsn>3</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>128</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/temp01.dbf</path><afn>1</afn><rfn>1</rfn><createscnbas>1408627</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>4096</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><autoext>1</autoext><maxsize>4194302</maxsize><incsize>80</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><tablespace><name>USERS</name><type>0</type><tsn>4</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>8</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/users01.dbf</path><afn>7</afn><rfn>7</rfn><createscnbas>29999</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>640</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><fdbid>1588245314</fdbid><fcpsb>2989621</fcpsb><fcpsw>0</fcpsw><frlsb>1408558</frlsb><frlsw>0</frlsw><frlt>1060464587</frlt><autoext>1</autoext><maxsize>4194302</maxsize><incsize>160</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><tablespace><name>USER_TEST</name><type>0</type><tsn>6</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>8</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/user_test.dbf</path><afn>5</afn><rfn>5</rfn><createscnbas>1746238</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>131072</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><fdbid>1588245314</fdbid><fcpsb>2989621</fcpsb><fcpsw>0</fcpsw><frlsb>1408558</frlsb><frlsw>0</frlsw><frlt>1060464587</frlt><autoext>0</autoext><maxsize>0</maxsize><incsize>0</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><tablespace><name>FDA</name><type>0</type><tsn>7</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>8</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/fda1.dbf</path><afn>2</afn><rfn>2</rfn><createscnbas>2212276</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>40432</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><fdbid>1588245314</fdbid><fcpsb>2989621</fcpsb><fcpsw>0</fcpsw><frlsb>1408558</frlsb><frlsw>0</frlsw><frlt>1060464587</frlt><autoext>0</autoext><maxsize>0</maxsize><incsize>0</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><tablespace><name>DXMY</name><type>0</type><tsn>8</tsn><status>1</status><issft>0</issft><isnft>0</isnft><encts>0</encts><flags>0</flags><bmunitsize>8</bmunitsize><file><path>/u01/app/oracle/oradata/orcl/df/ORCL/datafile/o1_mf_dxmy_j9vnk5lz_.dbf</path><afn>8</afn><rfn>8</rfn><createscnbas>2312724</createscnbas><createscnwrp>0</createscnwrp><status>1</status><fileblocks>12800</fileblocks><blocksize>8192</blocksize><vsn>203423744</vsn><fdbid>1588245314</fdbid><fcpsb>2989621</fcpsb><fcpsw>0</fcpsw><frlsb>1408558</frlsb><frlsw>0</frlsw><frlt>1060464587</frlt><autoext>1</autoext><maxsize>4194302</maxsize><incsize>12800</incsize><plugscn>0</plugscn><plugafn>0</plugafn><plugdbid>0</plugdbid></file></tablespace><recover>0</recover><optional><ncdb2pdb>1</ncdb2pdb><csid>873</csid><ncsid>2000</ncsid><options><option>APS=12.2.0.1.0</option><option>CATALOG=12.2.0.1.0</option><option>CATJAVA=12.2.0.1.0</option><option>CATPROC=12.2.0.1.0</option><option>CONTEXT=12.2.0.1.0</option><option>DV=12.2.0.1.0</option><option>JAVAVM=12.2.0.1.0</option><option>OLS=12.2.0.1.0</option><option>ORDIM=12.2.0.1.0</option><option>OWM=12.2.0.1.0</option><option>SDO=12.2.0.1.0</option><option>XDB=12.2.0.1.0</option><option>XML=12.2.0.1.0</option><option>XOQ=12.2.0.1.0</option></options><olsoid>0</olsoid><dv>0</dv><APEX>NULL</APEX><parameters><parameter>processes=300</parameter><parameter>nls_language='AMERICAN'</parameter><parameter>nls_territory='AMERICA'</parameter><parameter>sga_target=2801795072</parameter><parameter>db_block_size=8192</parameter><parameter>db_cache_size=33554432</parameter><parameter>compatible='12.2.0'</parameter><parameter>open_cursors=300</parameter><parameter>pga_aggregate_target=931135488</parameter><parameter>enable_ddl_logging=TRUE</parameter></parameters><sqlpatches/><tzvers><tzver>primary version:26</tzver><tzver>secondary version:0</tzver></tzvers><walletkey>0</walletkey><services><service>SYS$BACKGROUND,</service><service>SYS$USERS,</service><service>orclXDB,orclXDB</service><service>orcl,orcl</service></services><opatches/><hasclob>1</hasclob><awr/><hardvsnchk>0</hardvsnchk><localundo>1</localundo><apps/><dbedition>8</dbedition><ver122010>1</ver122010></optional>
</PDB>
[oracle@oracle ~]$

注意
导出xml后,不能开启数据库可写。因为后面移植数据文件时,会检查SID。若与xml记录的不一样,会报错

FILE_NAME_CONVERT=(
'orcl', 'orclme',
'/u01/app/oracle/oradata/orcl/df/ORCL/datafile/o1_mf_dxmy_j9vnk5lz_.dbf', '/u01/app/oracle/oradata/orcl/j9vnk5lz.dbf'
);create pluggable database pdb4orcl using '/tmp/rptqa12c.xml'
*
ERROR at line 1:
ORA-65139: Mismatch between XML metadata file and data file
/u01/app/oracle/oradata/orcl/system01.dbf for value of fcpsb (2936313 in the
plug XML file, 2936316 in the data file)

本地

如果现有的非CDB数据库与目的地CDB在同一台机器上,就连接到容器数据库,并导入生成的xml

create pluggable database rptqa12c using '/tmp/rptqa12c.xml';
SQL> create pluggable database rptqa12c using '/tmp/rptqa12c.xml';create pluggable database rptqa12c using '/tmp/rptqa12c.xml'*
ERROR at line 1:
ORA-65018: FILE_NAME_CONVERT or NOCOPY must be specified/*
解决方法
1. 设置FILE_NAME_CONVERT
2. 设置OMF目录
3. 若确保文件已在目标位置,设置NOCOPY
*/
SQL> create pluggable database rptqa12c using '/tmp/rptqa12c.xml' FILE_NAME_CONVERT=('orcl', 'orclme');
create pluggable database rptqa12c using '/tmp/rptqa12c.xml' FILE_NAME_CONVERT=('orcl', 'orclme')
*
ERROR at line 1:
ORA-01276: Cannot add file
/u01/app/oracle/oradata/orclme/df/ORCL/datafile/o1_mf_dxmy_j9vnk5lz_.dbf.  File
has an Oracle Managed Files file name./*
这里omf的原因,一个数据文件要改名字Oracle Managed File对迁移DATA以及OCR的影响 http://blog.itpub.net/69975956/viewspace-2704564/
*/
SQL> create pluggable database rptqa12c using '/tmp/rptqa12c.xml'
FILE_NAME_CONVERT=(
'orcl', 'cdb/orcl',
'/u01/app/oracle/oradata/orcl/df/ORCL/datafile/', '/u01/app/oracle/oradata/cdb/orcl/'
);  2    3    4    5
create pluggable database rptqa12c using '/tmp/rptqa12c.xml'
*
ERROR at line 1:
ORA-01276: Cannot add file
/u01/app/oracle/oradata/cdb/orcl/o1_mf_dxmy_j9vnk5lz_.dbf.  File has an Oracle
Managed Files file name.SQL> create pluggable database rptqa12c using '/tmp/rptqa12c.xml'
FILE_NAME_CONVERT=(
'orcl', 'cdb/orcl',
'/u01/app/oracle/oradata/orcl/df/ORCL/datafile/o1_mf_dxmy_j9vnk5lz_.dbf', '/u01/app/oracle/oradata/cdb/orcl/o1_mf_dxmy_j9vnk5lz_topdb.dbf'
);Pluggable database created.

问题:没有执行noncdb_to_pdb.sql

参考:当要打开PDB时为何会有Warning: PDB altered with errors.

SQL>  alter pluggable database pdb4orcl  open ;Warning: PDB altered with errors.SQL> show pdbsCON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           READ WRITE NO4 PDB4ORCL                       READ WRITE YES
SQL> select CAUSE,CON_ID,MESSAGE from pdb_plug_in_violations;CAUSE                                                                CON_ID
---------------------------------------------------------------- ----------
MESSAGE
--------------------------------------------------------------------------------
Parameter                                                                 1
CDB parameter processes mismatch: Previous 300 Current 200Parameter                                                                 1
CDB parameter sga_target mismatch: Previous 2672M Current 3GParameter                                                                 1
CDB parameter db_cache_size mismatch: Previous 32M Current 0CAUSE                                                                CON_ID
---------------------------------------------------------------- ----------
MESSAGE
--------------------------------------------------------------------------------
Parameter                                                                 1
CDB parameter pga_aggregate_target mismatch: Previous 888M Current 100MParameter                                                                 1
CDB parameter enable_ddl_logging mismatch: Previous TRUE Current FALSENon-CDB to PDB                                                            4
PDB plugged in is a non-CDB, requires noncdb_to_pdb.sql be run.6 rows selected.

远程

在许多情况下,有必要将非CDB的数据文件和xml文件转移到正在运行的DB的机器上。
没有问题。
编辑xml文件,考虑文件和目录名称的变化,之后运行CREATE PLUGGABLE DATABASE命令

插入操作可能需要一两分钟。需要一些最后的清理和配置工作,之后流可以使用插入的数据库了。脚本noncdb_to_pdb.sql清理在多租户环境o能够不必要的元数据。另外,还必须像克隆操作那样,打开新插入的数据库。

SQL>alter session set container=rptqa12c;
SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
...
SQL>alter pluggable database rptqa12c open read write;

把拔出的PDB插入PDB

在任何给定的时间,都可能有几个拔出的数据库。拔出的数据库无法在CDB的外部打开,所以可能会在某一刻把拔出的数据库(PDB)插入CDB。

假设PDB CCREPOS目前是拔出的,它的XML文件位于服务的/tmp/ccrepos.xml
以具备ALTER PLUGGABLE DATABASE权限的公共用户身份连接

create pluggable database ccrepos using '/tmp/ccrepos.xml' nocopy;
alter pluggable database ccrepost open read write;

注意
在插回CDB之前,PDB必须删除,而不仅仅从CDB中拔出。
如果PDB的数据文件已经在正确的位置上,使用NOCOPY选项可以节省时间。

拔出并删除PDB

PDB天生是高度可移动的,所以可以将其移至同一或另一服务器上的CDB上。可以只是拔出它,让它无法供用户使用。也可以拔出它,完全删除它。或许最重要的是,可以升级它:即在某个补丁级别上从CDB中拔出它,再在更高的补丁级别上把它插回CDB。这是以最少的停机时间升级的一种方式。

alter pluggable database ccrepos close ;
alter pluggable database ccrepos unplug into '/tmp/ccrepos.xml';

这个例子生成xml文件相当于DBMS_PDB.DESCRIBE过程生成的xml。可以以同样的方式使用它,将PDB插入其他CDB。

删除PDB时,对PDB的所有引用都从CDB的控制文件中删除。默认情况下,会保留数据文件,因此,如果之前拔出了PDB,就可以使用XML文件,把PDB插回相同的CDB或另一个CDB。也可以使用including datafiles把物理文件也删除了。

alter pluggable database qa_2014 close;
drop pluggable database qa_2014 including datafiles;

把12.1版本以前的非CDB数据库迁移到CDB

把Oracle Database 12c 非CDB转换为PDB快速而简单,但是,如果数据库是以前的版本,如11g或10g,有两种方法:

  1. 升级
  2. Data Pump

如果应用程序对数据库的版本不敏感或依赖数据库的版本,最干净的选择就是把非CDB就地升级到版本12c(12.1.0.1或更高版本),然后使用本章前面提到的方法把它插入CDB(非CDB插入到CDB)。此方法的优点是,不需要像其他两种方法那样,给迁移分配额外的空间,该方法还非常快捷。

要使用Data Pump方法,需要像在非CDB环境中一样,使用Data Pump导出/导入。从CDB的种子数据库中创建一个新的PDB,调整初始化参数,以匹配现有数据库的对应参数。这种方法的一个优势在于,可以保留当前的非CDB,以保证在删除原始数据库前,与Oracle Database 12c兼容。它还允许执行平台迁移,或从文件系统存储移动到ASM存储,作为整合的一部分。但是,如果数据库很大,这可能需要一些时间。

建立到CDB、PDB的连接

连接到PDB或CDB与连接到非CDB非常相似。可以通过

  1. 操作系统身份认证或公共用户SYS连接到CDB
  2. 使用服务名称连接到CDB或CDB中的一个PDB

服务名称通过EasyConnect字符串引用,或者在一个tnsnames.ora条目中引用。

默认情况下,要为每个新的、克隆的或插入的PDB创建一个服务名称。如果在环境中是不够的,就使用DBMS_SERVICE或者srvctl实用程序为PDB创建额外的服务。

理解CDB和PDB服务名

EasyConnect连接字符串的格式如下:

<username>/<password>@<hostname>:<port_number>/<service_name>

如要连接oel63服务器上名为CDB01的CDB中名为DW17的PDB中的用户RJB

sqlplus rjb/rjb@oel63:1521/dw17

PDB的服务名称遮蔽了CDB或其中其他PDB的存在。

为CDB或PDB创建服务

【未完P794】

在CDB中切换连接

alter session set container=qatest1;

启动关闭CDB、PDB

CDB最终是单个数据库实例,每个PDB都共享CDB实例的资源。这个可以预料到的,因为每个PDB使用每个表中的CON_ID列与所有其他PDB逻辑分开,CON_ID列在根和每个PDB之间共享。这个逻辑分区也扩展到用户账户和安全上,因此,对于非公共用户来说,似乎PDB有自己专用的实例。

可以想像,在Real Application Cluster(RAC)环境中,CDB通常在群集中的每个节点上有一个实例。PDB服务可以在实例之间进行故障转移。

因为CDB是一个数据库实例,所以关闭CDB时,任何运行在CDB上的代码都会关闭或断开连接。这意味着在启动并显式打开(DBA手工打开或通过触发器打开)之前,PDB不对用户开放。同样,关闭CDB实例时,PDB也会关闭。


CDB实例的启动

CDB和PDB在多租户环境中的五个状态

  1. PDB OPEN
    PDBs Opened RW, Except Seed in RO
  2. OPEN
    root Opened
    PDBs Still Mounted, Except Seed in RO
  3. MOUNT
    CDB Control Files Opened for the Instance
    root Mounted
    PDBs Mounted
  4. NOMOUNT
    Instance Started
  5. SHUTDOWN

cdb

# startup
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.Total System Global Area  838860800 bytes
Fixed Size                  8798312 bytes
Variable Size             369102744 bytes
Database Buffers          452984832 bytes
Redo Buffers                7974912 bytes
SQL> alter database mount;Database altered.SQL> alter database open ;Database altered.SQL> select name from v$database ;NAME
---------
CDBSQL> show pdbsCON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           MOUNTED/*
注意:这时候已经有pdb实例,且被监听了
*/
[oracle@oracle ~]$ lsnrctl statusLSNRCTL for Linux: Version 12.2.0.1.0 - Production on 18-MAY-2021 09:13:53Copyright (c) 1991, 2016, Oracle.  All rights reserved.Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.lawsssscat.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                18-MAY-2021 02:06:28
Uptime                    0 days 7 hr. 7 min. 27 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/12.2.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/oracle/listener/alert/log.xml
Listening Endpoints Summary...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle.lawsssscat.com)(PORT=1521)))(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "c25d2a541b9b031ae055000000000001" has 1 instance(s).Instance "cdb", status READY, has 1 handler(s) for this service...
Service "cdb" has 1 instance(s).Instance "cdb", status READY, has 1 handler(s) for this service...
Service "cdbXDB" has 1 instance(s).Instance "cdb", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).Instance "orcl", status READY, has 1 handler(s) for this service...
Service "pdb1" has 1 instance(s).Instance "cdb", status READY, has 1 handler(s) for this service...
The command completed successfully

一旦打开CDB(换句话说,可以使用根的数据文件、全局临时表空间和联机重做日志文件),就装载PDB,但尚未开放给用户。除非PDB通过触发器或Oracle Restart打开,它仍默认为MOUNTED状态。

打开和关闭PDB

一旦打开了CDB的根容器(CDB$ROOT),就可以对CDB中的PDB执行所需的所有操作,包括:(但不限于)

  1. 克隆PDB
  2. 从种子中创建新的PDB
  3. 拔出PDB
  4. 插入以前拔出的PDB

记住
在打开CDB$ROOT时,种子容器PDB$SEED总是打开的,但OPEN_MODE是READ ONLY

打开或关闭PDB时,有相当多的选择。以SYSDBA或SYSOPER身份连接时,可以使用ALTER PLUGGABLE DATABASE。如果SYSDBA身份在PDB内部连接,就可以使用相同的命令,而无须指定PDB的名字。除外,使用ALL或EXCEPT ALL选项可以选择性地打开或关闭一个或多个PDB。

# 使用ALTER PLUGGABLE DATABASE命令

通过指定PDB名称,可以打开或关闭任何容器中的PDB;或者,可以改变特定PDB的会话上下文,在该PDB上执行多个操作,而无须限定他。无论当前的容器是什么,都可以通过显示地指定PDB的名字,打开和关闭任何PDB。

pdb

# cdb中
alter pluggable database pdb open ;alter pluggable database pdb close;# 启动所有pdb
alter pluggable database all open ;######################################
-----------------------------------------
######################################[oracle@oracle ~]$ sqlplus /  as sysdba ;SQL*Plus: Release 12.2.0.1.0 Production on Tue May 18 09:15:12 2021Copyright (c) 1982, 2016, Oracle.  All rights reserved.Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionSQL> show con_name;CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs ;CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           READ WRITE NOSQL> alter pluggable database pdb1 close immediate;Pluggable database altered.SQL> show pdbsCON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------2 PDB$SEED                       READ ONLY  NO3 PDB1                           MOUNTED

自动启动PDB

新选项可用于多租户环境的数据库事件触发器。其中一个触发器是持久的,而其他两个就不是了。

默认情况下,CDB实例启动后,CDB内的所有PDB都出于MOUNT模式。

注意
在默认情况下,PDB在CDB启动后关闭。然而,12.1.0.2版本允许指示Oracle保留PDB的状态,这样,如果PDB在关闭CDB时是打开的,它就是在CDB启动时仍是打开的。

如果PDB没有通过其他方式(如Oracle Restart)自动打开,就可以创建一个数据库触发器,启动所有PDB,或一个PDB。

create trigger open_dev after startup on database
beginexecute immediate 'alter pluggable database dev2015 open';
end

AFTER STARTUP ON DATABASE触发器是持久 的,除非删除或禁用它。Oracle Database 12c中两个新的数据库时间触发器——AFTER CLONEBEFORE CLONE更有活力。这两个触发器必须用ON PLUGGABLE DATABASE指定;否则,触发器就是无效的,不会触发。

在测试或开发环境中,给经常克隆的PDB使用触发器,如AFTER CLONE。触发器本身存在于源PDB中,并一直保留下去,除非显式地删除了它。然而,当通过克隆包含这个触发器的现有PDB,来创建一个新的PDB时,可以在克隆后,在克隆的PDB中执行一次性的初始化任务。一旦完成了这些任务,就删除触发器,这样已克隆的数据库的任何副本就不会执行这些初始化任务。

EM

exec dbms_xdb_config.setHTTPSPort(8089);
exec dbms_xdb_config.setHTTPPort(8090);

拔出、插入

表空间的体系结构

表空间的唯一标识符是用容器号限定的表空间名。几个PDB具有相同名称的表空间是没有问题的。实际上,每个PDB都有SYSTEM表空间(存储PDB中定义的对象定义)和SYSAUX表空间(包含Oracle定义的对象,如Automatic Workload Repository(AWR),AWR可以在每个PDB中独立配置和填充)。当然,数据文件必须有唯一的名称,但它们仍然只关联一个PDB,只能在该PDB内部管理。

select con_id, c.name, t.name, d.name d from v$containers c
join v$tablespace t using(con_id)
join v$datafile d using(con_id, ts#)
order by 1, 2, 3;SQL> select con_id, c.name, t.name, d.name d from v$containers c2  join v$tablespace t using(con_id)3  join v$datafile d using(con_id, ts#)4  order by 1, 2, 3;CON_ID NAME                                                                             NAME                           D
---------- -------------------------------------------------------------------------------- ------------------------------ --------------------------------------------------------------------------------1 CDB$ROOT                                                                         SYSAUX                         /u01/app/oracle/oradata/cdb/sysaux01.dbf1 CDB$ROOT                                                                         SYSTEM                         /u01/app/oracle/oradata/cdb/system01.dbf1 CDB$ROOT                                                                         UNDOTBS1                       /u01/app/oracle/oradata/cdb/undotbs01.dbf1 CDB$ROOT                                                                         USERS                          /u01/app/oracle/oradata/cdb/users01.dbf2 PDB$SEED                                                                         SYSAUX                         /u01/app/oracle/oradata/cdb/pdbseed/sysaux01.dbf2 PDB$SEED                                                                         SYSTEM                         /u01/app/oracle/oradata/cdb/pdbseed/system01.dbf2 PDB$SEED                                                                         UNDOTBS1                       /u01/app/oracle/oradata/cdb/pdbseed/undotbs01.dbf3 PDB1                                                                             SYSAUX                         /u01/app/oracle/oradata/cdb/pdb1/sysaux01.dbf3 PDB1                                                                             SYSTEM                         /u01/app/oracle/oradata/cdb/pdb1/system01.dbf3 PDB1                                                                             UNDOTBS1                       /u01/app/oracle/oradata/cdb/pdb1/undotbs01.dbf3 PDB1                                                                             USERS                          /u01/app/oracle/oradata/cdb/pdb1/users01.dbf11 rows selected

在多住户环境中,对空间管理的唯一主要改进是,可以为每个PDB设定一个空间预算,换句话说,就是构成容器的所有数据文件和临时文件的总大小的限制。要限制容器的总体规模,应连接到PDB,执行如下命令:

alter pluggable database jw5 storage(maxsize 500g);

如果试图添加数量文件或扩展现有数据文件,但使总和超过了限制值,就会失败。

用户管理

像系统和对象权限一样,角色在多租户环境中的工作方式与非CDB环境相同。公共角色使用与非公共用户相同的约定,也以C##开头,公共角色可以在所有容器中有相同的权限,或者在一个容器子集中有特定的权限或没有权限。使用CONTAINER子句指定角色的上下文。

# 练习:管理公共、本地用户和角色

运行查询,确定存在什么用户

conn sys/123321@cdb1select con_id, username, common, oracle_maintained from cdb_users order by 1,2;
select con_id, username, common, oracle_maintained from cdb_users order by 2,1;
SQL> select con_id, username, common, oracle_maintained from cdb_users order by 1,2;CON_ID USERNAME                                                                         COMMON ORACLE_MAINTAINED
---------- -------------------------------------------------------------------------------- ------ -----------------1 ANONYMOUS                                                                        YES    Y1 APPQOSSYS                                                                        YES    Y1 AUDSYS                                                                           YES    Y1 CTXSYS                                                                           YES    Y1 DBSFWUSER                                                                        YES    Y1 DBSNMP                                                                           YES    Y1 DIP                                                                              YES    Y1 DVF                                                                              YES    Y1 DVSYS                                                                            YES    Y1 GGSYS                                                                            YES    Y1 GSMADMIN_INTERNAL                                                                YES    Y1 GSMCATUSER                                                                       YES    Y1 GSMUSER                                                                          YES    Y1 LBACSYS                                                                          YES    Y1 MDDATA                                                                           YES    Y1 MDSYS                                                                            YES    Y1 OJVMSYS                                                                          YES    Y1 OLAPSYS                                                                          YES    Y1 ORACLE_OCM                                                                       YES    Y1 ORDDATA                                                                          YES    YCON_ID USERNAME                                                                         COMMON ORACLE_MAINTAINED
---------- -------------------------------------------------------------------------------- ------ -----------------1 ORDPLUGINS                                                                       YES    Y1 ORDSYS                                                                           YES    Y1 OUTLN                                                                            YES    Y1 REMOTE_SCHEDULER_AGENT                                                           YES    Y1 SI_INFORMTN_SCHEMA                                                               YES    Y1 SPATIAL_CSW_ADMIN_USR                                                            YES    Y1 SYS                                                                              YES    Y1 SYS$UMF                                                                          YES    Y1 SYSBACKUP                                                                        YES    Y1 SYSDG                                                                            YES    Y1 SYSKM                                                                            YES    Y1 SYSRAC                                                                           YES    Y1 SYSTEM                                                                           YES    Y1 WMSYS                                                                            YES    Y1 XDB                                                                              YES    Y1 XS$NULL                                                                          YES    Y36 rows selected

在根容器中创建用户,赋予一个公共角色

conn sys/123321@cdb1
create user user1 identified by 123321;
create user c##user1 identified by 123321;
show parameter common_user_prefix;
create user c##user2 identified by 123321 container=all;
grant dba to c##user1;
grant dba to c##user2 container=all;
SQL> create user user1 identified by 123321;
create user user1 identified by 123321ORA-65096: 公用用户名或角色名无效SQL> create user c##user1 identified by 123321;User createdSQL> show parameter common_user_prefix;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix                   string      C##SQL> create user c##user2 identified by 123321 container=all;User created/*
在根容器有dba特权、但在任何PDB中都没有特权
*/
SQL> grant dba to c##user1;Grant succeededSQL> grant dba to c##user2 container=all;Grant succeeded

以一个新建的公共用户身份进行连接

conn c##user1/123321@192.168.56.101:1521/cdb;
conn c##user1/123321@192.168.56.101:1521/pdb1;
conn c##user2/123321@192.168.56.101:1521/pdb1;
SQL> conn c##user1/123321@192.168.56.101:1521/cdb;
Connected./*
在根容器有dba特权、但在任何PDB中都没有特权
*/
SQL> conn c##user1/123321@192.168.56.101:1521/pdb1;
ERROR:
ORA-01045: user C##USER1 lacks CREATE SESSION privilege; logon deniedWarning: You are no longer connected to ORACLE.
SQL> conn c##user2/123321@192.168.56.101:1521/pdb1;Connected.
SQL>

创建一个本地用户

conn c##user2/123321@192.168.56.101:1521/pdb1;
create user locala identified by 123321 container=current;
grant dba to locala ;
connect locala/123321@192.168.56.101:1521/pdb1;
select con_id, username, common, oracle_maintained from cdb_users order by 1,2;
SQL> conn c##user2/123321@192.168.56.101:1521/pdb1;
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
Connected as c##user2@192.168.56.101:1521/pdb1SQL> create user locala identified by 123321 container=current;User createdSQL> grant dba to locala ;Grant succeededSQL> connect locala/123321@192.168.56.101:1521/pdb1;
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
Connected as locala@192.168.56.101:1521/pdb1SQL> select con_id, username, common, oracle_maintained from cdb_users order by 1,2;CON_ID USERNAME                                                                         COMMON ORACLE_MAINTAINED
---------- -------------------------------------------------------------------------------- ------ -----------------3 ADMIN_PDB1                                                                       NO     N3 ANONYMOUS                                                                        YES    Y3 APPQOSSYS                                                                        YES    Y3 AUDSYS                                                                           YES    Y3 C##USER1                                                                         YES    N3 C##USER2                                                                         YES    N3 CTXSYS                                                                           YES    Y3 DBSFWUSER                                                                        YES    Y3 DBSNMP                                                                           YES    Y3 DIP                                                                              YES    Y3 DVF                                                                              YES    Y3 DVSYS                                                                            YES    Y3 GGSYS                                                                            YES    Y3 GSMADMIN_INTERNAL                                                                YES    Y3 GSMCATUSER                                                                       YES    Y3 GSMUSER                                                                          YES    Y3 LBACSYS                                                                          YES    Y3 LOCALA                                                                           NO     N3 MDDATA                                                                           YES    Y3 MDSYS                                                                            YES    YCON_ID USERNAME                                                                         COMMON ORACLE_MAINTAINED
---------- -------------------------------------------------------------------------------- ------ -----------------3 OJVMSYS                                                                          YES    Y3 OLAPSYS                                                                          YES    Y3 ORACLE_OCM                                                                       YES    Y3 ORDDATA                                                                          YES    Y3 ORDPLUGINS                                                                       YES    Y3 ORDSYS                                                                           YES    Y3 OUTLN                                                                            YES    Y3 REMOTE_SCHEDULER_AGENT                                                           YES    Y3 SI_INFORMTN_SCHEMA                                                               YES    Y3 SPATIAL_CSW_ADMIN_USR                                                            YES    Y3 SYS                                                                              YES    Y3 SYS$UMF                                                                          YES    Y3 SYSBACKUP                                                                        YES    Y3 SYSDG                                                                            YES    Y3 SYSKM                                                                            YES    Y3 SYSRAC                                                                           YES    Y3 SYSTEM                                                                           YES    Y3 WMSYS                                                                            YES    Y3 XDB                                                                              YES    Y3 XS$NULL                                                                          YES    Y40 rows selected

使用公共和本地角色

只有公共角色才能在根容器中创建,它们通常可以公共或在本地授予权限。尝试在根容器中创建本地角色,或在特定的PDB中把它授予一个用户,就会失败

conn system/123321@192.168.56.101:1521/cdb
select role, common, oracle_maintained, con_id from cdb_roles order by role;
create role c##myrole1 container=current;
create role c##myrole1 container=all;
create role c##myrole2 container=all;
grant c##myrole1 to c##user2 container=all;
grant c##myrole2 to c##user2 container=PDB1;conn system/123321@192.168.56.101:1521/pdb1
grant c##myrole2 to c##user2 container=current;conn system/123321@192.168.56.101:1521/cdb
select grantee, granted_role, common, con_id from cdb_role_privs where grantee like 'C##%' order by 1,2,3;conn c##user2/123321@192.168.56.101:1521/pdb1
select * from session_roles;
# 完整
SQL> conn system/123321@192.168.56.101:1521/cdb as sysdba
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
Connected as sys@192.168.56.101:1521/cdb AS SYSDBASQL> select role, common, oracle_maintained, con_id from cdb_roles order by role;ROLE                                                                             COMMON ORACLE_MAINTAINED     CON_ID
-------------------------------------------------------------------------------- ------ ----------------- ----------
ADM_PARALLEL_EXECUTE_TASK                                                        YES    Y                          1
APPLICATION_TRACE_VIEWER                                                         YES    Y                          1
AQ_ADMINISTRATOR_ROLE                                                            YES    Y                          1
AQ_USER_ROLE                                                                     YES    Y                          1
AUDIT_ADMIN                                                                      YES    Y                          1
AUDIT_VIEWER                                                                     YES    Y                          1
AUTHENTICATEDUSER                                                                YES    Y                          1
CAPTURE_ADMIN                                                                    YES    Y                          1
CDB_DBA                                                                          YES    Y                          1
CONNECT                                                                          YES    Y                          1
CSW_USR_ROLE                                                                     YES    Y                          1
CTXAPP                                                                           YES    Y                          1
DATAPATCH_ROLE                                                                   YES    Y                          1
DATAPUMP_EXP_FULL_DATABASE                                                       YES    Y                          1
DATAPUMP_IMP_FULL_DATABASE                                                       YES    Y                          1
DBA                                                                              YES    Y                          1
DBFS_ROLE                                                                        YES    Y                          1
DBJAVASCRIPT                                                                     YES    Y                          1
DBMS_MDX_INTERNAL                                                                YES    Y                          1
DV_ACCTMGR                                                                       YES    Y                          1ROLE                                                                             COMMON ORACLE_MAINTAINED     CON_ID
-------------------------------------------------------------------------------- ------ ----------------- ----------
DV_ADMIN                                                                         YES    Y                          1
DV_AUDIT_CLEANUP                                                                 YES    Y                          1
DV_DATAPUMP_NETWORK_LINK                                                         YES    Y                          1
DV_GOLDENGATE_ADMIN                                                              YES    Y                          1
DV_GOLDENGATE_REDO_ACCESS                                                        YES    Y                          1
DV_MONITOR                                                                       YES    Y                          1
DV_OWNER                                                                         YES    Y                          1
DV_PATCH_ADMIN                                                                   YES    Y                          1
DV_POLICY_OWNER                                                                  YES    Y                          1
DV_PUBLIC                                                                        YES    Y                          1
DV_REALM_OWNER                                                                   YES    Y                          1
DV_REALM_RESOURCE                                                                YES    Y                          1
DV_SECANALYST                                                                    YES    Y                          1
DV_STREAMS_ADMIN                                                                 YES    Y                          1
DV_XSTREAM_ADMIN                                                                 YES    Y                          1
EJBCLIENT                                                                        YES    Y                          1
EM_EXPRESS_ALL                                                                   YES    Y                          1
EM_EXPRESS_BASIC                                                                 YES    Y                          1
EXECUTE_CATALOG_ROLE                                                             YES    Y                          1
EXP_FULL_DATABASE                                                                YES    Y                          1
GATHER_SYSTEM_STATISTICS                                                         YES    Y                          1ROLE                                                                             COMMON ORACLE_MAINTAINED     CON_ID
-------------------------------------------------------------------------------- ------ ----------------- ----------
GDS_CATALOG_SELECT                                                               YES    Y                          1
GGSYS_ROLE                                                                       YES    Y                          1
GLOBAL_AQ_USER_ROLE                                                              YES    Y                          1
GSMADMIN_ROLE                                                                    YES    Y                          1
GSMUSER_ROLE                                                                     YES    Y                          1
GSM_POOLADMIN_ROLE                                                               YES    Y                          1
HS_ADMIN_EXECUTE_ROLE                                                            YES    Y                          1
HS_ADMIN_ROLE                                                                    YES    Y                          1
HS_ADMIN_SELECT_ROLE                                                             YES    Y                          1
IMP_FULL_DATABASE                                                                YES    Y                          1
JAVADEBUGPRIV                                                                    YES    Y                          1
JAVAIDPRIV                                                                       YES    Y                          1
JAVASYSPRIV                                                                      YES    Y                          1
JAVAUSERPRIV                                                                     YES    Y                          1
JAVA_ADMIN                                                                       YES    Y                          1
JAVA_DEPLOY                                                                      YES    Y                          1
JMXSERVER                                                                        YES    Y                          1
LBAC_DBA                                                                         YES    Y                          1
LOGSTDBY_ADMINISTRATOR                                                           YES    Y                          1
OEM_ADVISOR                                                                      YES    Y                          1
OEM_MONITOR                                                                      YES    Y                          1ROLE                                                                             COMMON ORACLE_MAINTAINED     CON_ID
-------------------------------------------------------------------------------- ------ ----------------- ----------
OLAP_DBA                                                                         YES    Y                          1
OLAP_USER                                                                        YES    Y                          1
OLAP_XS_ADMIN                                                                    YES    Y                          1
OPTIMIZER_PROCESSING_RATE                                                        YES    Y                          1
ORDADMIN                                                                         YES    Y                          1
PDB_DBA                                                                          YES    Y                          1
PROVISIONER                                                                      YES    Y                          1
RDFCTX_ADMIN                                                                     YES    Y                          1
RECOVERY_CATALOG_OWNER                                                           YES    Y                          1
RECOVERY_CATALOG_OWNER_VPD                                                       YES    Y                          1
RECOVERY_CATALOG_USER                                                            YES    Y                          1
RESOURCE                                                                         YES    Y                          1
SCHEDULER_ADMIN                                                                  YES    Y                          1
SELECT_CATALOG_ROLE                                                              YES    Y                          1
SODA_APP                                                                         YES    Y                          1
SPATIAL_CSW_ADMIN                                                                YES    Y                          1
SYSUMF_ROLE                                                                      YES    Y                          1
WM_ADMIN_ROLE                                                                    YES    Y                          1
XDBADMIN                                                                         YES    Y                          1
XDB_SET_INVOKER                                                                  YES    Y                          1
XDB_WEBSERVICES                                                                  YES    Y                          1ROLE                                                                             COMMON ORACLE_MAINTAINED     CON_ID
-------------------------------------------------------------------------------- ------ ----------------- ----------
XDB_WEBSERVICES_OVER_HTTP                                                        YES    Y                          1
XDB_WEBSERVICES_WITH_PUBLIC                                                      YES    Y                          1
XS_CACHE_ADMIN                                                                   YES    Y                          1
XS_CONNECT                                                                       YES    Y                          1
XS_NAMESPACE_ADMIN                                                               YES    Y                          1
XS_SESSION_ADMIN                                                                 YES    Y                          189 rows selectedSQL> create role c##myrole1 container=current;
create role c##myrole1 container=currentORA-65094: 本地用户名或角色名无效SQL> create role c##myrole1 container=all;Role createdSQL> create role c##myrole2 container=all;Role createdSQL> grant c##myrole1 to c##user2 container=all;Grant succeededSQL> grant c##myrole1 to c##user2 container=pdb1;
grant c##myrole1 to c##user2 container=pdb1ORA-65013: CONTAINER 子句无效SQL>
SQL> conn system/123321@192.168.56.101:1521/pdb1
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
Connected as system@192.168.56.101:1521/pdb1SQL> grant c##myrole2 to c##user2 container=current;Grant succeededSQL> conn system/123321@192.168.56.101:1521/cdb
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
Connected as system@192.168.56.101:1521/cdbSQL> select grantee, granted_role, common, con_id from cdb_role_privs where grantee like 'C##%' order by 1,2,3;GRANTEE                                                                          GRANTED_ROLE                                                                     COMMON     CON_ID
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------ ----------
C##USER1                                                                         DBA                                                                              NO              1
C##USER2                                                                         C##MYROLE1                                                                       YES             1
C##USER2                                                                         C##MYROLE1                                                                       YES             3
C##USER2                                                                         C##MYROLE2                                                                       NO              3
C##USER2                                                                         DBA                                                                              YES             1
C##USER2                                                                         DBA                                                                              YES             36 rows selectedSQL> conn c##user2/123321@192.168.56.101:1521/pdb1
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
Connected as c##user2@192.168.56.101:1521/pdb1SQL> select * from session_roles;ROLE
--------------------------------------------------------------------------------
DBA
SELECT_CATALOG_ROLE
EXECUTE_CATALOG_ROLE
CAPTURE_ADMIN
EXP_FULL_DATABASE
IMP_FULL_DATABASE
DATAPUMP_EXP_FULL_DATABASE
DATAPUMP_IMP_FULL_DATABASE
GATHER_SYSTEM_STATISTICS
OPTIMIZER_PROCESSING_RATE
EM_EXPRESS_BASIC
EM_EXPRESS_ALL
SCHEDULER_ADMIN
HS_ADMIN_SELECT_ROLE
HS_ADMIN_EXECUTE_ROLE
XDBADMIN
XDB_SET_INVOKER
WM_ADMIN_ROLE
JAVA_ADMIN
JAVA_DEPLOYROLE
--------------------------------------------------------------------------------
OLAP_XS_ADMIN
OLAP_DBA
C##MYROLE1
C##MYROLE224 rows selectedSQL>


参考:

  1. 《OCA/OCP认证考试指南全册(第3版)》清华大学出版社

Oracle - 5.0 - 【学习笔记】for ocp 12c、多租户(CDB、PDB)相关推荐

  1. mysql5.0镜像_Mysql5.0学习笔记(一)

    Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...

  2. Zabbx6.0(学习笔记)

    Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...

  3. oracle model 分组,oracle model子句学习笔记例 解析

    学习 东方醉仙 的 "oracle model子句学习笔记例",并记之 总看model子句 SELECT PRODUCT, COUNTRY, YEAR, WEEKS, RECEIP ...

  4. flink1.12.0学习笔记第2篇-流批一体API

    flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...

  5. CCC3.0学习笔记_认证和隐私保护

    CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...

  6. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  7. 《TP5.0学习笔记---配置篇》

    TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...

  8. Tensorflow2.0学习笔记(一)

    Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...

  9. Tensorflow2.0学习笔记(二)

    Tensorflow2.0学习笔记(二)--Keras练习 文章目录 Tensorflow2.0学习笔记(二)--Keras练习 前言 二.使用步骤 1.实现步骤及代码 2.下载 Fashion MN ...

  10. CCC3.0学习笔记_数字密钥数据结构

    CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...

最新文章

  1. 解决:安装jenkins时web界面出现jenkins实例似乎已离线问题
  2. Mysql5.7使用注意事项随笔
  3. 王甲佳全息营销系列03-离散集聚式地方机构建设与全息营销活动设计实践
  4. 保存课程图片-服务端开发
  5. 腾讯开源再获OSCAR 5项大奖,全国首家可信开源治理认证自发开源企业
  6. 【图论】【斜率优化】前往大都会(loj 2769)
  7. php的cms是什么意思,phpcms是什么系统
  8. 谁考了第k名(信息学奥赛一本通-T1176)
  9. 优化mysql的21个建议_MySQL优化小建议
  10. long类型转成integer类型避免空指针的方法_解决swagger的类型转换报错问题
  11. mysql java 问题_【Java】连接MySQL问题总结
  12. 一些不错的个人博客和资源网站
  13. 用户调用机房收费下机中用到的策略与职责链解析
  14. server2012卸载oracle,Windows Server 2008 R2卸载干净ORACLE 11G
  15. python所有字母大写_在python中将所有字母改为大写
  16. 尚硅谷-SpringCloud
  17. FPGA 十进制 转化为二进制
  18. spring security 3配置ACL时报java.lang.NoSuchMethodError: net.sf.ehcache.Cache.init
  19. deepCopy:1 Uncaught SyntaxError: Identifier ‘xxx’ has already been declared
  20. MindSpore技术专栏 | AI框架中图层IR的分析

热门文章

  1. 支招 | 轻松几步,快速搞掂Webstorm和VSCode编辑器卡顿
  2. 一台电脑有几个计算机用户账户,一台电脑能有几个计算机管理员
  3. stdio.h及cstdio的区别
  4. 【Java】抽象类接口
  5. 聚米优选:他在抖音卖绿植,解决了20多位残疾人的就业问题
  6. 研究生需要考计算机二级吗,研究生可以考计算机二级吗
  7. 【Aseprite】制作Unity2D瓦片地图素材(平台游戏)
  8. Unity2D像素游戏开发——Aseprite简单人物绘画+动画制作导出精灵表示例
  9. 高德地图实现区域下钻
  10. 一起学爬虫——PyQuery常用用法总结