欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  新闻

pdb数据库是什么数据(pdb蛋白质数据库使用方法)

程序员文章站 2022-06-30 23:45:08
oracle 12.1发布至今已有多年,但国内oracle 12c的用户并不多,随着12.2在去年的发布,选择安装oracle 12c的客户量明显增加,在接下来的几年中,oracle 12c将逐步得到...

oracle 12.1发布至今已有多年,但国内oracle 12c的用户并不多,随着12.2在去年的发布,选择安装oracle 12c的客户量明显增加,在接下来的几年中,oracle 12c将逐步得到普及。

目前关于12c新特性的文章很多,但大多都不成体系,本次的文章是一个非常完整、连贯的系列,将带你全面的从基础到深入全方位的理解oracle 12c。

本篇为oracle 12c系列的开篇文章《oracle 12c系列(1)multitenant container》。

可插入数据库的概念

oracle multitenant container database(cdb),即多租户容器数据库,是oracle 12c引入的特性,指的是可以容纳一个或者多个可插拔数据库的数据库,这个特性允许在cdb容器数据库中创建并且维护多个数据库,在cdb中创建的数据库被称为pdb,每个pdb在cdb中是相互独立存在的,在单独使用pdb时,与普通数据库无任何区别。

cdb根容器数据库的主要作用就是容纳所有相关的pdb的元数据,以及在cdb中对所有的pdb进行管理。

多租户环境的组成

root

  • root容器数据库,是cdb环境中的根数据库,在根数据库中含有主数据字典视图,其中包含了与root容器有关的元数据和cdb中所包含的所有的pdb信息。在cdb环境中被标识为cdb$root,每个cdb环境中只能有一个root容器数据库。
  • cdb seedcdb seed为pdb的种子,其中提供了数据文件,在cdb环境中被标识为pdb$seed,是创建新的 pdb的模板,你可以连接pdb$seed,但是不能执行任何事物,因为pdb$seed是只读的,不可进行修改。
  • pdbspdb数据库,在cdb环境中每个pdb都是独立存在的,与传统的oracle数据库基本无差别,每个pdb拥有自己的数据文件和objects,唯一的区别在于pdb可以插入到cdb中,以及在cdb中拔出,并且在任何一个时间点之上pdb必须拔出或者插入到一个cdb中,当用户链接pdb时不会感觉到根容器和其他pdb的存在。
pdb数据库是什么数据(pdb蛋白质数据库使用方法)

cdbwith pdbs

sys. ora12c>show pdbs
con_id con_name open mode restricted
---------- ------------------------------ ---------- ----------
 2 pdb$seed read only no
 3 ora12cpdb read write no
 4 pdb2 mounted
 5 pdb1 mounted
 6 pdb3 read write no
sys. ora12c>

pdb$seed为cdb seed,ora12cpdb/pdb1/pdb2/pdb3为pdb数据库。

application containers

在12cr2版本中,oracle对多租户功能进行了增强,在cdb root容器中可以创建一个叫做application root的容器,可在其内创建多个依赖于application root的application pdbs,架构图如下:

pdb数据库是什么数据(pdb蛋白质数据库使用方法)

applicationcontainers in a cdb

pdb数据库是什么数据(pdb蛋白质数据库使用方法)

application

更多的关于application containers相关内容请参考之前的applicationcontainers系列:

《oracle12cr2版本application containers特性(1)》

《oracle12cr2版本application containers特性(2)》

《oracle12cr2版本application containers特性(3)》

cdb环境中的用户

cdb环境中包含两类用户,公用用户和本地用户。

丨公用用户

公用用户是在root数据库中和所有的pdb数据库中都存在的用户,公用用户必须在根容器中创建,然后此用户会在所有的现存的pdb中自动创建,公用用户标识必须以c##或者c##开头,sys和system用户是oracle在cdb环境中自动创建的公用用户。

create user c##yyh identified by yyh;

创建完成公用用户,需要为公用用户赋予所有可插拔数据库的权限,公用用户才可以访问其他pdb,如果在连接根容器时仅仅为公用用户赋予了相关权限,那么该权限不会被传递到所有的可插拔数据库中,必须为公用用户赋予能够传递到pdb中的权限,可以创建公用角色然后赋予公用用户,或者在为公共用户付权时指定子句container=all;

例如:

 或者
grant dba to c##yyh container=all;
create role c##dbaprivs container=all;
grant dba to c##dbaprivs container=all;
grant c##dbaprivs to c##yyh container=all;
或者
grant dba to c##yyh container=all;

丨本地用户

本地用户指的是在pdb中创建的普通用户,只有在创建它的pdb中才会存在该用户,并且pdb中只能创建本地用户。

