Oracle 中的12C新特性-容器数据库
---12.1.0.2_GI_RAC_Create_CDB_Blog
三月份的时候杰哥跟我讲有时间部署
Oracle
12C-容器数据库,参考公司的迁移文档,做个测试。这个事一直拖,最近有空尝试了一下,还是蛮不错的,就是非常的烧内存。
一、12C概述
Oracle 12C
引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
其实大家如果对sql SERVER比较熟悉的话,这种CDB与PDB是不是感觉和sql SERVER的单实例多数据库架构是一回事呢。像PDB$SEED可以看成是master、msdb等系统数据库,PDBS可以看成用户创建的数据库。而可插拔的概念与sql SERVER中的用户数据库的分离、附加其实就是那么一回事。
二、CDB组件(Components of a CDB)
-ROOT组件
ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/sql包的源代码,Common User 是指在每个容器中都存在的用户。
-SEED组件
Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似sql SERVER中的model数据库。
-PDBS
CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。
注意:
①:一个CDB可以包含253个PDB(去掉一个是seed还能创建252个PDB)。
③:一个单实例的CDB有一个redo log;RAC环境中每个实例有一个redo log。
④:只有一组后台进程,它们被ROOT和所有PDB共享。
⑤:Root的全局数据库名就是CDB的全局数据库名;PDB的全局数据库名是由PDB name和DB_DOMAIN参数共同定义的。
⑥:一个CDB使用一个SPFILE或者一个PFILE,其中为ROOT设置的参数的值可以被PDB继承。另外,也可以使用ALTER SYstem语句来设置PDB的参数。对参数文件执行 操作时,必须使用common user并且使用AS SYSDBA, ASSYSOPER, AS SYSBACKUP来连接数据库。要创建CDB,必须要将初始化参数ENABLE_PLUGGABLE_DATABASE的 值设置为TRUE。
⑦:所有PDB的字符集都使用CDB的字符集。
可以设置所有PDB的时区与CDB相同,也可以单独为PDB设置时区。
块大小被应用于整个CDB。
⑧:Root与每一个PDB都有自己的SYSAUX表空间和SYstem表空间。可以为root和每一个PDB设置默认表空间。而默认的临时表空间对于整个CDB只有一个,但是可以为 每个PDB创建临时表空间。
⑨:撤销表空间对于CDB是唯一的。在CDB中,初始化参数UNDO_MANAGEMENT必须被设置为AUTO。当前容器为PDB时,无法通过数据字典视图查看撤销表空间,只能通 过动态性能视图。
三、 PDB简介
1.PDB新特点的优势
》可以把多个PDB集成进一个平台。
》通过拔插技术,可以快速把存在的数据库重新部署到一个新平台上。
》通过把单个PDB拔插到较高版本的不同CDB,可以补丁或升级一个PDB。
》分离这些PDB应用管理员的责任。
2.PDB新特点的功能
》在一个CDB中,你可以拥有很多PDB。
》PDB和12.1之前版本的普通数据库是向后兼容的。
》PDB对应用是透明的——你不需要改变客户端代码或数据库对象。
》RAC中每个实例作为一个整体打开CDB(因此CDB和其中的PDB数据库版本都是相同的)。
》会话仅仅看到它自己连接的那个PDB。
》你可以在同一个CDB或不同CDB间克隆PDB。
》资源管理器随着PDB的功能得以扩展。
》通过sql语句实现了实体PDB的操作(创建,拔出,插入,克隆,清除,设置打开模式)。
》当连接到所谓的“根”(root)时,CDB管理员来执行这些操作。
》所有的PDB能被一次备份,但可以分别单独恢复。
3.PDB的详解
》每个PDB有自己的私有数据字典用于用户创建的数据库对象;另一方面,CDB作为一个整体也包含Oracle提供系统的数据字典,其中,每个数据字典定义自己的命名空间。换句话说,有全局数据字典(CDB级)和本地数据字典(PDB级)。
》有新的分开的数据字典架构,该架构允许一个PDB被快速从一个CDB拔出并插入一个不同的CDB。
》每个PDB只能看到oracle提供系统的只读定义。
》有全局数据库参数,也有本地数据库参数。PDB参数仅仅属于特定的PDB,并且拔出后,PDB参数也将保持不变。
》数据库用户可以是全局的(CDB)或本地的(PDB)。SYS和SYstem用户一开始就在两级DB中存在。如果你在CDB中创建了一个新用户,那么你在PDB中也能看到这个用户。在PDB中创建的用户只能在该PDB中使用。
》临时表空间可以是全局或本地的。
》Redo日志和Undo表空间都是全局的(CDB级)。
》Data Guard在CDB级作为一个整体发挥作用;RMAN调度的备份也作为一个整体在CDB级完成;任何时候,你可以只备份一个PDB。
》应用连接PDB时,不需做代码修改;系统管理员可以连接CDB;连接串中的服务名确定目标PDB。
》PDB允许更加清晰的声明定义一个应用;一个PDB对同一个CDB里的其他PDB一无所知;每个PDB是个密闭的容器。这保证了新层面DB的独立和安全。
四、
日常操作
1. 查看数据库是否为CDB
[root@vastdata11 ~]# su - oracle [oracle@vastdata11 ~]$ sqlplus / as sysdba sql*Plus: Release 12.1.0.2.0 Production on Sat Jun 1 21:42:21 2019 copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options sql> select name,cdb,open_mode,con_id from v$database; NAME CDB OPEN_MODE CON_ID ------------------ ------ ---------------------------------------- ---------- CDB YES READ WRITE 0
2.
查看当前的容器
sql> show con_name; CON_NAME ------------------------------ CDB$ROOT sql> select Sys_Context('Userenv', 'Con_Name') "current Container" from dual; current Container -------------------------------------------------------------------------------- CDB$ROOT
3 .查看CDB中的PDB信息
sql> select con_id, dbid, guid, name , open_mode from v$pdbs; CON_ID DBID GUID NAME OPEN_MODE ---------- ---------- -------------------------------- ------------------------------------------------------------ -------------------- 2 2382420430 8A33449DBB2C529AE0530B38A8C0899C PDB$SEED READ ONLY 3 1983375270 8A337E167FD16986E0530B38A8C0632A PDB1 READ WRITE 4 2621964339 8A33890C63336EADE0530B38A8C02ED2 PDB2 READ WRITE 5 4092698095 8A3390728AB570E0E0530B38A8C0006E PDB3 READ WRITE sql> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED
4. 启动和关闭已创建好的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 4 PDB2 MOUNTED 5 PDB3 MOUNTED sql> alter pluggable database pdb1 close; Pluggable database altered. sql> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED ----------也可以通过sqlplus使用传统的startup和shutdown命令来启动和关闭PDB----------- sql> alter session set container=pdb1; Session altered. sql> startup Pluggable Database opened. sql> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 READ WRITE NO sql> shu immediate; Pluggable Database closed. sql> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 3 PDB1 MOUNTED sql> alter session set container=CDB$ROOT; Session altered. sql> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 MOUNTED 4 PDB2 MOUNTED 5 PDB3 MOUNTED
5.配置建通文件,并通过网络登陆PDB1数据库
监听文件目录在 $ORACLE_HOME/network/admin
[oracle@vastdata11 admin]$ cat tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. CDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cdb) ) ) PDB1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1) ) ) [oracle@vastdata11 admin]$ tnsping pdb1 TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 01-JUN-2019 23:16:33 copyright (c) 1997, 2014, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vastdata-scan.us.oracle.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1))) OK (0 msec) [oracle@vastdata11 admin]$ sqlplus system/oracle@pdb1 sql*Plus: Release 12.1.0.2.0 Production on Sat Jun 1 23:14:15 2019 copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options sql> select name,cdb,open_mode,con_id from v$database; NAME CDB OPEN_MODE CON_ID ------------------ ------ ---------------------------------------- ---------- CDB YES READ WRITE 0 sql> show con_name CON_NAME ------------------------------ PDB1 sql> select name from v$datafile; NAME -------------------------------------------------------------------------------- +DATA/CDB/DATAFILE/undotbs1.280.1009718515 +DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/system.292.1009719563 +DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/sysaux.293.1009719563 +DATA/CDB/8A337E167FD16986E0530B38A8C0632A/DATAFILE/users.295.1009719733 sql>
6.创建CDB启动触发器
oracle12C中在启动数据库的时候, PDB 并不会随着 CDB 而启动。
不过我们可以通过创建一个触发器让 PDB 能够随 CDB 启动。如下:
sql> SHOW CON_NAME CON_NAME ------------------------------ CDB$ROOT sql> CREATE OR REPLACE TRIGGER open_pdbs 2 AFTER STARTUP ON DATABASE 3 BEGIN 4 EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN'; 5 END open_pdbs; 6 / Trigger created. sql> shu immediate; Database closed. Database dismounted. ORACLE instance shut down. sql>startup ORACLE instance started. Total System Global Area 1560281088 bytes Fixed Size 2924784 bytes Variable Size 570429200 bytes Database Buffers 973078528 bytes Redo Buffers 13848576 bytes Database mounted. Database opened. sql>show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB1 READ WRITE NO 4 PDB2 READ WRITE NO 5 PDB3 READ WRITE NO
7.创建一个新的PDB
sql> create pluggable database pdb4 admin user admin identified by admin; sql> alter pluggable database pdb4 open; sql> select con_id,dbid,con_uid,guid,name,open_mode,create_scn,total_size,block_size from v$pdbs; CON_ID DBID CON_UID GUID NAME OPEN_MODE CREATE_SCN TOTAL_SIZE BLOCK_SIZE ---------- ----- ---------- -------------------------------- ----------- ---------- ---------- ---------- ---------- 2 427872663 427872663 439BFCB2A2EE1BE7E055000000000001 PDB$SEED READ ONLY 1594401 838860800 8192 3 1891424478 1891424478 439C5B1174C121B7E055000000000001 FEIGE READ WRITE 1753608 865075200 8192 4 2998508999 2998508999 53F376E8715628BCE055000000000001 PDB4 READ WRITE 1757024 859832320 8192
“admin user”子句是必须的,在扩展格式,给新用户赋予了权限和角色,该用户仅在admin内可以创建新会话。
在创建完可插拔数据库后,新的PDB处于MOUNTED模式.
8.克隆一个新的PDB
sql> create pluggable database pdb5 from pdb4; sql> alter pluggable database pdb5 open; 切换到PDB,或切换到CDB sql> alter session set container=pdb4; sql> alter session set container=cdb$root; 关闭一个pdb和关闭所有的pdb sql> alter pluggable database pdb4 close; sql> alter pluggable database all close;
pdb5.xml:文件确定数据文件的名字和全路径等信息。这些信息在插入操作时会用到。
注意:PDB还是其从中拔出的CDB的一部分,只是现在状态变为了拔出(UNPLUGGED)而已。
sql> alter pluggable database pdb5 close; sql> alter pluggable database pdb5 unplug into '/opt/oracle/oradata/pdb5.xml';
----在当前的容器中删除这个pdb
sql> drop pluggable database pdb5 keep datafiles;
----查看pdb和这个容器是否兼容,如果报错说明不兼容
exec DBMS_PDB.Check_Plug_Compatibility(PDB_Descr_File=>'/opt/oracle/oradata/pdb5.xml');
----开始插入pdb
(using关键字后必须跟上PDB描述的绝对路径,即,先前拔出操作时产生的.XML文件)
create pluggable database pdb5 using '/opt/oracle/oradata/pdb5.xml' move file_name_convert = ('/cdb1/', '/cdb2/');
----最后打开这个pdb
alter pluggable database pdb5 open;
---至此,
cdb与pdb的一些基础的知识和操作都有介绍,
就先总结到这里。