【DB笔试面试853】在Oracle中,什么是手动建库?手动建库有哪些步骤?

时间:2022-07-22
本文章向大家介绍【DB笔试面试853】在Oracle中,什么是手动建库?手动建库有哪些步骤?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题

在Oracle中,什么是手动建库?手动建库有哪些步骤?

答案

有时候因为环境的缘故不能使用图形界面或者不能使用DBCA的静默方式来创建一个新库,那么这个时候可以考虑使用“CREATE DATABASE”这种SQL命令行来创建数据库,该方式称为手动建库方式。使用手动建库的优点是:可以用脚本来创建数据库。另外,在OCM的考试中也要求DBA进行手动建库。

CREATE DATABASE命令详解如下所示:

CREATE DATABASE {DB_NAME}   --> #数据库名,一般与ORACLE_SID相同
USER SYS IDENTIFIED BY {密码}       --> #若不设置则默认为“change_on_install”
USER SYSTEM IDENTIFIED BY {密码}    --> #若不设置则默认为“manager”
MAXLOGFILES 5       --> #最大日志组数
MAXLOGMEMBERS 5    --> #日志组中最多成员数
MAXLOGHISTORY 1     --> #RAC环境下有效
MAXDATAFILES 100    --> #最大数据文件数,在Oracle 9i后,由DB_FILES参数来控制“最大数据文件数”
LOGFILE GROUP 1 ('/oradata/orcl/redo01a.log','/oradata/orcl/redo01b.log') size 50M,
         GROUP 2 ('/oradata/orcl/redo02a.log','/oradata/orcl/redo02b.log') size 50M,
         GROUP 3 ('/oradata/orcl/redo03a.log','/oradata/orcl/redo03b.log') size 50M
                    --> #创建日志组及组中成员
CHARACTER SET ZHS16GBK     --> #数据库字符集
NATIONAL CHARACTER SET AL16UTF16    --> #国家字符集
EXTENT MANAGEMENT LOCAL        --> #指定SYSTEM表空间中扩展段的管理方式 [ LOCAL | DICTIONARY ]
DATAFILE '/oradata/orcl/system01.dbf' SIZE 500M    --> #创建“SYSTEM表空间”
SYSAUX DATAFILE '/oradata/orcl/sysaux01.dbf' SIZE 500M   --> #创建“SYSAUX表空间”
DEFAULT TABLESPACE USERS DATAFILE '/oradata/orcl/users01.dbf' SIZE 500M AUTOEXTEND ON MAXSIZE UNLIMITED --> #创建“默认(永久)表空间”
DEFAULT TEMPORARY TABLESPACE TEMPTBS
TEMPFILE '/oradata/orcl/temp01.dbf' SIZE 300M    --> #创建“默认临时表空间”
UNDO TABLESPACE UNDOTBS1 DATAFILE '/oradata/orcl/undotbs01.dbf' SIZE 300M AUTOEXTEND ON MAXSIZE UNLIMITED        --> #创建“UNDO表空间”,这里的UNDO表空间名,一定要与“参数文件中的UNDO表空间”名称一样,否则创建失败
SET TIME_ZONE = '+08:00';      --> #指定时区

CREATE DATABASE的其它子句:

MAXINSTANCES                --> #用于RAC下,表示一个数据库最多可以有多少个实例
NOARCHIVELOG / ARCHIVELOG   --> #非归档模式 / 归档模式
FORCE LOGGING            --> #除了对临时表空间的操作,对其他对象的所有操作都需要记到日志中 
SET DEFAULT SMALLFILE | BIGFILE TABLESPACE  --> #指定表空间的物理实现方式,SMALLFILE表示一个表空间可以有一个或多个数据文件组成,BIGFILE表示一个表空间只能有一个数据文件组成(一般用于ASM环境下)

下面给出手动建库的一般过程:

(一)指定实例标示符(SID)

为实例设置一个唯一的Oracle系统标示符(SID),以下命令为在Linux系统中为实例设置SID的方式。需要说明的是,数据库名称最大支持8个字符,若超过8个字符,则在数据库启动的时候会报“ORA-01127: database name 'lhrdba11g' exceeds size limit of 8 characters”的错误。