cdb中你需要再次了解的基础知识

丨system/sysaux

在cdb的数据库环境中,system/sysaux表空间并不是公用,cdb$root以及每个pdb都拥有自己的system和sysaux表空间。

丨redo文件

在cdb环境中所有的pdb共用cdb$root中的redo文件,redo中的条目标识redo来自那个pdb。

在pdb中无法执行altersystem switch logfile命令,只有公用用户在root容器中才可以执行该命令。

另外alter system checkpoint命令是可以在pdb中执行的。

丨归 档

在cdb环境中所有的pdb共用cdb的归档模式,以及归档文件,不可以单独为pdb设置自己的归档模式,只有特权用户连接根容器之后才可以启动归档模式。

丨undo mode

在12.2之前的版本中,所有的pdb共用cdb$root中的undo文件,在12.2之后的版本中undo的使用模式有两种:shared undo mode和local undo mode,顾名思义,local undo mode就是每个pdb使用自己的undo表空间,但当pdb中没有自己的undo表空间时,会使用cdb$root中的公共undo表空间。

查看undo表空间的使用模式(cdb$root):

col property_name for a50
col property_value for a50
col description for a50
select property_name, property_value
from database_properties
where property_name='local_undo_enabled';
property_name property_value
-------------------- --------------------
local_undo_enabled true

在创建cdb时使用了shared undo mode方式,如果后续想更改为local undo mode,我们可以使用如下命令更改undo mode为local undo mode:

startup upgrade
alter database local undo on;
shutdown immediate
startup

更改为local undo后cdb中的所有的pdb会自动创建自己的undo表空间。

丨临时文件

每个pdb都有自己的临时表空间,如果pdb没有自己的临时表空间文件,那么,pdb可以使用cdb$root中的临时表空间。

08:42:46 sys. woqu>select con_id, tablespace_name from cdb_temp_files;
con_id tablespace_name
---------- --------------------
 1 temp
 3 temp
elapsed: 00:00:00.11
08:43:02 sys. woqu>

丨参数文件

参数文件中只记录了根容器的参数信息,没有记录pdb级别的参数信息,在根容器中修改初始化参数,会被继承到所有的pdb中,在pdb中修改参数后,pdb的参数会覆盖cdb级别的参数,pdb级别的参数记录在根容器的pdb_spfile$视图中,但并不是所有的参数都可以在pdb中修改,可以通过v$system_parameter视图查看pdb中可修改的参数:

select name from v$system_parameter
where ispdb_modifiable = 'true'
order by name;
pdb_spfile$:
08:37:58 sys. yyh>show parameter open_cursors
name type value
------------------------------------ ----------- -----
open_cursors integer 999
08:38:04 sys. yyh>show parameter local_listener
name type value
------------------------------------ ----------- ----------------
local_listener string pdb_yyh
08:38:08 sys. yyh>select pdb_uid, name, value$ from pdb_spfile$;
pdb_uid name value$
---------- ------------------ ------------------
1167267009 open_cursors 999
1167267009 local_listener 'pdb_yyh'
elapsed: 00:00:00.00
08:38:11 sys. yyh>

这里在pdb:1167267009中更改了open_cursors/ local_listener两个参数。

丨控制文件

cdb环境中只有一组控制文件,所有的pdb共用这组公共的控制文件,从任何pdb中添加数据文件都会记录到公共控制文件当中,公用用户连接根容器时,可对控制文件进行管理。

20:51:03 sys. woqu>show parameter control_files
name type value
------------------------------------ -----------------------------------------
control_files string /u01/app/oracle/oradata/woqu/c
 ontrol01.ctl, /u01/app/oracle/
 oradata/woqu/control02.ctl
20:51:06 sys. woqu>
20:50:55 sys. woqupdb>show parameter control_files
name type value
------------------------------------ -----------------------------------------
control_files string /u01/app/oracle/oradata/woqu/c
 ontrol01.ctl,/u01/app/oracle/
 oradata/woqu/control02.ctl
20:51:23 sys.woqupdb>

丨告警日志以及跟踪文件

在cdb中所有的pdb共用一个告警日志和一组跟踪文件,所有的pdb告警信息都会写入同一个告警日志中。

丨时区

在cdb环境中可以为cdb以及所有的pdb设置相同的时区,也可以为每个pdb设置单独的时区。

20:51:50 sys. woqu>show pdbs
con_id con_name open mode restricted
---------- ------------------------------ ---------- ----------
 2 pdb$seed read only no
 3 woqupdb read write no
