这是Oracle OCP课件给出的创建CDB的过程:
使用DBCA或SQL*Plus创建新CDB所需的步骤相同。
•对于任何数据库(非CDB或CDB)来说,第一步都是使用init.ora参数文件配置实例。
•第二步是启动实例。
•第三步是使用CREATE DATABASE命令和新子句ENABLE PLUGGABLE DATABASE指定数据库为容器数据库而不是非CDB,从而创建CDB。此操作会在装载阶段创建根容器及控制文件,并在打开阶段创建重做日志文件和根数据文件。根数据文件用于SYSTEM表空间(其中包括Oracle提供的元数据和数据字典)以及针对AWR的SYSAUX表空间。还会创建种子可插拔数据库,及该数据库自己的数据文件(用于SYSAUX和SYSTEM表空间)。您可以使用新子句SEED FILE_NAME_CONVERT重命名种子可插拔数据库的数据文件,同时从根容器执行复制操作。该子句会创建种子可插拔数据库及该数据库自己的数据文件。种子数据文件会从根数据文件复制到另一个位置。种子数据文件可用作创建未来PDB的模板。如果省略此子句,Oracle Managed Files会决定种子文件的名称和位置。
•第四步是通过执行连接到根容器的catcdb.sql脚本创建目录和其他组件。
麦老师不建议手工建库,因为很多组件不全,而且创建过程非常麻烦。
这是手工建库后的组件:
代码语言:javascript复制SYS@LHRCDB2> select comp_id,comp_name,version,status from dba_registry;
COMP_ID COMP_NAME VERSION STATUS
---------- ---------------------------------------- ------------ ------------
CATALOG Oracle Database Catalog Views 12.2.0.1.0 VALID
CATPROC Oracle Database Packages and Types 12.2.0.1.0 VALID
RAC Oracle Real Application Clusters 12.2.0.1.0 OPTION OFF
XDB Oracle XML Database 12.2.0.1.0 VALID
OWM Oracle Workspace Manager 12.2.0.1.0 VALID
这是静默建库后的组件:
代码语言:javascript复制SYS@htzxdb1> select comp_id,comp_name,version,status from dba_registry;
COMP_ID COMP_NAME VERSION STATUS
---------- ---------------------------------------- ------------ ------------
CATALOG Oracle Database Catalog Views 18.0.0.0.0 VALID
CATPROC Oracle Database Packages and Types 18.0.0.0.0 VALID
RAC Oracle Real Application Clusters 18.0.0.0.0 VALID
JAVAVM JServer JAVA Virtual Machine 18.0.0.0.0 VALID
XML Oracle XDK 18.0.0.0.0 VALID
CATJAVA Oracle Database Java Packages 18.0.0.0.0 VALID
APS OLAP Analytic Workspace 18.0.0.0.0 VALID
XDB Oracle XML Database 18.0.0.0.0 VALID
OWM Oracle Workspace Manager 18.0.0.0.0 VALID
CONTEXT Oracle Text 18.0.0.0.0 VALID
ORDIM Oracle Multimedia 18.0.0.0.0 VALID
SDO Spatial 18.0.0.0.0 VALID
XOQ Oracle OLAP API 18.0.0.0.0 VALID
OLS Oracle Label Security 18.0.0.0.0 VALID
DV Oracle Database Vault 18.0.0.0.0 VALID
手动创建CDB可以使用新子句SEED FILE_NAME_CONVERT,也可以使用新实例参数PDB_FILE_NAME_CONVERT,或者使用OMF格式。下面给出一种使用OMF格式来手动创建CDB的示例。
如果不使用明确的数据文件名,则使用 Oracle Managed Files (OMF)。使用在语句中指定的SYSTEM、SYSAUX、UNDO和USERS表空间的数据文件的目标目录值设置DB_CREATE_FILE_DEST实例参数。Oracle为所有数据文件、控制文件和重做日志文件选择默认大小和属性。
1、创建参数文件并启动到NOMOUNT阶段
启动实例之前,使用常用参数准备init<SID>.ora参数文件:DB_NAME、CONTROL_FILES(如果不使用OMF)以及DB_BLOCK_SIZE。root的全局数据库名是CDB的全局数据库名。需要使用一个新参数,定义已启动实例可用于创建CDB而不是非CDB。ENABLE_PLUGGABLE_DATABASE参数必须设置为TRUE。设置ORACLE_SID环境变量。启动SQL*Plus,以属于DBA OS组的OS验证用户的身份进行连接,然后执行STARTUP NOMOUNT命令。
常用命令如下:
代码语言:javascript复制export ORACLE_SID=LHRCDB3
orapwd file=$ORACLE_HOME/dbs/orapwLHRCDB3 password=lhr format=12 entries=20
vi $ORACLE_HOME/dbs/initLHRCDB3.ora
DB_NAME=LHRCDB3
DB_BLOCK_SIZE=8192
DB_CREATE_FILE_DEST ='/u01/app/oracle/oradata'
ENABLE_PLUGGABLE_DATABASE=true
sqlplus / as sysdba
startup nomount
2、使用create database创建数据库
通过使用CREATE DATABASE命令和新子句ENABLE PLUGGABLE DATABASE创建CDB。该子句指定数据库为CDB而不是非CDB。此时会创建根容器和种子可插拔数据库。您可以使用另一个子句SEED FILE_NAME_CONVERT指定种子文件的位置。如果省略此子句,OMF会决定种子文件的名称和位置。FILE_NAME_CONVERT指定复制到目标种子目录的根数据文件的源目录。
在本例中,/oracle/dbs和/oracle/seed目录必须存在。在语句中定义的字符集依然是CDB的唯一字符集,如果不指定字符集,那么默认的字符集为US7ASCII:
代码语言:javascript复制create database LHRCDB3
extent management local
CHARACTER SET AL32UTF8
enable pluggable database
;
3、运行catcdb.sql SQL脚本
代码语言:javascript复制---12.2之前和之后都可以运行:
SQL> @?/rdbms/admin/catalog.sql --数据库字典,动态视图创建等
SQL> @?/rdbms/admin/catproc.sql --PL/SQL存过过程相关代码
SQL> @?/rdbms/admin/utlrp.sql --编译
SQL> @?/sqlplus/admin/pupbld.sql --system运行
---如果需要安装其他组件,则还需要跑其他的组件脚本
---12.2开始可以只运行:
@?/rdbms/admin/catcdb.sql
从12.2开始可以只运行如下脚本:
代码语言:javascript复制@?/rdbms/admin/catcdb.sql
若是其他版本,那么也可以运行:
代码语言:javascript复制---12.2之前和之后都可以运行:
SQL> @?/rdbms/admin/catalog.sql --数据库字典,动态视图创建等
SQL> @?/rdbms/admin/catproc.sql --PL/SQL存过过程相关代码
SQL> @?/rdbms/admin/utlrp.sql --编译
SQL> @?/sqlplus/admin/pupbld.sql --system运行
---如果需要安装其他组件,则还需要跑其他的组件脚本
运行catcdb.sql时需要输入几个参数:
代码语言:javascript复制SQL> host perl -I &&rdbms_admin &&rdbms_admin_catcdb --logDirectory &&1 --logFilename &&2
Enter value for 1: /tmp
Enter value for 2: create_cdb.log
Enter new password for SYS: ********
Enter new password for SYSTEM: ********
Enter temporary tablespace name: TEMP
脚本跑完后,查询组件的脚本如下:
代码语言:javascript复制col comp_id format a10
col comp_name format a40
col version format a12
col status format a12
select comp_id,comp_name,version,status from dba_registry;
跑脚本非常慢,安装组件也非常麻烦,最后需要保证所有的组件状态都是VALID,所以,麦老师不建议使用这种办法。手工建库只是在特殊场景中才会用到。
本文结束。