[oracle@rhel6lhr ~]$ export ORACLE_SID=lhrdb11g

(二)确保环境变量设置设置正确

不同的操作系统平台,在启动SQL*Plus之前,首先需要配置Oracle用户的环境变量。在大多数操作系统平台上,ORACLE_HOME和ORACLE_SID是必须设置的环境变量。此外,最好将ORACLE_HOME/bin加入PATH环境变量中。在Linux操作系统中,这些环境变量必须手动设置;在Windows平台上,OUI会自动在Windows注册表中指定这些环境变量的值。以下示例为Linux环境的Oracle用户变量设置:

[oracle@rhel6lhr ~]$ pwd
/home/oracle
[oracle@rhel6lhr ~]$ more .bash_profile 
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
export ORACLE_SID=lhrdb11g
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export LD_LIBRARY_PATH=/u01/app/oracle/11g/lib:/lib:/usr/lib:/usr/local/lib:/usr/X11R6/lib
export TNS_ADMIN=/u01/app/oracle/11g/network/admin
export PATH=$PATH:$ORACLE_HOME/bin

(三)创建密码文件

在用SQL*Plus连接创建数据库时,当前操作系统用户必须被授予相应的系统权限进行权限认证,可以通过以下两种方式来实现管理权限认证:

① 密码文件认证:可以通过orapwd命令创建密码文件

② 操作系统认证:确保当前登录的操作系统用户已经加入对应的操作系统用户组

示例如下所示:

[oracle@rhel6lhr ~]$ id oracle
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba)
[oracle@rhel6lhr ~]$ orapwd file=$ORACLE_HOME/dbs/orapwlhrdb11g password=lhr force=y #创建密码文件

(四)创建初始化参数文件和相关路径

创建文本形式的初始化参数文件(PFILE),在后面的步骤中,可以根据该文本文件来创建服务器参数文件(SPFILE)。如果是手动创建初始化参数文件,确保其至少包含DB_NAME、CONTROL_FILES和MEMORY_TARGET这三个参数。

为了方便,初始化参数文件存储在Oracle默认的位置($ORACLE_HOME/dbs/),使用默认的文件名。这样,在打开数据库的时候,Oracle会自动查找默认初始化参数路径,就不需要指定pfile参数即可。

PFILE示例如下所示:

[oracle@rhel6lhr ~]$ more $ORACLE_HOME/dbs/initlhrdb11g.ora
db_name='lhrdb11g'
memory_target=400437056
processes = 300
audit_file_dest='/u01/app/oracle/admin/lhrdb11g/adump'
audit_trail ='db'
db_block_size=8192
db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='/u01/app/oracle'
dispatchers='(PROTOCOL=TCP) (SERVICE=MYNEWDBXDB)'
open_cursors=300 
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files = '/u01/app/oracle/oradata/lhrdb11g/control01.ctl','/u01/app/oracle/flash_recovery_area/lhrdb11g/control02.ctl'
compatible ='11.2.0'

创建相关路径:

mkdir -p /u01/app/oracle/admin/lhrdb11g/adump
mkdir -p /u01/app/oracle/flash_recovery_area/lhrdb11g/
mkdir -p /u01/app/oracle/oradata/lhrdb11g/

(五)连接实例

如果是Windows操作系统环境,在连接实例之前需要使用oradim命令创建一个实例,命令格式如下:

oradim -NEW -SID sid -STARTMODE MANUAL -PFILE pfile

这里使用的是Linux系统,所以上面的步骤就不需要了,直接通过下面的命令来连接数据库实例:

