转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户
但凡是学过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高级玩法:从模板选择、脚本调用到多租户的更多相关文章
- 轻量级高性能ORM框架:Dapper高级玩法
Dapper高级玩法1: 数据库中带下划线的表字段自动匹配无下划线的Model字段. Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true; 备 ...
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...
- 【Python基础】random 的高级玩法
random 模块的高级玩法 1.python 随机产生姓名 方式一: import random xing = [ '赵', '钱', '孙', '李', '周', '吴', '郑', '王', ' ...
- Word 查找替换高级玩法系列之 -- 段首批量添加字符
打开「查找和替换」输入框,按照下图操作: 更多查找替换高级玩法,参看:Word查找替换高级玩法系列 -- 目录篇 未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)
- Word 查找替换高级玩法系列之 -- 把论文中的缩写词快速变成目录下边的注释表
1. 前言 问题:Word写论文如何把文中的缩写快速转换成注释表? 原来样子: 想要的样子: 2. 步骤 使用查找替换高级用法,替换缩写顺序 选中所有文字 打开查找替换对话框,输入以下表达式: 替换后 ...
- maven 高级玩法
maven 高级玩法 标签(空格分隔): maven 实用技巧 Maven 提速 多线程 # 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建 $ mvn -T 4 clean ...
- 十五天精通WCF——第九天 高级玩法之自定义Behavior
终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...
- [转]十五天精通WCF——第九天 高级玩法之自定义Behavior
终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这 ...
- .Net中集合排序的一种高级玩法
背景: 学生有名称.学号, 班级有班级名称.班级序号 学校有学校名称.学校编号(序号) 需求 现在需要对学生进行排序 第一排序逻辑 按学校编号(序号)排列 再按班级序号排列 再按学生学号排列 当然,在 ...
随机推荐
- jquery远程班备忘
基础第一课: 1. $(obj)获取的是一个集合,因此length最小是1, jquery,如果元素不存在,也不会报错,可通过$(obj).length<1就可以查看该元素是否存在. 2. at ...
- PAT 团体程序设计天梯赛-练习集 L1-003. 个位数统计
给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字 ...
- 编写高质量iOS代码的52个有效方法2-1
一.变量的定义位置(用{}声明示例变量或者用@property属性声明实例变量) 1.用{}声明示例变量: 此方法生命的实例变量,编译器在编译时,会自动计算其偏移量(表示该变量距离存放对象的内存区域的 ...
- 1.javaOOP_Part1_抽象和封装
javaOOP_Part1_抽象和封装 javaOOP_Part1_抽象和封装 1.1 面向对象 1.1.1 为什么使用面向对象 1.一切皆对象 2.现实世界就是"面向对象的" 3 ...
- mysql的字符串处理函数
一.简明总结ASCII(char) 返回字符的ASCII码值BIT_LENGTH(str) 返回字符串的比特长度CONCAT(s1,s2…,sn) 将s1,s2…,sn连接成字符串CONCAT_WS( ...
- Openjudge-计算概论(A)-比饭量
描述: 3个人比饭量,每人说了两句话: A说:B比我吃的多,C和我吃的一样多 B说:A比我吃的多,A也比C吃的多 C说:我比B吃得多,B比A吃的多. 事实上,饭量和正确断言的个数是反序的关系. 请编程 ...
- php笔记(一)面向对象编程
<?php //定义一个类 class Car { var $name = '汽车'; function getName() { return $this->name; } } //实例化 ...
- JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍(转载)
这里是JavaScript中制作滚动代码的常用属性 页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见 ...
- oracle创建数据库表空间
1.创建表空间(存放数据) create tablespace xtba_datadatafile 'F:\ORACLE\ORADATA\ORCL\XTBA.DBF'size 50mautoexten ...
- py执行系统命令
1. os.system In [32]: run = os.system("date") Thu Jan 28 09:41:25 CST 2016 In [33]: run Ou ...