Oracle 12c PDB浅析(r9笔记第10天)

不管怎么样,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学习的开始,也希望继续总结,把这些地方要不断练习,要做数据迁移的好手。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-11-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

备库查询导致的ORA-01110错误及修复(r8笔记第67天)

最近帮助业务部门解决了一个技术问题,因为发现有数据问题需要对存在问题的数据做分析。当然一个难点就是把数据给筛选出来,当我看到他们提供的语句,在备 库做了简单的数...

3467
来自专栏杨建荣的学习笔记

一个oracle蠕虫病毒 (r4笔记第60天)

关于计算机病毒,说起来内容就很丰富了,但是第一次听到关于oracle中的病毒时,却感觉很新鲜。这是一个蠕虫病毒,距离现在已经有10年了,但是现在看起来还是能够借...

2583
来自专栏琯琯博客

Yii2 学习笔记之分页

3637
来自专栏乐沙弥的世界

Oracle 12c 基于PDB种子数据库创建PDB

在Oracle中基于PDB种子复制数据库的方式,这个与SQLServert中直接创建数据库比较类似。在SQLServer中有一个model数据库,这个库的功能就...

1142
来自专栏数据和云

【动手实践】:Lockdown Profile 的多租户权限控制

在Oracle Database 12.2 中引入了lockdown profile的新特性,可以用于限制PDB中的某些操作,增强某些操作的安全性。 PDB ...

2915
来自专栏杨建荣的学习笔记

使用impdp不当导致的数据丢失问题(r5笔记第1天)

今天有个朋友问我们一个问题,说他在使用了impdp导入数据的时候,使用了TABLE_EXISTS_ACTION=REPLACE这个选项,结果现在数据都给覆盖了。...

3645
来自专栏Greenplum

Greenplum常见创建表方式与说明

drop table if exists test_head; create table test_head(id int primary key) dist...

2200
来自专栏along的开发之旅

java.lang.RuntimeException: setAudioSource failed.

最近写个android程序,遇到下面这个错误: java.lang.RuntimeException: setAudioSource failed. 详...

1692
来自专栏杨建荣的学习笔记

Oracle 12c PDB浅析(二)(r8笔记第29天)

之前写了第一篇Oracle 12c PDB浅析 在上次的基础上继续来学习学习。 首先关于多租户的架构设计来说,就好比在一座已经几十年的老房子上动地基...

3296
来自专栏沃趣科技

Oracle12c R2版本Application Containers特性(三)

延伸阅读 Oracle 12c R2版本 Application Containers 特性(二) Oracle 12c R2版本 Application Co...

3607

扫码关注云+社区

领取腾讯云代金券