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

dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname testdb -sid testdb  -characterSet ZHS16GBK  -sysPassword oracle -systemPassword oracle

这样就了解了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下面。

[oracle@newtest templates]$ ll
total 301544
-rw-r--r-- 1 oracle oinstall      5104 Aug 24  2013 Data_Warehouse.dbc
-rwxr-xr-x 1 oracle oinstall  21741568 Aug 27  2013 example01.dfb
-rwxr-xr-x 1 oracle oinstall   1507328 Aug 27  2013 example.dmp
-rw-r--r-- 1 oracle oinstall      4984 Aug 24  2013 General_Purpose.dbc
-rw-r--r-- 1 oracle oinstall     11489 May  1  2013 New_Database.dbt
-rwxr-xr-x 1 oracle oinstall   9748480 Aug 27  2013 Seed_Database.ctl
-rwxr-xr-x 1 oracle oinstall 275750912 Aug 27  2013 Seed_Database.dfb

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

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

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

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

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

mkdir -p /U01/app/oracle/oradata/testdb/

1、如何处理参数文件

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

db_name=seeddata
sga_target=500M
control_files=/U01/app/oracle/oradata/testdb/control01.ctl

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

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

SQL> startup nomount
ORACLE instance started.
Total System Global Area  521936896 bytes
Fixed Size         2254824 bytes

2、如何处理控制文件

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

cp Seed_Database.ctl  /U01/app/oracle/oradata/testdb/control01.ctl

SQL> alter database mount; Database altered.

3、如何处理Redo日志

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

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

SQL> select member from v$logfile;
MEMBER
---------------------------------------------------
/ade/b/2232964209/oracle/oradata/seeddata/redo01.log
/ade/b/2232964209/oracle/oradata/seeddata/redo02.log
/ade/b/2232964209/oracle/oradata/seeddata/redo03.log

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

alter database rename file '/ade/b/2232964209/oracle/oradata/seeddata/redo01.log' to '/U01/app/oracle/oradata/testdb/redo01.log';
alter database rename file '/ade/b/2232964209/oracle/oradata/seeddata/redo02.log' to '/U01/app/oracle/oradata/testdb/redo02.log';
alter database rename file '/ade/b/2232964209/oracle/oradata/seeddata/redo03.log' to '/U01/app/oracle/oradata/testdb/redo03.log';

4、如何处理数据文件

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

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

RMAN> catalog start with '/U01/app/oracle/product/11.2.0.4/assistants/dbca/templates/Seed_Database.dfb';

run {set newname for datafile 1 to '/U01/app/oracle/oradata/testdb/system01.dbf';  set newname for datafile 2 to '/U01/app/oracle/oradata/testdb/sysaux01.dbf';  set newname for datafile 3 to '/U01/app/oracle/oradata/testdb/undotbs01.dbf';  set newname for datafile 4 to '/U01/app/oracle/oradata/testdb/user01.dbf';  restore database;  switch datafile all;  recover database;  }

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

RMAN-08187: WARNING: media recovery until SCN 925701 complete
Finished recover at 2016-12-03 22:34:1

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

SQL> alter database open resetlogs;
Database altered.

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

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

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

SQL>select file_name from dba_temp_files
                      *
ERROR at line 1:
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201:
'/ade/b/2232964209/oracle/oradata/seeddata/temp01.dbf'

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

alter tablespace temp add tempfile  '/U01/app/oracle/oradata/testdb/temp01.dbf' size 100m;
alter tablespace temp drop tempfile '/ade/b/2232964209/oracle/oradata/seeddata/temp01.dbf'

6、如何修改db_name

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

startup mount

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

nid target=sys/oracle dbname=testdb

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

db_name=testdb
sga_target=500M
control_files=/U01/app/oracle/oradata/testdb/control01.ctl
compatible=11.2.0.4  --我使用的当前版本为11.2.0.4

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

SQL>startup mount
SQL>alter database open resetlogs;

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

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

五、解析DBCA的调用脚本

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

得到DBCA的静默创建脚本很简单,就是添加一个generateScripts选项即可。

比如下面的方式,输出会告诉你一个路径。假设db name为testdb1:

dbca -silent -createDatabase -templateName $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc -gdbname testdb1 -sid testdb1  -characterSet ZHS16GBK  -sysPassword oracle -systemPassword oracle -generateScripts

那么RMAN还原的过程呢,本质上RMAN的核心就是dbms_backup_restore,dbms_rcvman的包。我们可以在得到的脚本中看到。

重点工作就是下面的这句:

dbms_backup_restore.restoreBackupPiece('/U01/app/oracle/product/10.2/assistants/dbca/templates/Seed_Database.dfb', done);

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

-rw-r----- 1 oracle oinstall 2165 Dec  3 22:04 cloneDBCreation.sql
-rw-r----- 1 oracle oinstall  286 Dec  3 22:04 CloneRmanRestore.sql
-rw-r----- 1 oracle oinstall 2061 Dec  3 22:04 init.ora
-rw-r----- 1 oracle oinstall 2155 Dec  3 22:04 inittestdb1Temp.ora
-rw-r----- 1 oracle oinstall  510 Dec  3 22:04 lockAccount.sql
-rw-r----- 1 oracle oinstall  726 Dec  3 22:04 postDBCreation.sql
-rw-r----- 1 oracle oinstall  649 Dec  3 22:04 postScripts.sql
-rw-r----- 1 oracle oinstall 1373 Dec  3 22:04 rmanRestoreDatafiles.sql
-rw-r----- 1 oracle oinstall  399 Dec  3 22:04 testdb1.log
-rwxr-xr-x 1 oracle oinstall  704 Dec  3 22:04 testdb1.sh
-rwxr-xr-x 1 oracle oinstall  554 Dec  3 22:04 testdb1.sql

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

