Oracle 12c PDB浅析

不管怎么样,12c出来这么久,总是因为各种各样的原因没有开始学习,现在似乎还是有些晚了。总是耳闻PDB在12c是一种全新的架构模式,在各种技术聊天也大概知道是一种可插拨的新型架构模式,但是似乎SQLServer中也有类似的架构,不管怎么样Oracle圈内还是很火,而且听说12c r2可以支持4096个pdb,这个也太大了,docker装一下试试:)
自己也在本地尝试了一下,其实中间了花了些时间,中途总是被各种事情打断,所以留下的都是一些零碎的知识片段,自己索引把环境重新删了再做几次。
在这种尝试中我试了两种学习方法,第一种是压根不看官方文档,纯是凭着感觉做,碰到问题查google,百度,metalink来做,最后也勉强出了点成果,但是总体感觉有些问题的解决不是常规思路,月解决离本身的学习好像偏差越大。最后竟然还有改到隐含参数,我觉得对于初入门的学习来说,还是很不可取的,所以尽管勉强出了点东西,但是我的感觉是这种学习方法不系统不全面,很容易被各种攻略来影响,还是不推荐的。
然后中间隔了一天,今天再来准备抽一个小时左右来学习一下,发现官方文档着实要详细的多,而且介绍的系统性,更全面,很多博客中的图也基本都是官网中的,所以说自己学习的时候就会方便一些,照着做出错的概率要小,不会很折腾。
不过文档我也是选看,我整理了一下我掌握的信息,做一个简单的总结。
这个图是官方的,我觉得实在弄不出比这个更好的图了,直接贴出来。这个里面的CDB就是容器,PDB就是插件数据库,hrpdb,salespdb都有对应的PDBA来管理,综合的管理由CDB管理员来负责。Root是存储了容器的基本模板,而seed则是提供了一套模板机制。可以基于seed模板来创建对应的PDB,我要演示的也是这个方法。

首先我们创建一个12c的数据库自带pluggable database,还是选用dbca silent方式来做,一个命令直接搞定。
这种方式和10g,11g的主要差别就是有一个创建CDB的选项。
dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname newtest -sid newtest  -characterSet UTF8  -createAsContainerDatabase true -sysPassword oracle -systemPassword oracle
Copying database files
1% complete
3% complete
11% complete
18% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
46% complete
47% complete
52% complete
57% complete
58% complete
59% complete
62% complete
Completing Database Creation
66% complete
70% complete
74% complete
85% complete
96% complete
100% complete
创建完成之后我们就开始来了解一下CDB,PDB的一些简单操作。
首先来个二连发,看看容器id和容器name
sqlplus / as sysdba
SQL> show con_id con_name
CON_ID
------------------------------
1
CON_NAME
------------------------------
CDB$ROOT

SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/system01.dbf
/U01/app/oracle/oradata/newtest/sysaux01.dbf
/U01/app/oracle/oradata/newtest/undotbs01.dbf
/U01/app/oracle/oradata/newtest/users01.dbf
切换到seed,查看容器的id和name
SQL> alter session set container=pdb$seed;
Session altered.
SQL> show con_id con_name
CON_ID
------------------------------
2
CON_NAME
------------------------------
PDB$SEED
查看数据文件,这个时候可以看出其实root和seed都会有独立的system表空间。
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/pdbseed/system01.dbf
/U01/app/oracle/oradata/newtest/pdbseed/sysaux01.dbf
当然想得到更清晰的pdb概览信息,可以使用show pdbs
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
我们再用sysdba登录,如果存在多个pdb,show pdbs显示的结果会更多。目前还没有创建PDB,只有seed一个
SQL> conn / as sysdba   
Connected.
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
我们来创建一个新的PDB,使用基于seed来创建的方式。

默认创建PDB的时候,如果不指定文件的映射关系,会有下面的问题,我们可以省事先用OMF来做。
SQL>  CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
 CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle
                                                                        *
ERROR at line 1:
ORA-65016: FILE_NAME_CONVERT must be specified
SQL>alter system set db_create_file_dest='/U01/app/oracle/oradata/newtest';
System altered.
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
Pluggable database created.
启动一下新的pdb
SQL> alter pluggable database pdb1 open;
Pluggable database altered.
这个时候再次查看就是两条记录了。
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
如果查看更多的角色,可以发现其实DBA相关的角色新增了不少,其中就有PDB_DBA这么一个角色。
SQL> SELECT ROLE FROM DBA_ROLES WHERE ROLE LIKE '%DBA%';
ROLE
------------------------------
DBA
CDB_DBA
PDB_DBA
XDBADMIN
OLAP_DBA
LBAC_DBA
6 rows selected.

  1* ALTER SESSION SET CONTAINER=PDB$SEED
