之前写过一篇文章讨论手动使用CREATE DATABASE SQL语句创建数据库(http://space.itpub.net/23135684/viewspace-741905 ),这篇文章讨论DBCA图形化工具通过模板创建数据库的过程,以分析它们之间的区别。
在使用DBCA图形化工具创建数据库,执行配置的最后可以为整个过程创建脚本,如下图所示:
选中"Generate Database Creation Scripts"即可生成脚本。在指定目录下生成了如下6个文件:
上面的文件分别是临时参数文件、临时控制文件、一个还原数据库的脚本和一个删除数据库的脚本。
由此可以看出,使用DBCA图形化工具创建的数据库并不是执行CREATE DATABASE SQL语句创建的数据库,下面查看还原数据库的脚本:set verify off;
set echo off;
set serveroutput on;
select TO_CHAR(systimestamp,'YYYYMMDD HH:MI:SS') from dual;
variable devicename varchar2(255);
declare
omfname varchar2(512) := NULL;
done boolean;
begin
dbms_output.put_line(' ');
dbms_output.put_line(' Allocating device.... ');
dbms_output.put_line(' Specifying datafiles... ');
:devicename := dbms_backup_restore.deviceAllocate;
dbms_output.put_line(' Specifing datafiles... ');
dbms_backup_restore.restoreSetDataFile;
dbms_backup_restore.getOMFFileName('SYSTEM',omfname);
dbms_backup_restore.restoreDataFileTo(1, omfname, 0, 'SYSTEM');
dbms_backup_restore.getOMFFileName('SYSAUX',omfname);
dbms_backup_restore.restoreDataFileTo(2, omfname, 0, 'SYSAUX');
dbms_backup_restore.getOMFFileName('UNDOTBS1',omfname);
dbms_backup_restore.restoreDataFileTo(3, omfname, 0, 'UNDOTBS1');
dbms_backup_restore.getOMFFileName('USERS',omfname);
dbms_backup_restore.restoreDataFileTo(4, omfname, 0, 'USERS');
dbms_output.put_line(' Restoring ... ');
dbms_backup_restore.restoreBackupPiece('/u01/app/oracle/product/11.2.0/db_1/assistants/dbca/templates/Seed_Database.dfb', done);
if done then
dbms_output.put_line(' Restore done.');
else
dbms_output.put_line(' ORA-XXXX: Restore failed ');
end if;
dbms_backup_restore.deviceDeallocate;
end;
/
select TO_CHAR(systimestamp,'YYYYMMDD HH:MI:SS') from dual;
从上面的脚本不难看出,DBCA是利用dbms_backup_restore包将安装软件后固定的模板恢复到数据库,由此可以判断该模板是通过CREATE DATABASE SQL命令创建的一个数据库全库备份,所以这种方式要比CREATE DATABASE SQL语句来得要快些,但根据固定模板创建的数据库,不能完成某些属性的定制。下面是Windows 11gR2执行dbca启动安装数据库的图形化界面:

通过上图的文字可以很明显的感受到通过模板和不通过模板(定制)创建数据库的区别,“包含数据文件”为“是”表示通过模板方式创建数据库,“包含数据文件”为“否”表示通过CREATE DATABASE SQL语句方式创建数据库!
下面我们再来看一下Oracle Database自带的模板,模板的位置在$ORACLE_HOME\assistants\dbca\templates
默认情况下,Oracle软件自带了两个模板,还有默认的控制文件和一些其他文件。既然Seed_Database.dfb是一个数据库的全库备份,那么通过RMAN使用restore命令也可以将其恢复?该控制文件也可用于控制丢失情况下的数据库恢复?
注意,执行CREATE DATABASE SQL语句创建数据库是在NOMOUNT模式下完成的,使用DBCA图形化方式创建数据库是在MOUNT模式下完成的。
下面是删除数据库的脚本:set echo off;
set serveroutput on;
select TO_CHAR(systimestamp,'YYYYMMDD HH:MI:SS') from dual;
declare
begin
dbms_output.put_line(' Deleting files... ');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/redo01.log');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/redo02.log');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/redo03.log');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/sysaux01.dbf');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/system01.dbf');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/temp01.dbf');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/undotbs01.dbf');
dbms_backup_restore.deleteFile('/ade/b/157259786/oracle/oradata/seeddata/users01.dbf');
dbms_backup_restore.deleteFile('/u01/app/oracle/cfgtoollogs/dbca/mtdc/tempControl.ctl');
dbms_output.put_line(' Deleted files ... ');
end;
/
select TO_CHAR(systimestamp,'YYYYMMDD HH:MI:SS') from dual;
QQ截图20120828151213.jpg
QQ截图20120906202117.jpg
QQ截图20120906202904.jpg
dbca不同的选项.jpg
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29615408/viewspace-1384867/
,如需转载,请注明出处,否则将追究法律责任。