@/U01/app/oracle/admin/testdb1/scripts/CloneRmanRestore.sql
@/U01/app/oracle/admin/testdb1/scripts/cloneDBCreation.sql
@/U01/app/oracle/admin/testdb1/scripts/postScripts.sql
@/U01/app/oracle/admin/testdb1/scripts/lockAccount.sql
@/U01/app/oracle/admin/testdb1/scripts/postDBCreation.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,比如:

SQL>CREATE PLUGGABLE DATABASE testpdb ADMIN USER pdb_mgr IDENTIFIED BY xxx file_name_convert=('/U01/app/oracle/oradata/testdb,'/U01/app/oracle/oradata/testdb/testpdb);
Pluggable database created.

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

2、通过DBCA创建Data Guard

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

小结

https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650758572&idx=1&sn=25bae987dff39123f4ce68efce3f5013&chksm=f3f9e839c48e612f2a12067edb504ee94390dd5682a24911abd1cc40622c9d9ad02301f897e5&mpshare=1&scene=1&srcid=1207vBbf6OOuHhuXsgsMLc6z&pass_ticket=DG34ntoCYmAAfiOx6wXTxorQVF3AKr5g3LCjZkgmUZqlsENpB4OIG%2FtXc4QXJD39#rd

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

转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户的更多相关文章

  1. 轻量级高性能ORM框架:Dapper高级玩法

    Dapper高级玩法1: 数据库中带下划线的表字段自动匹配无下划线的Model字段. Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true; 备 ...

  2. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  3. 【Python基础】random 的高级玩法

    random 模块的高级玩法 1.python 随机产生姓名 方式一: import random xing = [ '赵', '钱', '孙', '李', '周', '吴', '郑', '王', ' ...

  4. Word 查找替换高级玩法系列之 -- 段首批量添加字符

    打开「查找和替换」输入框,按照下图操作: 更多查找替换高级玩法,参看:Word查找替换高级玩法系列 -- 目录篇 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)

  5. Word 查找替换高级玩法系列之 -- 把论文中的缩写词快速变成目录下边的注释表

    1. 前言 问题:Word写论文如何把文中的缩写快速转换成注释表? 原来样子: 想要的样子: 2. 步骤 使用查找替换高级用法,替换缩写顺序 选中所有文字 打开查找替换对话框,输入以下表达式: 替换后 ...

  6. maven 高级玩法

    maven 高级玩法 标签(空格分隔): maven 实用技巧 Maven 提速 多线程 # 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建 $ mvn -T 4 clean ...

  7. 十五天精通WCF——第九天 高级玩法之自定义Behavior

    终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...

  8. [转]十五天精通WCF——第九天 高级玩法之自定义Behavior

    终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...

  9. .Net中集合排序的一种高级玩法

    背景: 学生有名称.学号, 班级有班级名称.班级序号 学校有学校名称.学校编号(序号) 需求 现在需要对学生进行排序 第一排序逻辑 按学校编号(序号)排列 再按班级序号排列 再按学生学号排列 当然,在 ...

随机推荐

  1. mysql 批量修改表前缀

    直接贴码: SELECT a.*, concat( 'alter table ', a.TABLE_NAME, ' rename ge_', SUBSTR( a.TABLE_NAME FROM INS ...

  2. 【转载】FaceBook - How to add a Privacy Policy to your Apps?

    When you read through the Facebook Platform Policies, you'll notice that every Facebook App that sto ...

  3. 【Python@Thread】threading模块

    theading模块的Thread类 属性: name 线程名 ident 线程标识符 daemon  布尔值,标示是否为守护线程 方法: __init__(target=None, name=Non ...

  4. HTTP Status 400 - Required request part 'file' is not present

    今天使用Spring MVC做一个文件上传的功能,在提交表单的时候出现了如下错误:

  5. Jbpm工作流表补数记录

    一: 历史数据表 11.  JBPM4_HIST_ACTINST 流程活动(节点)实例表 存放Activity Instance的历史记录 12.  JBPM4_HIST_DETAIL  流程历史详细 ...

  6. Sublime Text学习笔记

    1.快捷键(Key Bindings)   Preferences -> Key Bindings ->Default   会打开一个配置文件,里面全是配置信息 2.代码片段(Snippe ...

  7. Time complexity of ArrayList in Java

    The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. The add ope ...

  8. 调用CImg库显示WAV格式音频波形

    最近在做傅里叶变换和小波变换时经常要通过显示波形来检验算法,但通过visual studio之类显示波形又显得麻烦,而且不能跨平台. CImg是一个跨平台的C++的图像处理库,提供的图像处理等功能十分 ...

  9. Session和Cookie的使用总结

    Session和Cookie的使用总结: Session和cookie都是asp.Net中的内置对象,至于他们有什么区别,在这里就不在多说,现在来说说一些比较实用点的东西: 我们知道网站都有一个后台管 ...

  10. html5实现滚动文字

    <div class="custom-notice"> <i class="icon-notice"></i> <ma ...