[oracle@rhel6lhr ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Sun Mar 19 12:54:16 2017
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to an idle instance.
SYS@lhrdb11g > 

(六)创建服务器参数文件(SPFILE)

可以通过ALTER SYSTEM命令修改服务器参数文件(SPFILE),而且需要重启数据库后才生效,可以通过文本初始化文件来创建服务器参数文件。

SYS@lhrdb11g > CREATE SPFILE FROM PFILE;
File created.

上面的命令会自动从默认位置的默认名称读取文本初始化参数文件(PFILE),然后根据初始化参数文件来创建服务器参数文件;同时服务器参数文件(SPFILE)的存放路径和命名格式会采用Oracle默认的。

(七)启动实例

在不启动数据库的情况下,以NOMOUNT选项加载数据库,因为初始化参数文件或服务器参数文件被存储在默认的路径,所以这里不需要指定PFILE参数。而且这里只是加载实例内存和启动实例进程,数据库本身还是不存在的。

SYS@lhrdb11g > startup nomount
ORACLE instance started.
Total System Global Area  400846848 bytes
Fixed Size                  2228784 bytes
Variable Size             268438992 bytes
Database Buffers          121634816 bytes
Redo Buffers                8544256 bytes

(八)执行CREATE DATABASE命令

SYS@lhrdba11g> @/tmp/create_db.sql
Database created.
SYS@lhrdba11g > select status from v$instance;
STATUS
------------------------
OPEN
SYS@lhrdba11g> !more /tmp/create_db.sql
CREATE DATABASE lhrdb11g
USER SYS IDENTIFIED BY lhrdb11g
USER SYSTEM IDENTIFIED BY lhrdb11g
LOGFILE GROUP 1('/u01/app/oracle/oradata/lhrdb11g/redo01a.log','/u01/app/oracle/oradata/lhrdb11g/redo01b.log') SIZE 10M BLOCKSIZE 512,
GROUP 2('/u01/app/oracle/oradata/lhrdb11g/redo02a.log','/u01/app/oracle/oradata/lhrdb11g/redo02b.log') SIZE 10M blocksize 512,
GROUP 3('/u01/app/oracle/oradata/lhrdb11g/redo03a.log','/u01/app/oracle/oradata/lhrdb11g/redo03b.log') SIZE 10M BLOCKSIZE 512
MAXLOGFILES 5 MAXLOGMEMBERS 5 MAXLOGHISTORY 1 MAXDATAFILES 100
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DATAFILE '/u01/app/oracle/oradata/lhrdb11g/system01.dbf' SIZE 200M REUSE
SYSAUX DATAFILE '/u01/app/oracle/oradata/lhrdb11g/sysaux01.dbf' SIZE 100M REUSE
DEFAULT TABLESPACE users DATAFILE '/u01/app/oracle/oradata/lhrdb11g/users01.dbf' SIZE 10M
REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE '/u01/app/oracle/oradata/lhrdb11g/temp01.dbf'
SIZE 20M REUSE
UNDO TABLESPACE undotbs1
DATAFILE '/u01/app/oracle/oradata/lhrdb11g/undotbs01.dbf'
SIZE 20M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
/

这里根据需要也可以创建BIGFILE形式的表空间,但是常见的错误有“ORA-01519”和“ORA-32772”,该错误主要是由于语句“SET DEFAULT BIGFILE TABLESPACE”的位置不对引起的。如下给出一个正确的脚本:

CREATE DATABASE lhrasm
USER SYS IDENTIFIED BY lhr
USER SYSTEM IDENTIFIED BY lhr
CONTROLFILE REUSE
CONTROLFILE REUSE
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL   
ARCHIVELOG
MAXLOGFILES 192 MAXLOGMEMBERS 5 MAXLOGHISTORY 292 MAXDATAFILES 1024 MAXINSTANCES 32
LOGFILE GROUP 1('+DATA','+DATA') SIZE 50M BLOCKSIZE 512,
    GROUP 2('+DATA','+DATA') SIZE 50M blocksize 512,
    GROUP 3('+DATA','+DATA') SIZE 50M BLOCKSIZE 512
DATAFILE '+DATA' SIZE 300M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED 
SYSAUX DATAFILE '+DATA' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED 
SET DEFAULT bigfile TABLESPACE
DEFAULT TEMPORARY TABLESPACE TEMP  TEMPFILE '+DATA' SIZE 20M REUSE AUTOEXTEND OFF 
UNDO TABLESPACE UNDOTBS1 DATAFILE '+DATA'SIZE 50M REUSE AUTOEXTEND OFF 
DEFAULT TABLESPACE USERS   DATAFILE '+DATA' SIZE 500M REUSE AUTOEXTEND OFF 
;

(九)创建其它表空间

SQL> CREATE TABLESPACE apps_tbs LOGGING
   DATAFILE '/u01/app/oracle/oradata/lhrdb11g/apps01.dbf'
   SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   EXTENT MANAGEMENT LOCAL;
Tablespace created.

(十)运行脚本创建数据字典视图

运行如下脚本创建数据字典,该过程比较慢:

SPOOL /tmp/dictionary_tmp.sql
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/rdbms/admin/catclust.sql
@?/rdbms/admin/dbmspool.sql
@?/rdbms/admin/catblock.sql
@?/rdbms/admin/caths.sql
@?/rdbms/admin/owminst.plb
@?/sqlplus/admin/plustrce.sql
@?/rdbms/admin/utlrp.sql
@?/rdbms/admin/utlsampl.sql
conn system/lhr
@?/sqlplus/admin/pupbld.sql
@?/sqlplus/admin/help/hlpbld.sql helpus.sql
SPOOL off

下表是有关手动建库过程中常见脚本的用途:

脚本名称

运行用户

简介

@?/rdbms/admin/catalog.sql

SYS

创建数据字典和公共同义词,创建数据库字典的核心脚本之一

@?/rdbms/admin/catproc.sql

SYS

创建PL/SQL程序包,创建数据库字典的核心脚本之一

@?/rdbms/admin/catclust.sql

SYS

创建RAC环境的数据字典

@?/rdbms/admin/catblock.sql

SYS

可动态展示锁的信息

@?/rdbms/admin/dbmspool.sql

SYS或SYSDBA

创建DBMS_SHARED_POOL系统包,DBA可以将PL/SQL包、SQL语句或触发器放入Shared Pool中,也可以清除它们

@?/rdbms/admin/caths.sql

SYS

监控各种服务的包

@?/rdbms/admin/utlrp.sql

SYS

重新编译所有INVALID状态的PL/SQL程序,包括包、存储过程和TYPES

@?/rdbms/admin/owminst.plb

SYS

创建WMSYS用户

@?/rdbms/admin/utlsampl.sql

SYS

重建SCOTT用户

@?/rdbms/admin/utlxplan.sql

SYS

创建PLAN_TABLE表用于查询执行计划,报错信息有:“SP2-0613: Unable to verify PLAN_TABLE format or existence”和“SP2-0611: Error enabling EXPLAIN report”

@?/sqlplus/admin/pupbld.sql

SYSTEM

该脚本用于解决在登录数据库时报有关PRODUCT_USER_PROFILE的错误:“Error accessing PRODUCT_USER_PROFILE,Warning: Product user profile information not loaded!”

@?/sqlplus/admin/plustrce.sql

SYS

创建创建PLUSTRACE角色,赋予普通用户执行“set autot on”的权限,报错信息有:“SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled”和“SP2-0611: Error enabling STATISTICS report”

@?/sqlplus/admin/help/hlpbld.sql helpus.sql

SYSTEM

SQL*Plus的帮助文档

安装完成后,可以根据需要安装一些组件,详情请参考【3.2.19.7 在Oracle中有哪些常见组件?】。另外,在dbca静默安装中有个参数是sampleSchema,若设置为true,则安装后数据库中有EXAMPLE表空间,有HR、OE、PM、SH、IX用户,大约占用350M的空间,若设置为false,则后续可以参考文档(http://blog.itpub.net/26736162/viewspace-2098222/)来安装。

& 说明:

有关手动建库的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2121981/、http://blog.itpub.net/26736162/viewspace-2098205/

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

DB宝分享的IT资料:https://mp.weixin.qq.com/s/Iwsy-zkzwgs8nYkcMz29ag

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处