jeanron100
作者jeanron100·2017-02-14 14:02
数据库管理员·搜狐畅游

Oracle DBCA高级玩法:从模板选择、脚本调用到多租户

字数 3047阅读 3313评论 1赞 1

一、DBCA-熟悉而又陌生

但凡是学过Oracle的同学,对DBCA(Database Configuration Assistant, DBCA)都不会陌生,有了这个工具,使得创建数据库成为可能。而DBCA本身有图形和静默两种方式。其中静默方式看起来高大上一些,因为一个看似复杂的创建数据库的过程,用一个命令就可以轻松搞定。静默安装的命令类似下面的形式,其中创建的数据库为testdb,字符集为ZHS16GBK。

这样就了解了DBCA的整个过程吗?肯定不是。

二、Oracle中创建数据库的模板

首先需要了解一下上面命令里提到的模板General_Purpose.dbc,在10g中是分为四个模板(通用,OLTP,OLAP,定制)可供选择,而11g中目前存在三种模板可供选择,就是通用/OLTP、OLAP和定制类型,主要是通用模板和OLTP模板耦合度太高,所以11g中我们看到的是三个模板,如下图所示。

需要说明的是对于模板类型有seed和noseed两种,主要的区别在于是否包含数据文件(对应上图红色标识的“Includes Datafiles”),简单来说,seed就是从RMAN备份中还原恢复数据库,由于是这个过程是使用通用模板,不能做其他更多的定制修改,但是最大的特点是创建速度快,OLTP和OLAP的模板就属于seed模板类型;而“定制数据库”模板则属于noseed模板,不包含数据文件,需要使用create database命令创建数据库,需要初始化数据字典,安装组件等,创建时间要长很多,对于大部分系统业务来说,需要根据自己的需求来选择合适的模板类型。

三、解读seed模板的原理

seed模板的方式是使用RMAN恢复来完成,那么数据备份在哪里呢?在$ORACLE_HOME/assistants/dbca/templates下面。

可能到这里还不大明白,其实在这里Seed_Database.dfb就是RMAN的备份。

而可以很清楚看到数据库的db_name是seed_database这样的字眼,其实是在创建的过程中修改了db_name,如果用数据库的工具来理解,就是一个nid修改db_name。 如果我们通过strings的方式解析这些文件就会发现db_name是seeddata.

四、解析seed模板创建数据库的过程

当然DBCA静默这个过程很容易实践。我们花几分钟就能手工完成这个过程。

首先假设我们需要创建的数据库为testdb,我们初始化目录结构。

1、如何处理参数文件

然后在$ORACLE_HOME/dbs下初始化参数文件initseeddata.ora,内容如下:

这里尤其注意参数的设置,db_name为seeddata,控制文件的目录为testdb相关。完成这一步我们就可以上道了。

启动数据库到nomount阶段,证明参数文件是设置生效了。

2、如何处理控制文件

而要启动到mount阶段,控制文件怎么处理,我们是从模板的路径下拷贝一个,就可以启动到mount阶段了。

3、如何处理Redo日志

那数据文件,redo这些文件怎么处理,我们先来处理redo,数据文件稍后处理。

当前的redo的设置如下,目前来看是不可用的情况,因为路径是不符合需求的。

我们需要修改为自己需要的格式。

4、如何处理数据文件

接下来的事情,就是数据文件了。

处理起来还是常规思路,就是RMAN注册信息,做还原,恢复。

整个过程持续时间很短,很快就可以完成,最后提示完成了一个基于SCN的恢复。

启动数据库到open阶段resetlogs,就可以打开数据库了。

5、如何修改临时数据文件

还有什么文件需要处理,就是临时数据文件了。

查看临时数据文件会抛出错误,我们还是需要修改一下路径。

策略就是先加后删(加新的临时数据文件,不存在的冗余临时文件)

6、如何修改db_name

整个数据的还原恢复就完成了,接下来就是修改db name了。启动到mount阶段即可处理。

在命令行下使用nid来修改db_name

当然处理好之后原来的参数文件就不可用了,我们直接重新创建一个参数文件inittestdb.ora ,内容如下:

在这个基础上启动数据库到mount,使用open resetlogs就可以打开数据库了。

当然这个思路对于理解DBCA来说是有益无害的。

那么,在这个基础上怎么继续理解DBCA的过程呢?

五、解析DBCA的调用脚本

毫无疑问就是看到一些详细的调用方式,比如脚本之类的,参数文件的处理等,这些Oracle处理起来还是有一些方法论的。

得到DBCA的静默创建脚本很简单,就是添加一个generateScripts选项即可。
比如下面的方式,输出会告诉你一个路径。假设db name为testdb1:

那么RMAN还原的过程呢,本质上RMAN的核心就是dbms_backup_restore,dbms_rcvman的包。我们可以在得到的脚本中看到。
重点工作就是下面的这句:

我们分析生成的脚本可以让自己的理解更上一个层次。生成的脚本如下:

运行的主体是testdb1.sh这个shell脚本,而脚本里调用的SQL脚本是testdb1.sql,我们就不兜圈子了,调用的顺序如下:

  • CloneRmanRestore.sql的工作是完成备份的还原
  • cloneDBCreation.sql的工作是重建控制文件,重建临时表空间,修改db_name,修改字符集。
  • postScripts.sql是初始化一些目录结构。
  • lockAccount.sql是对一些非系统用户做锁定操作。
  • postDBCreation.sql是做一些数据库创建后的基本补充,做一些编译的工作。

学习了这个过程,突然发现我们熟悉的DBCA其实还是有一些持续学习的必要。看起来简单的工具能够掌握本质,本身就是一种无形的进步。

六、DBCA和技术趋势发展的关系

这里我们分两个方面来看,一个是DBCA和多租户的关系,看似不大起眼的DBCA其实和12c的架构设计密不可分。另外一个是12.2的一个新特性,绝对会让人眼前一亮。

1、DBCA和多租户的关系

而结合技术趋势来看DBCA其实发现它还是有很大的改进,我们简单说说。

首先是12c引入的多租用户特性(Multitenant Environment),它允许一个数据库容器(CDB)承载多个可插拔数据库(PDB),通俗点说就是库中库,或者说是数据库里的Docker。在即将推出的12.2中支持的PDB数从252增加到了4096个,下面这个经典的架构图来自官方。

这个和DBCA有什么关系呢?里面有一个SEED的PDB,是容器架构的一个重点部分。

Seed又叫PDB$SEED,创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象(因为是这个PDB是只读的)。一个CDB中有且只能有一个Seed。
这里的这个PDB其实就是一个”活”的模板库,它有自己独立的系统表空间。如图左下所示。

我们可以很轻松地创建一个PDB,比如:

这个实现过程其实就和我们上面模拟DBCA模板建库如出一辙了。

2、通过DBCA创建Data Guard

对于DBCA,我们还有些没想到的功能,而Oracle在12.2已经要推出新功能了,那就是通过DBCA创建Data Guard。而如果明白了上面解析的过程,其实理解这个特性也不大难了。这个过程会指向主库来获取文件,使得创建备库更加便捷,简单。

小结

一个很简单的知识点可以由点及面地学习,掌握了本质的东西,就可以触类旁通了,不能轻视和浮躁。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论1 条评论

powxpowx技术经理ZWT
2019-09-07 21:20
好好学习!!!!
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广