SQL> SELECT ROLE FROM DBA_ROLES WHERE ROLE LIKE '%DBA';
ROLE
------------------------------
DBA
CDB_DBA
PDB_DBA
OLAP_DBA
LBAC_DBA
创建了之后,我们来看看怎么删除PDB
删除pdb
SQL> alter session set container=pdb1;
Session altered.
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
/U01/app/oracle/oradata/newtest/NEWTEST/23CD9A96BE236CE4E0532F857F0A62CC/datafil
e/o1_mf_system_c3pwol80_.dbf
/U01/app/oracle/oradata/newtest/NEWTEST/23CD9A96BE236CE4E0532F857F0A62CC/datafil
e/o1_mf_sysaux_c3pwol8c_.dbf
开始删除。
SQL> drop pluggable database pdb1 including datafiles;
drop pluggable database pdb1 including datafiles
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database
不能在当前的用户下删除,现在也没有CDB管理员,就用sysdba来删除。
SQL> conn / as sysdba
Connected.
SQL> drop pluggable database pdb1 including datafiles;
drop pluggable database pdb1 including datafiles
*
ERROR at line 1:
ORA-65025: Pluggable database PDB1 is not closed on all instances.
想要删除先得close

SQL> alter pluggable database pdb1 close;
Pluggable database altered.
close之后就可以放心删除了
SQL> drop pluggable database pdb1 including datafiles;
Pluggable database dropped.
我们现在来看看CDB的管理员怎么创建
SQL>  create  user c##cdbadmin identified by oracle default tablespace users temporary tablespace temp;
User created.
赋予DBA权限。
SQL> grant dba to c##cdbadmin;
Grant succeeded.
这个时候尝试连接就可以了,当然CDB的管理员名称就是c##开头,就是这么规定。
SQL> conn c##cdbadmin/oracle
Connected.
SQL> show pdbs
SP2-0382: The SHOW PDBS command is not available

再次创建PDB,可能有朋友想怎么又开始说PDB创建了,卖个关子,因为有个问题还是值得一说的。
SQL> CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY oracle;
Pluggable database created.

SQL>conn / as sysba
SQL> alter session set container=pdb1;
Session altered.

SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB1                           MOUNTED
来换个写法启动一下,这个时候就有问题了,刚刚还是可以的,怎么现在修不行了,和语法没关系。
SQL> startup
Warning: PDB altered with errors.
Pluggable Database opened.
但是查看PDB的状态是没有问题的。
SQL> show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDB1                           READ WRITE YES

SQL> conn / as sysdba
Connected.
可以通过下面的方式来分析错误。
SQL> select message,time from pdb_plug_in_violations;
MESSAGE
--------------------------------------------------------------------------------
TIME
---------------------------------------------------------------------------
Sync PDB failed with ORA-959 during ' create  user c##cdbadmin identified by * d
efault tablespace users temporary tablespace temp container = all'
05-NOV-15 11.30.37.118745 PM
如果对于ora-959还有疑问,就使用oerr来看一下
SQL> !oerr ora 00959
00959, 00000, "tablespace '%s' does not exist"
// *Cause:
// *Action:
这样问题就一目了然了。因为目前没有uers的表空间
alter session set container=pdb1;
创建一个即可。
SQL> create tablespace users datafile '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/users01.dbf' size 20M;
Tablespace created.
再次shutdown和startup就没有任何问题了。
SQL> shutdown immediate
Pluggable Database closed.
SQL> startup
Pluggable Database opened.
这些都是PDB学习的开始,也希望继续总结,把这些地方要不断练习,要做数据迁移的好手。

时间: 2024-09-14 16:45:00

Oracle 12c PDB浅析的相关文章

Oracle 12c PDB浅析(二)

之前写了第一篇Oracle 12c PDB浅析 http://blog.itpub.net/23718752/viewspace-1823792/?          在上次的基础上继续来学习学习.     首先关于多租户的架构设计来说,就好比在一座已经几十年的老房子上动地基一般,这个变化着实够大,如此重大的变化Oracle不遗余力的想引入进来,肯定有更深层次的原因,当然关于这种设计在SQLServer中确实已经早有实现,在Oracle中却被大家相传为一种略带神奇的架构设计.不过话说回来,这个和

ORACLE 12C PDB 维护基础知识介绍_oracle

