Oracle - 5.0 - 【学习笔记】for ocp 12c、多租户(CDB、PDB)
文章目录
- 多租户构型
- 多租户概念
- 数据字典视图
- 多租户的驱动程序
- 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创建后,将包含至少两个容器。
- 根容器(
CDB$ROOT
)是环境的管理容器。一般来说,只有DBA会连接到根容器。 - 种子容器(
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$PDBS
和V$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
- 公共用户和角色
根容器将有至少四个表空间:SYSTEM
、SYSAUX
、UNDO
和TEMP
。
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$CONTAINS
和V$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$PDBS
和V$CONTAINS
相同,但它去掉了指向根容器的行
设置可插拔数据库
配置容器有如下4种方法
从
PDB$SEED
中创建新的PDB
这个方法创建一个新的PDB,其中只包含SYSTEM
、SYSAUX
、TEMP
表空间。
这通常用于新的应用程序实现。从非CDB中创建一个新的PDB
该方法使用一个现有的数据库(它必须是版本12.x),将它转换成一个可插入容器,再插入CDB中。
这通常是整合过程的一部分。
不可能转换回CDB。把一个PDB克隆为新的PDB
源可以是相同的或不同的CDB。
该方法可以用于从生产PDB中创建测试或开发环境插入一个拔出的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种技术可创建可插入数据库
- 克隆种子容器
- 克隆已有PDB
- 插入以前拔出的PDB
- 插入一个非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,有两种方法:
- 升级
- 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非常相似。可以通过
- 操作系统身份认证或公共用户SYS连接到CDB
- 使用服务名称连接到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在多租户环境中的五个状态
- PDB OPEN
PDBs Opened RW, Except Seed in RO - OPEN
root Opened
PDBs Still Mounted, Except Seed in RO - MOUNT
CDB Control Files Opened for the Instance
root Mounted
PDBs Mounted - NOMOUNT
Instance Started - 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执行所需的所有操作,包括:(但不限于)
- 克隆PDB
- 从种子中创建新的PDB
- 拔出PDB
- 插入以前拔出的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 CLONE
和BEFORE 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>
参考:
- 《OCA/OCP认证考试指南全册(第3版)》清华大学出版社
Oracle - 5.0 - 【学习笔记】for ocp 12c、多租户(CDB、PDB)相关推荐
- mysql5.0镜像_Mysql5.0学习笔记(一)
Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...
- Zabbx6.0(学习笔记)
Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...
- oracle model 分组,oracle model子句学习笔记例 解析
学习 东方醉仙 的 "oracle model子句学习笔记例",并记之 总看model子句 SELECT PRODUCT, COUNTRY, YEAR, WEEKS, RECEIP ...
- flink1.12.0学习笔记第2篇-流批一体API
flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...
- CCC3.0学习笔记_认证和隐私保护
CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...
- TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)
欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...
- 《TP5.0学习笔记---配置篇》
TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...
- Tensorflow2.0学习笔记(一)
Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...
- Tensorflow2.0学习笔记(二)
Tensorflow2.0学习笔记(二)--Keras练习 文章目录 Tensorflow2.0学习笔记(二)--Keras练习 前言 二.使用步骤 1.实现步骤及代码 2.下载 Fashion MN ...
- CCC3.0学习笔记_数字密钥数据结构
CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...
最新文章
- 解决:安装jenkins时web界面出现jenkins实例似乎已离线问题
- Mysql5.7使用注意事项随笔
- 王甲佳全息营销系列03-离散集聚式地方机构建设与全息营销活动设计实践
- 保存课程图片-服务端开发
- 腾讯开源再获OSCAR 5项大奖,全国首家可信开源治理认证自发开源企业
- 【图论】【斜率优化】前往大都会(loj 2769)
- php的cms是什么意思,phpcms是什么系统
- 谁考了第k名(信息学奥赛一本通-T1176)
- 优化mysql的21个建议_MySQL优化小建议
- long类型转成integer类型避免空指针的方法_解决swagger的类型转换报错问题
- mysql java 问题_【Java】连接MySQL问题总结
- 一些不错的个人博客和资源网站
- 用户调用机房收费下机中用到的策略与职责链解析
- server2012卸载oracle,Windows Server 2008 R2卸载干净ORACLE 11G
- python所有字母大写_在python中将所有字母改为大写
- 尚硅谷-SpringCloud
- FPGA 十进制 转化为二进制
- spring security 3配置ACL时报java.lang.NoSuchMethodError: net.sf.ehcache.Cache.init
- deepCopy:1 Uncaught SyntaxError: Identifier ‘xxx’ has already been declared
- MindSpore技术专栏 | AI框架中图层IR的分析