Oracle 12c PDB浅析(二)

之前写了第一篇Oracle 12c PDB浅析 http://blog.itpub.net/23718752/viewspace-1823792/?         
在上次的基础上继续来学习学习。
    首先关于多租户的架构设计来说,就好比在一座已经几十年的老房子上动地基一般,这个变化着实够大,如此重大的变化Oracle不遗余力的想引入进来,肯定有更深层次的原因,当然关于这种设计在SQLServer中确实已经早有实现,在Oracle中却被大家相传为一种略带神奇的架构设计。不过话说回来,这个和Oracle坚定不移的云战略是息息相关的。
   在这种设计中,PDB作为可插拔的数据库,多个PDB会拥有自己独立的system表空间,temp表空间,但是redo,conrolfile,undo都是共享的。
还是先花点时间是说明一下环境。
SQL> select name, decode(cdb, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database
NAME                           Multitenant Option             OPEN_MODE  CON_ID
------------------------------ ------------------------------ ---------- ------
newtest                         Multitenant Option enabled     READ WRITE      0
查看PDB
SQL> select con_id, dbid, guid, name , open_mode from v$pdbs;
    CON_ID       DBID GUID                             NAME                           OPEN_MODE
---------- ---------- -------------------------------- ------------------------------ ----------
         2 2188059502 23CD335E7F55687CE0532F857F0A714A PDB$SEED                       READ ONLY
         3 4013429668 23CDBE4149E16F08E0532F857F0A58E3 PDB1                           READ WRITE
或者使用快捷方式
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
然后我们生成控制文件的trace,来看看和早期版本有什么差别。
alter database backup controlefile to trace 之后,在trace目录下得到的文件内容如下:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "NEWTEST" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/U01/app/oracle/oradata/newtest/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/U01/app/oracle/oradata/newtest/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/U01/app/oracle/oradata/newtest/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/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/pdbseed/system01.dbf',
  '/U01/app/oracle/oradata/newtest/users01.dbf',
  '/U01/app/oracle/oradata/newtest/pdbseed/sysaux01.dbf',
  '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_system_c3px88q0_.dbf',
  '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_sysaux_c3px88q1_.dbf',
  '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/users01.dbf'
CHARACTER SET UTF8
;
从这部分日志可以看出,这个PDB是采用了omf的方式创建的,产生的一个GUID会默认作为对应的PDB目录名称。每个PDB中都有独立的系统表空间system,sysaux
下面是控制文件中的附加日志
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/U01/app/oracle/fast_recovery_area/NEWTEST/archivelog/2016_03_05/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/U01/app/oracle/fast_recovery_area/NEWTEST/archivelog/2016_03_05/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE USING BACKUP CONTROLFILE
-- Database can now be opened zeroing the online logs.
ALTER DATABASE OPEN RESETLOGS;
-- Open all the PDBs.
ALTER PLUGGABLE DATABASE ALL OPEN;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/U01/app/oracle/oradata/newtest/temp01.dbf'
     SIZE 206569472  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
ALTER SESSION SET CONTAINER = PDB$SEED;
ALTER TABLESPACE TEMP ADD TEMPFILE '/U01/app/oracle/oradata/newtest/pdbseed/pdbseed_temp012015-11-05_10-47-05-PM.dbf'
     SIZE 104857600  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
ALTER SESSION SET CONTAINER = PDB1;
ALTER TABLESPACE TEMP ADD TEMPFILE '/U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_temp_c3px88q2_.dbf'
     SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
ALTER SESSION SET CONTAINER = CDB$ROOT;
-- End of tempfile additions.
可以看到在重建控制文件的时候,会自动创建临时表空间,都是彼此独立的。
如果我们使用sqlplus / as sysdba登录之后,默认接入的就是cdb的环境。
所以我们如果尝试创建一个普通用户,就会抛出下面的问题。
SQL> create user test identified by test
  2  ;
create user test identified by test
            *
ERROR at line 1:
ORA-65096: invalid common user or role name
这个时候需要用c##的格式来创建用户,这个时候,CDB的用户和PDB的用户的一个最大不同,就是CDB的是一个共有的用户,在PDB中依旧可见,但是在PDB中具体的权限会有所不同。
SQL> create user c##jeanron identified by oracle;
User created.
如果查看角色的信息,会发现存在PDB_DBA,CDB_DBA,但是细看对应的权限,权限也着实少的可怜,和角色DBA完全不在一个级别啊。
SQL> SElect *from dba_sys_privs where grantee='CDB_DBA';
GRANTEE PRIVILEGE                                ADM COM
------- ---------------------------------------- --- ---
CDB_DBA SET CONTAINER                            NO  YES
可以把这个权限付给c##jeanron
SQL> grant cdb_dba to c##jeanron;
Grant succeeded.
当然使用cdb的用户可以正常连接到实例
conn c##jeanron/oracle
Connected.
SQL> show con_id con_name
CON_ID
------------------------------
1
CON_NAME
------------------------------
CDB$ROOT
我们在cdb的用户下创建一个表作为标记。
SQL> create table cdb_test as select * from cat;
Table created.
SQL> select *from cat;
TABLE_NAME                     TABLE_TYPE
------------------------------ -----------
CDB_TEST                       TABLE
然后使用同样的用户登录PDB1,就胡抛出下面的错误。
SQL> conn c##jeanron/oracle@pdb1
ERROR:
ORA-01045: user C##JEANRON lacks CREATE SESSION privilege; logon denied
这个例子就充分说明了,这些权限信息对于PDB而言都是需要重新来初始化的。但是如果有大量的PDB容器,可以指定container的方式。
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb1;
Session altered.
SQL> grant connect,resource to c##jeanron container=all ;
然后再次登录pdb,看看刚建的表是否还存在。
SQL> conn c##jeanron/oracle@pdb1;
Connected.
SQL> select *from cat;
no rows selected
通过这个小例子就会明白大体的区别了吧。
最后来删除一下pdb,整个操作类似表空间级的操作。
SQL> alter pluggable database all close;
Pluggable database altered.

SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           MOUNTED
SQL> drop pluggable database pdb1 including  datafiles;
Pluggable database dropped.

SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
查看alert日志会发现,文件是确确实实删掉了。
drop pluggable database pdb1 including  datafiles
Sat Mar 05 20:57:56 2016
Deleted file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/users01.dbf
Deleted Oracle managed file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_temp_c3px88q2_.dbf
Deleted Oracle managed file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_sysaux_c3px88q1_.dbf
Deleted Oracle managed file /U01/app/oracle/oradata/newtest/NEWTEST/23CDBE4149E16F08E0532F857F0A58E3/datafile/o1_mf_system_c3px88q0_.dbf
Completed: drop pluggable database pdb1 including  datafiles

时间: 2024-09-24 00:52:53

Oracle 12c PDB浅析(二)的相关文章

Oracle 12c PDB浅析

不管怎么样,12c出来这么久,总是因为各种各样的原因没有开始学习,现在似乎还是有些晚了.总是耳闻PDB在12c是一种全新的架构模式,在各种技术聊天也大概知道是一种可插拨的新型架构模式,但是似乎SQLServer中也有类似的架构,不管怎么样Oracle圈内还是很火,而且听说12c r2可以支持4096个pdb,这个也太大了,docker装一下试试:) 自己也在本地尝试了一下,其实中间了花了些时间,中途总是被各种事情打断,所以留下的都是一些零碎的知识片段,自己索引把环境重新删了再做几次. 在这种尝试

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$来实现参数管理数据库版本