先说基本用法: 先按11G之前进行 conn / as sysdba; create user test identifed by test; ORA-65096: 公用用户名或角色名无效. 查官方文档得知"试图创建一个通用用户,必需要用C##或者c##开头",这时候心里会有疑问,什么是common user?不管先建成功了再说 create C##user test identifed by test; 创建成功 SQL>show con_name; CON_NAME ----

Oracle 12c PDB中碰到的DG问题

Oracle 12c中的PDB一下子让数据文件的格式复杂了一些,所以Data Guard就很有必要了,一旦出现问题,受损失的数据库是全局的.没想到在搭建Data Guard的时候还是碰到了一些小问题. 问题源自于一次PDB创建的时候,早些时候我在搭建好Data Guard后,主备库的日志应用都没有问题,过了几天,根据需求需要再添加一个PDB,导入一些数据供应用使用.按照要求创建了数据文件然后导入数据,但是查看备库的状态发现MRP异常停止了. DG Broker检测的状态如下: DGMGRL> s

Oracle 12c PDB迁移(一)

    最近在整理测试环境的服务器资源,发现真是混乱,问题比较多.首先是服务器配置较低(很多都是KVM或者openstack虚机),资源使用率不高,有些数据的版本较低(10gR2),没有开启归档,没有备库(有些都是异机备份的形式).而且数据库比较散乱,整合起来难度较大,最大的难点就是数据库用户重复,大量重名的同义词等.之前尝试整合了一番,遇到了瓶颈,就暂停了整合的过程,现在来看12c还是一个不错的选择.当然我的选择似乎还是晚了些,下午在看很多人的博客的时候,发现不少人三四年前就在玩12c的很多特

Oracle 12c PDB迁移及ORA-00600错误分析和解决

最近迁移一台测试环境,准备整合到12c的PDB,常规的思路是用Datapump导出导入,对于数据较大的环境来说这个时间会比较长,为此自己也尝试先升级这个测试库,然后加入到CDB中去. 升级的过程就不多说了,其实对于大多数常规的业务来说,本身不是难点. 把升级后的NON-CDB加入到CDB中,基本是下面的思路,先把数据启动到只读模式,然后到处一个配置文件,加载到CDB的重要地方就是使用这个配置文件.先做检查. sqlplus / as sysdba SQL> select name, CDB fr

Oracle 12c DBCA浅析(r12笔记第48天)

   我们知道在11g的环境中我们可以通过一些分析来得到DBCA的一些后台处理工作,有一点需要说明的是,如果一个12c的单实例数据库需要转换为12c的容器数据库,你去查看官方文档,会发现这是一个空白,不是做不了,而是里面有一些地方会干扰到你.   所以在11g手工探究脚本过程的基础上,12c的部分你需要再进一步.常规来说,我们可以通过如下的命令得到一个12c的数据库创建的脚本. dbca -silent  -templateName $ORACLE_HOME/assistants/dbca/te

Oracle 12c PDB的数据备份恢复

今天测试了一下12c中的PDB还原恢复,里面还是有不少的差别. 我就简单模拟了一个破坏场景,是在一个未打开的PDB tcymob0从中删除了数据文件usres01.dbf,然后尝试备份恢复. 当然在这个操作前,我们使用RMAN来备份,使用命令backup database即可备份整个数据库. 手工破坏的语句如下: $ rm /U01/app/oracle/oradata/test12cs/tcymob0/pdbseed/users01.dbf这个时候的还原工作就很清晰了,直接还原对应的表空间或者

ORACLE 12C创建用户之ORA-65096

ORACLE 12C创建用户之ORA-65096   2016年2月25日,一北京北方人瑞教育咨询公司的同事遇到以.sql文件导入数据时遇到ORA-65096报错,如下图所示:      出现上图导入报错,原因初步定为创建数据库用户AJAO的方法不正确,经过查询发现DBA_USERS视图中已有C###AJAO用户,AJAO用户并不存在,所以在.sql导入时报ORA65096:错误原因是用户想在PDBORCL中创建AJAO用户,却未设置会话container到PDB,而在CDB中创建公有用户因无法

ORACLE 12C CDB中PDB参数管理机制

转自:http://www.xifenfei.com/2013/06/oracle-12c-cdb%E4%B8%ADpdb%E5%8F%82%E6%95%B0%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6.html 在ORACLE 12C中参数文件只是记录了cdb的参数信息,没有记录任何的pdb的信息,那ORACLE是如何管理使得各个pdb有自己的参数,这里通过试验的出来ORACLE 12C CDB环境中是通过参数文件结合PDB_SPFILE$来实现参数管理数据库版本