20:52:00 sys. woqu>select dbtimezone from dual;
dbtime
------
+00:00
elapsed: 00:00:00.00
20:52:01 sys. woqu>
20:51:53 sys. woqupdb>select dbtimezone from dual;
dbtime
------
+08:00
elapsed: 00:00:00.00
20:52:02 sys. woqupdb>

丨字符集

在cdb中定义字符集也可以应用于它所含有的pdb中,每个pdb也可以有自己的字符集设置。

20:52:33 sys. woqu>select a.value || '_' || b.value || '.'|| c.value nls_lang
20:52:33 2 from nls_database_parameters a,nls_database_parameters b, nls_database_parameters c
20:52:33 3 where a.parameter = 'nls_language' andb.parameter = 'nls_territory' and c.parameter = 'nls_characterset';
nls_lang
----------------------------------------
american_america.al32utf8
elapsed: 00:00:00.06
20:52:33 sys. woqu>20:52:33 sys. woqu>
20:52:36 sys. woqupdb>select a.value || '_' || b.value || '.'|| c.value nls_lang
20:52:36 2 from nls_database_parameters a,nls_database_parameters b, nls_database_parameters c
20:52:36 3 where a.parameter = 'nls_language' andb.parameter = 'nls_territory' and c.parameter = 'nls_characterset';
nls_lang
----------------------------------------
american_america.zhs16gbk
elapsed: 00:00:00.08
20:52:36 sys. woqupdb>20:52:36 sys. woqupdb>

丨数据字典视图与动态性能视图

在cdb环境中引入了cdb级别的数据字典视图,它的级别高于dba_/all_/user_,cdb级别的数据字典视图含有所有pdb的元数据信息,其中增加了con_id列,con_id为cdb中所有容器唯一标识符,其中con_id为0的是cdb$root,con_id为2的是pdb$seed,每个pdb在cdb中都会分配一个唯一的con_id。如果要想查看cdb级别的数据字典视图,必须使用公用用户在跟容器中查看,并且要查看的pdb必须处于open状态,才可以看到pdb中的信息。

20:53:42 sys. woqu>showpdbs
con_id con_name open mode restricted
---------- ------------------------------ ---------- ----------
 2 pdb$seed read only no
 3 woqupdb read write no
20:53:45 sys. woqu>
20:54:40 sys. woqu>select con_id, pdb_id, pdb_name, dbid, status fromcdb_pdbs;
con_id pdb_id pdb_name dbid status
---------- --------- ------------------------------ --------------
 2 2 pdb$seed 2834527297 normal 
 3 3 woqupdb 3238406520 normal
20:54:43 sys. woqu>

cdb的创建

如果要使用可插拔数据库的功能,需要在创建数据库时专门指定启用可插拔数据库,创建cdb通常有如下两种方式:

  • 使用dbca图形工具创建cdb这里需要注意的是oracle 12.2之后支持local undo,这里注意需要手动要勾选local undo选项。
  • create database语句创建cdb在使用脚本创建cdb时oracle提供了两种方法,一种是使用omf,另外一种是非omf的方式,注意参数文件中需要将enable_pluggable_database设置为true。

这里演示使用非omf方式创建cdb,数据名称为ora12c:

1.设置enable_pluggable_database参数为true,参数文件如下:

audit_file_dest='/u01/app/oracle/admin/ora12c/adump'
audit_trail='none'
compatible='12.2.0'
control_files='/u01/app/oracle/oradata/ora12c/control01.ctl','
/u01/app/oracle/oradata/ora12c/control02.ctl'
db_block_size=8192
db_domain='linux.com'
db_name='ora12c'
diagnostic_dest='/u01/app/oracle'
enable_pluggable_database=true
memory_target=801m
nls_language='american'
nls_territory='america'
remote_login_passwordfile='exclusive'
undo_tablespace='undotbs1'

2.创建相应目录以及设置环境变量

export oracle_sid=ora12c
export oracle_home=$oracle_base/product/12.2.0/dbhome_1
export path=$oracle_home/bin:$oracle_home/opatch:$oracle_home/perl/bin:$oracle_home/jdk/bin:$path

3.create database脚本createdb.sql如下:

create database ora12c
user sys identified by oracle
user system identified by oracle
logfile group 1('/u01/app/oracle/oradata/ora12c/redo01a.log','/u01/app/oracle/oradata/ora12c/redo01b.log')
 size 100m blocksize 512,
 group 2('/u01/app/oracle/oradata/ora12c/redo02a.log','/u01/app/oracle/oradata/ora12c/redo02b.log')
 size 100m blocksize 512,
 group 3('/u01/app/oracle/oradata/ora12c/redo03a.log','/u01/app/oracle/oradata/ora12c/redo03b.log')
 size 100m blocksize 512
