• 【转载】ORACLE 10G DBCA创建脚本实现手动创建数据库


    【oracle】oracle 10g数据库创建脚本实现手动创建数据库

     

    把使用DBCA 创建数据库时的输出的脚本拿来研究研究,并参照脚本文件,手动实现一个数据库的创建过程。首先使用DBCA工具创建一份建库脚本,整个脚本文件包含如下文件,
    感觉应该是从BAT文件开始入手,打开BAT文件查看内容如下:
    mkdir f:\oracle\product\10.2.0\admin\test\adump
    mkdir f:\oracle\product\10.2.0\admin\test\bdump
    mkdir f:\oracle\product\10.2.0\admin\test\cdump
    mkdir f:\oracle\product\10.2.0\admin\test\dpdump
    mkdir f:\oracle\product\10.2.0\admin\test\pfile
    mkdir f:\oracle\product\10.2.0\admin\test\udump
    mkdir f:\oracle\product\10.2.0\db_1\cfgtoollogs\dbca\test
    mkdir f:\oracle\product\10.2.0\db_1\dbs
    mkdir f:\oracle\product\10.2.0\oradata\test
    set ORACLE_SID=test
    f:\oracle\product\10.2.0\db_1\bin\oradim.exe -new -sid TEST -startmode manual -spfile
    f:\oracle\product\10.2.0\db_1\bin\oradim.exe -edit -sid TEST -startmode auto -srvcstart system
    f:\oracle\product\10.2.0\db_1\bin\sqlplus /nolog @f:\test\scripts\test.sql
    发现原来ORACLE先创建了一批相关的文件目录,于是效仿在%oracle_home%下建立对应的目录。此处有两种方法可供选择:
    1.通过WINDOWS的可视界面创建
    2.通过命令行工具使用如下命令创建(直接偷他的了)
    mkdir f:\oracle\product\10.2.0\admin\test\adump
    mkdir f:\oracle\product\10.2.0\admin\test\bdump
    mkdir f:\oracle\product\10.2.0\admin\test\cdump
    mkdir f:\oracle\product\10.2.0\admin\test\dpdump
    mkdir f:\oracle\product\10.2.0\admin\test\pfile
    mkdir f:\oracle\product\10.2.0\admin\test\udump
    mkdir f:\oracle\product\10.2.0\db_1\cfgtoollogs\dbca\test
    mkdir f:\oracle\product\10.2.0\db_1\dbs
    mkdir f:\oracle\product\10.2.0\oradata\test
    创建完成相关目录后,继续向下,发现他在BAT文件中执行了set ORACLE_SID=test,设置环境变量,它设置我也照着设置,进入CMD,直接输入set ORACLE_SID=test
    完成环境变量设置后继续向下,
    f:\oracle\product\10.2.0\db_1\bin\oradim.exe -new -sid TEST -startmode manual -spfile
    f:\oracle\product\10.2.0\db_1\bin\oradim.exe -edit -sid TEST -startmode auto -srvcstart system
    他创建并编辑了一个新的实例(不知道此处为何要先创建它以manual方式启动后有更改为auto 方式启动,望高手指点迷津),既然他创建了一个实例,我也同样创建一个实例,在CMD中输入 oradim –new –sid test创建一个名为test的实例。
    在完成实例创建后,发现他在执行如下语句:
    f:\oracle\product\10.2.0\db_1\bin\sqlplus /nolog @f:\test\scripts\test.sql
    我对此步理解为使用/nolog方式登录sqlplus然后执行名为test.sql的文件,打开test.sql文件,内容如下:
    set verify off
    PROMPT specify a password for sys as parameter 1;
    DEFINE sysPassword = &1
    PROMPT specify a password for system as parameter 2;
    DEFINE systemPassword = &2
    PROMPT specify a password for sysman as parameter 3;
    DEFINE sysmanPassword = &3
    PROMPT specify a password for dbsnmp as parameter 4;
    DEFINE dbsnmpPassword = &4
    host f:\oracle\product\10.2.0\db_1\bin\orapwd.exe file=f:\oracle\product\10.2.0\db_1\database\PWDtest.ora password=&&sysPassword force=y
    @f:\test\scripts\CloneRmanRestore.sql
    @f:\test\scripts\cloneDBCreation.sql
    @f:\test\scripts\postScripts.sql
    host "echo SPFILE='f:\oracle\product\10.2.0\db_1/dbs/spfiletest.ora' > f:\oracle\product\10.2.0\db_1\database\inittest.ora"
    @f:\test\scripts\postDBCreation.sql
    研读后发现他先是在%oracle_home%\database下创建了SYS用户登录认证的密码文件,于是效仿他的操作,进入CMD,执行
    orapwd file=f:\oracle\product\10.2.0\db_1\database\PWDtest.ora password=test force=y,在%oracle_home%\database下创建一个名为PWDtest.ora的密码文件,且指定密码为test.
    创建完成密码文件后,发现他接着执行了名为CloneRmanRestore.sql的文件,打开CloneRmanRestore.sql后发现内容如下
    connect "SYS"/"&&sysPassword" as SYSDBA  --使用刚才创建的SYS密码以DBA方式连接
    set echo on
    spool f:\test\scripts\CloneRmanRestore.log      --记录日志,不管它
    startup nomount pfile="f:\test\scripts\init.ora";   --以init.ora中参数启动数据库为nomount模式
    @f:\test\scripts\rmanRestoreDatafiles.sql;      --执行rmanRestoreDatafiles.sql
    于是参照文档使用/NOLOG方式登录sqlplus,使用conn sys/test as sysdba连接,连接成功后执行 startup nomount pfile="f:\test\scripts\init.ora"启动数据库,发现报错信息如下
    SQL> startup nomount pfile="f:\test\scripts\init.ora"
    ORA-01031: insufficient privileges
    将init.ora文件复制到%oracle_home%\database下改名为inittest.ora,
    使用SQL> startup nomount 启动
    启动完成后,他执行名为rmanRestoreDatafiles.sql的文件来创建数据文件,打开rmanRestoreDatafiles.sql,内容如下:
    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.restoreDataFileTo(1, 'f:\oracle\product\10.2.0\oradata\test\SYSTEM01.DBF', 0, 'SYSTEM');
          dbms_backup_restore.restoreDataFileTo(2, 'f:\oracle\product\10.2.0\oradata\test\UNDOTBS01.DBF', 0, 'UNDOTBS1');
          dbms_backup_restore.restoreDataFileTo(3, 'f:\oracle\product\10.2.0\oradata\test\SYSAUX01.DBF', 0, 'SYSAUX');
          dbms_backup_restore.restoreDataFileTo(4, 'f:\oracle\product\10.2.0\oradata\test\USERS01.DBF', 0, 'USERS');
        dbms_output.put_line(' Restoring ... ');
        dbms_backup_restore.restoreBackupPiece('f:\oracle\product\10.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创建数据库时,数据文件是从种子数据库Seed_Database.dfb中恢复出来的,避免了创建文件及字典对象等信息,提高数据库的创建速度。执行后,他在%oracle_home%\oradata\的对应数据库文件下恢复出来四个文件,分别为SYSTEM01.DBF、UNDOTBS01.DBF、SYSAUX01.DBF、USERS01.DBF。
    回到前面test.sql文件中,接下来被执行的语句是:@f:\test\scripts\cloneDBCreation.sql,打开cloneDBCreation.sql仔细阅读后,发现使用DBCA创建数据库时采用的是 “克隆”一个数据库的方式,由于上一步执行rmanRestoreDatafiles.sql时我们重种子数据库中恢复出来了数据文件,因此接下来执行的语句就是要在恢复出来的文件上进行“克隆”并对其进行改造。
    首先
    Create controlfile reuse set database "test"
    MAXINSTANCES 8
    MAXLOGHISTORY 1
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    Datafile
    'f:\oracle\product\10.2.0\oradata\test\SYSTEM01.DBF',
    'f:\oracle\product\10.2.0\oradata\test\UNDOTBS01.DBF',
    'f:\oracle\product\10.2.0\oradata\test\SYSAUX01.DBF',
    'f:\oracle\product\10.2.0\oradata\test\USERS01.DBF'
    LOGFILE GROUP 1 ('f:\oracle\product\10.2.0/oradata/test/redo01.log') SIZE 51200K,
    GROUP 2 ('f:\oracle\product\10.2.0/oradata/test/redo02.log') SIZE 51200K,
    GROUP 3 ('f:\oracle\product\10.2.0/oradata/test/redo03.log') SIZE 51200K RESETLOGS;
    使用上边的语句创建控制文件,然后通过执行exec dbms_backup_restore.zerodbid(0);清空数据文件头的部分信息,zeroDbid主要用于清除数据文件头的3类信息:Database id信息、Checksum信息和Checksum符号位信息。
    信息清除后,执行shutdown immediate;
    startup nomount pfile="f:\test\scripts\inittestTemp.ora";
    重启数据库,此时重启时使用了inittestTemp.ora文件,区别于最初重启时的init.ora文件,在末尾处多了_no_recovery_through_resetlogs=true,查阅相关资料后得知这个参数用于限制恢复能否跨越resetlogs,对于数据库的恢复来说,resetlogs通常意味着不完全恢复,在数据库resetlogs打开之后,控制文件中的很多信息被改写,在Oracle 10g之前,如果数据库resetlogs打开,那么将不再能够通过当前的控制文件再次进行resetlogs点之前的恢复,而Oracle 10g改变了这个历史。在Oracle 10g中,即使通过resetlogs方式打开了数据库,Oracle仍然支持再次从resetlogs时间点之前进行恢复;在Clone数据库时,Oracle设置这个参数为True,意思就是不允许再次进行跨越resetlogs时间点的恢复。然后使用
    Create controlfile reuse set database "test"
    MAXINSTANCES 8
    MAXLOGHISTORY 1
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    Datafile
    'f:\oracle\product\10.2.0\oradata\test\SYSTEM01.DBF',
    'f:\oracle\product\10.2.0\oradata\test\UNDOTBS01.DBF',
    'f:\oracle\product\10.2.0\oradata\test\SYSAUX01.DBF',
    'f:\oracle\product\10.2.0\oradata\test\USERS01.DBF'
    LOGFILE GROUP 1 ('f:\oracle\product\10.2.0/oradata/test/redo01.log') SIZE 51200K,
    GROUP 2 ('f:\oracle\product\10.2.0/oradata/test/redo02.log') SIZE 51200K,
    GROUP 3 ('f:\oracle\product\10.2.0/oradata/test/redo03.log') SIZE 51200K RESETLOGS;
    重写控制文件。
    接下来Oracle设置restricted session模式,resetlogs打开数据库:
    alter system enable restricted session;
    alter database "test" open resetlogs;
    修改global_name,添加临时文件等:
    alter database rename global_name to "test";
    ALTER TABLESPACE TEMP ADD TEMPFILE 'f:\oracle\product\10.2.0\oradata\test\TEMP01.DBF' SIZE 20480K REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;
    select tablespace_name from dba_tablespaces where tablespace_name='USERS';
    select sid, program, serial#, username from v$session;
    由于种子数据库的字符集通常与用户要求的不符,接下来Oracle通过内部操作强制更改了字符集、国家字符集(这个内容在后面的章节有详细的介绍):
    alter database character set INTERNAL_CONVERT ZHS16GBK;
    alter database national character set INTERNAL_CONVERT AL16UTF16;
    最后修改用户口令,禁用restricted session模式,这个克隆过程执行完毕:
    alter user sys identified by "&&sysPassword";
    alter user system identified by "&&systemPassword";
    alter system disable restricted session;
    至此,完成了通过克隆方式创建数据库的过程。
    完成以上步骤以后,ORACLE继续执行postScripts.sql已完成相应的维护工作,打开该文件发现内容如下:
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo on
    spool f:\test\scripts\postScripts.log
    @f:\oracle\product\10.2.0\db_1\rdbms\admin\dbmssml.sql;
    execute dbms_datapump_utl.replace_default_dir;
    commit;
    connect "SYS"/"&&sysPassword" as SYSDBA
    alter session set current_schema=ORDSYS;
    @f:\oracle\product\10.2.0\db_1\ord\im\admin\ordlib.sql;
    alter session set current_schema=SYS;
    connect "SYS"/"&&sysPassword" as SYSDBA
    connect "SYS"/"&&sysPassword" as SYSDBA
    alter user CTXSYS account unlock identified by change_on_install;
    connect "CTXSYS"/"change_on_install"
    @f:\oracle\product\10.2.0\db_1\ctx\admin\defaults\dr0defdp.sql;
    @f:\oracle\product\10.2.0\db_1\ctx\admin\defaults\dr0defin.sql "SIMPLIFIED CHINESE";
    connect "SYS"/"&&sysPassword" as SYSDBA
    execute dbms_swrf_internal.cleanup_database(cleanup_local => FALSE);
    commit;
    spool off
    最后执行的脚本是postDBCreation.sql,在这个脚本中将创建spfile,解锁SYSMAN、DBSNMP用户,编译失效对象并配置DB Control:
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo on
    spool f:\test\scripts\postDBCreation.log
    connect "SYS"/"&&sysPassword" as SYSDBA
    set echo on
    create spfile='f:\oracle\product\10.2.0\db_1/dbs/spfiletest.ora' FROM pfile='f:\test\scripts\init.ora';
    shutdown immediate;
    connect "SYS"/"&&sysPassword" as SYSDBA
    startup ;
    alter user SYSMAN identified by "&&sysmanPassword" account unlock;
    alter user DBSNMP identified by "&&dbsnmpPassword" account unlock;
    select 'utl_recomp_begin: ' || to_char(sysdate, 'HH:MI:SS') from dual;
    execute utl_recomp.recomp_serial();
    select 'utl_recomp_end: ' || to_char(sysdate, 'HH:MI:SS') from dual;
    host f:\oracle\product\10.2.0\db_1\bin\emca.bat -config dbcontrol db -silent -DB_UNIQUE_NAME test -PORT 1521 -EM_HOME f:\oracle\product\10.2.0\db_1 -LISTENER LISTENER -SERVICE_NAME test -SYS_PWD &&sysPassword -SID test -ORACLE_HOME f:\oracle\product\10.2.0\db_1 -DBSNMP_PWD &&dbsnmpPassword -HOST 0d819df6bbbd490 -LISTENER_OH f:\oracle\product\10.2.0\db_1 -LOG_FILE f:\test\scripts\emConfig.log -SYSMAN_PWD &&sysmanPassword;
    spool f:\test\scripts\postDBCreation.log
    exit;
    到此处,整个数据库创建脚本就已经执行完成,通过这个过程我们创建了一个名为TEST的数据库。

  • 相关阅读:
    【Django总结】详解Django admin高级用法
    【Django总结】Django model中的class Meta详解
    【Django总结】django中的objects.get和objects.filter方法的区别
    【Django总结】Django的时间字段DateTimeField
    【Django总结】Django数据模型的一些字段解析
    codechef Chef and Chefcoin
    codechef Hikaru, Touya and Waya
    [CmdOI2019]口头禅
    Codeforces Round #664 (Div. 1)(E未做)
    AtCoder Grand Contest 034
  • 原文地址:https://www.cnblogs.com/SEEKTHINKING/p/2020709.html
Copyright © 2020-2023  润新知