maxloghistory 1
maxlogfiles 16
maxlogmembers 3
maxdatafiles 1024
character set al32utf8
national character set al16utf16
extent management local
datafile '/u01/app/oracle/oradata/ora12c/system01.dbf'
size 700m reuse autoextend on next10240k maxsize unlimited
sysaux datafile '/u01/app/oracle/oradata/ora12c/sysaux01.dbf'
size 550m reuse autoextend on next10240k maxsize unlimited
default tablespace deftbs
datafile'/u01/app/oracle/oradata/ora12c/deftbs01.dbf'
size 500m reuse autoextend onmaxsize unlimited
default temporary tablespace tempts1
tempfile '/u01/app/oracle/oradata/ora12c/temp01.dbf'
size 20m reuse autoextend on next640k maxsize unlimited
undo tablespace undotbs1
datafile'/u01/app/oracle/oradata/ora12c/undotbs01.dbf'
size 200m reuse autoextend onnext 5120k maxsize unlimited
enable pluggable database
seed
file_name_convert =('/u01/app/oracle/oradata/ora12c/',
 '/u01/app/oracle/oradata/ora12c/pdbseed/')
system datafiles size 125mautoextend on next 10m maxsize unlimited
sysaux datafiles size 100m
user_data tablespace usertbs
datafile'/u01/app/oracle/oradata/ora12c/pdbseed/usertbs01.dbf'
size 200m reuse autoextend onmaxsize unlimited;

这段代码中”enable pluggable database”之后部分与pdb有关,其他部分与创建传统的oracle数据库语句均相同。

file_name_convert

子句指定了使用’
/u01/app/oracle/oradata/ora12c/’中的文件名在’/u01/app/oracle/oradata/ora12c/pdbseed/’中生产cdbseeds。

user_data_tablespace

子句可以在容器中创建额外的表空间,这个表空间在后续使用pdb$seed创建pdb时会被复制到pdb中。

4.将数据库启动到nomount状态,然后执行上面createdb.sql脚本创建cdb

startup nomount;
@createdb.sql

当数据库创建成功之后可以看到新建立的数据库被加入到/etc/oratab文件中。

#cat/etc/oratab
+asm:/u01/app/11.2.0/grid:n
ora12c:/u01/app/oracle/product/12.2.0/dbhome_1:n
orcl:/u01/app/oracle/product/11.2.0/dbhome_1:n # line added by agent
newdb:/u01/app/oracle/product/12.2.0/dbhome_1:n
yyh:/u01/app/oracle/product/12.2.0/dbhome_1:n

5.查看监听,根容器的服务ora12c.linux.com已经被注册到监听中。

service"ora12c.linux.com" has 1 instance(s).
instance "ora12c", status ready,has 1 handler(s) for this service...

6.运行catcdb.sql脚本创建cdb相关视图:

@?/rdbms/admin/catcdb.sql

注意事项:

1.在catcdb.pl执行过中需要输入两个参数,文档中并没有指出是什么参数.

第一个参数应输入:

$oracle_home/rdbms/admin

第二个参数应输入:

catcdb.pl

2.环境变量中必须将$oracle_home/perl/bin指定到path中,否则报如下错误:

can'tlocate term/readkey.pm

3.需要将$
oracle_home/perl/lib/5.22.0/x86_64-linux-thread-multi/hash中的catcdb.pl文件内容:

use data::dumper;
use util qw(trim, splittoarray);
use catcon qw(catconsqlplus);
更改为
use data::dumper;
use utilqw(trim, splittoarray);
use catcon qw(catconsqlplus);

4.切换到$
oracle_home/perl/lib/5.22.0/x86_64-linux-thread-multi/hash目录中,然后sqlplus连接到数据,在执行catcdb.sql,否则报如下错误:

can'tlocate util.pm

7.开启localundo mode(因为上面再创建cdb时没有加入localundo mode子句)

sys. ora12c>shutdown immediate
sys. ora12c>startup upgrade
sys. ora12c>alter database local undo on;
database altered.
elapsed: 00:00:00.72

查看是否为local undo mode:

select property_name, property_value
from database_properties
where property_name='local_undo_enabled';
property_name property_value
-------------------- --------------------
local_undo_enabled true
elapsed: 00:00:00.02
sys. ora12c>

重启数据库:

shutdown immediate
startup

启动数据库的过程中会在pdb$seed中自动创建undo表空间,提供给后来采用pdb$seed方式创建pdb所使用。

ps:如果cdb中已经存在多个pdb,当在根容器中使用alter database local undo on;开启local undo mode时会自动为每个pdb创建local undo。

8.检查cdb是否已经创建成功

sys. ora12c>select dbid, name, open_mode, cdb, con_id from v$database;
 dbid name open_mode cdb con_id
---------- --------- -------------------- --- ----------
323027068 ora12c read write yes 0
elapsed: 00:00:00.11
sys. ora12c>

此时cdb中含有两个容器:根容器cdb$root和种子容器pdb$seed,如下:

sys. ora12c>select con_id, dbid, con_uid, guid, name from v$containers;
con_id dbid con_uid guid name
------ ---------- ---------- --------------------------------- ----------
1 323027068 150a57cdefd150c96e0530838a8c0206e cdb$root
2 1453953285 145395328550a57cdefd160c96e0530838a8c0206e pdb$seed
elapsed: 00:00:00.00
sys. ora12c>select con_id, tablespace_name, file_id, file_name
from cdb_data_files;
con_id tablespace_name file_id file_name
------ --------------- ---------------------------------------------------
1 system 1/u01/app/oracle/oradata/ora12c/system01.dbf
1 sysaux 3/u01/app/oracle/oradata/ora12c/sysaux01.dbf
1 undotbs1 5/u01/app/oracle/oradata/ora12c/undotbs01.dbf
1 deftbs 6/u01/app/oracle/oradata/ora12c/deftbs01.dbf
elapsed: 00:00:00.01
sys. ora12c>show con_id con_name user
con_id
------------------------------
1
con_name
------------------------------
cdb$root
user is "sys"
sys. ora12c>

cdb的管理

管理cdb时,通常需要使用sys用户连接根容器数据库,在操作方式上与非cdb数据库同样。

当前连接容器的信息:

1.
23:03:31 sys. woqu>show con_id con_name user
con_id
------------------------------
1
con_name
------------------------------
cdb$root
user is "sys"
23:03:33 sys. woqu>
2.
col con_id for a10
col cur_container for a25
col cur_user for a25
select
sys_context('userenv','con_id')con_id,
sys_context('userenv','con_name') cur_container,
sys_context('userenv','session_user') cur_user
from dual;
con_id cur_container cur_user
---------- ------------------------- -------------------------
1 cdb$root sys

丨启动和停止cdb

只有公用用户才可以连接根容器,并且启动和停止cdb,停止和启动与普通数据库的处理过程相同,当公用用户连接pdb时,无法启动和停止cdb:

sys. ora12c>startup

默认情况下启动cdb时不会自动启动pdbs,我们可以使用手工的方式启动pdb:

alter pluggable database [pdb_name] open;
alter pluggable database all open; --打开所有pdb
sys. ora12c>shutdown immediate

在关闭cdb时,cdb中正在运行pdss会也会关闭,连接cdb与pdbs的session均会断开。

查看cdb环境中表空间使用情况:

with generator0 as
(select cf.con_id,cf.tablespace_name, sum(cf.bytes) / 1024 / 1024 frm
from cdb_free_space cf
group by cf.con_id,cf.tablespace_name),
generator1 as
(select cd.con_id,cd.tablespace_name, sum(cd.bytes) / 1024 / 1024 usm
from cdb_data_files cd
group by cd.con_id,cd.tablespace_name),
generator2 as(
select g0.con_id, c.name con_name, g0.tablespace_name, g0.frm, g1.usm
from generator0 g0, generator1 g1,v$containers c
where g0.con_id = g1.con_id
and g0.tablespace_name =g1.tablespace_name
and c.con_id = g1.con_id
union
select c.con_id,
 c.name,
 ct.tablespace_name,
 null,
 sum(ct.bytes) / 1024 / 1024
from v$containers c,cdb_temp_files ct
where c.con_id = ct.con_id
group by c.con_id, c.name,ct.tablespace_name)
select con_id,
case when con_name = lag(con_name, 1) over(partition by con_name order bytablespace_name) then null else con_name end
con_name, tablespace_name, frm freemb, usm usemb
from generator2
order by con_id;
con_id con_name tablespace_name freemb usemb
------ ------------ --------------- ---------- ----------
1 cdb$root sysaux 28 470
1 system 6.5625 810
1 temp 33
1 undotbs1 1.9375 60
1 users 4 5
3 ora12cpdb sysaux 18.125 360
3 system 1.25 250
3 temp 64
3 undotbs1 33 100
3 users 4 5

丨切换容器

使用公用用户连接cdb后可以使用alter session的方式切换不同的容器:

alter session set container=pdb1;
alter session set container = cdb$root;

在切换容器时无需运行监听器和密码文件。只要公用用户拥有相关权限就可以切换到另外的容器中。