转载http://wenku.baidu.com/view/90a59569a98271fe910ef9b4.html
方少ORACLE DBA之路
1 作者:倪翔凤
如何创建Oracle数据库(手工创建)
在上一章里,方少演示了如何利用DBCA 来创建ORACLE 数据库,但是在这一章里方
少要告诉大家如何在命令行下通过执行CREATE DATABASE 命令来创建一个数据库,之所
以演示命令行手工创建数据库给大家是因为在OCM 的实验考试里面是不允许用DBCA 来
建库的。
要创建一个数据库,必须按照正确的顺序执行以下步骤:
(1) 创建一个参数文件和口令文件。
(2) 使用创建的参数文件在内存中构建一个实例。
(3) 执行CREATE DATABASE 命令。
(4) 运行一系列SQL 脚本生成数据字典视图和补充的PL/SQL 程序包。
(5) 运行相应SQL脚本生成Enterprise Manager Database Control 以及该数据库需要的任
何选项。
下面,我们就按照上面的步骤创建一个名为ORCL 的数据库。
在创建参数文件之前,我们得先创建一些orcl 数据库要用到的目录:
mkdir –p $ORACLE_BASE/admin/orcl/adump
mkdir –p $ORACLE_BASE/admin/orcl/bdump
mkdir –p $ORACLE_BASE/admin/orcl/cdump
mkdir –p $ORACLE_BASE/admin/orcl/dpdump
mkdir –p $ORACLE_BASE/admin/orcl/udump
mkdir –p $ORACLE_BASE/admin/orcl/pfile
mkdir –p $ORACLE_BASE/oradata/orcl
mkdir –p $ORACLE_BASE/flash_recovery_area
export ORACLE_SID=orcl
接下来,我们要在/etc/oratab 里加入如下所示的一条记录
orcl:/u01/app/oracle:Y
下面,我们要创建口令文件:
orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10 force=y
在Oracle 中,所有参数被分为“基本”参数和“高级”参数。通常,我们需要设置20
多个“基本”参数。
启动参数文件init.ora 应与下面给出的代码相似:
##########################################################################
####
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
##########################################################################
####
###########################################
# Cache and I/O
###########################################
db_block_size=8192
db_file_multiblock_read_count=16
###########################################
# Cursors and Library Cache
###########################################
open_cursors=300
###########################################
# Database Identification
###########################################
db_domain=""
db_name=orcl
###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=/u01/app/admin/orcl/bdump
core_dump_dest=/u01/app/admin/orcl/cdump
user_dump_dest=/u01/app/admin/orcl/udump
###########################################
# File Configuration
###########################################
control_files=("/u01/app/oradata/orcl/control01.ctl", "/u01/app/oradata/orcl/control02.ctl",
"/u01/app/oradata/orcl/control03.ctl")
db_recovery_file_dest=/u01/app/flash_recovery_area
db_recovery_file_dest_size=2147483648
###########################################
# Job Queues
###########################################
job_queue_processes=10
###########################################
# Miscellaneous
###########################################
compatible=10.2.0.1.0
###########################################
# NLS
###########################################
nls_territory="AMERICA"
###########################################
# Processes and Sessions
###########################################
processes=150
###########################################
# SGA Memory
###########################################
sga_target=205520896
###########################################
# Security and Auditing
###########################################
audit_file_dest=/u01/app/admin/orcl/adump
remote_login_passwordfile=EXCLUSIVE
###########################################
# Shared Server
###########################################
dispatchers="(PROTOCOL=TCP) (SERVICE=orclXDB)"
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=68157440
###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_tablespace=UNDOTBS1
准备好init.ora 参数文件之后,我们就要用它在内存中构建一个实例
-bash-3.00$ export ORACLE_SID=orcl
-bash-3.00$ sqlplus /nolog
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount pfile="/u01/app/oradata/orcl/dbs/initorcl.ora"
ORACLE instance started.
好了,实例已经启动成功,接下来要做的就是创建数据库啦。
至此,数据库已经成功创建,接下来要做的就是运行一系列SQL 脚本以生成数据字典
视图和PL/SQL 程序包。
在这之前,我们还要再做一件事,那就是为数据库创建一个默认的用户表空间USERS。
下面以SYS 用户连接数据库并执行以下SQL 文件中的代码:
$ORACLE_HOME/rdbms/admin/catalog.sql
$ORACLE_HOME/rdbms/admin/catblock.sql
$ORACLE_HOME/rdbms/admin/catproc.sql
$ORACLE_HOME/rdbms/admin/catoctk.sql
$ORACLE_HOME/rdbms/admin/owminst.plb
以SYSTEM 用户连接数据库并执行以下SQL 文件:
$ORACLE_HOME/sqlplus/admin/pupbld.sql
$ORACLE_HOME/sqlplus/admin/help/hlpbld.sql helpus.sql
以SYS 用户登录并执行以下SQL 脚本:
$ORACLE_HOME/javavm/install/initjvm.sql;
$ORACLE_HOME/xdk/admin/initxml.sql;
$ORACLE_HOME/xdk/admin/xmlja.sql;
$ORACLE_HOME/rdbms/admin/catjava.sql;
$ORACLE_HOME/rdbms/admin/catexf.sql;
以SYS 用户连接并执行以下:
$ORACLE_HOME/rdbms/admin/dminst.sql SYSAUX TEMP;
$ORACLE_HOME/ctx/admin/catctx change_on_install SYSAUX TEMP NOLOCK;
connect "CTXSYS"/"change_on_install"
$ORACLE_HOME/ctx/admin/defaults/dr0defin.sql "AMERICAN";
以SYS 用户连接并执行以下:
$ORACLE_HOME/rdbms/admin/catqm.sql change_on_install SYSAUX TEMP;
connect / as SYSDBA
$ORACLE_HOME/rdbms/admin/catxdbj.sql;
$ORACLE_HOME/rdbms/admin/catrul.sql;
以SYS 用户连接并执行以下:
$ORACLE_HOME/ord/admin/ordinst.sql SYSAUX SYSAUX;
以SYS 用户连接并执行以下:
$ORACLE_HOME/ord/im/admin/iminst.sql;
以SYS 用户连接并执行以下:
$ORACLE_HOME/olap/admin/olap.sql SYSAUX TEMP;
以SYS 用户连接并执行以下:
$ORACLE_HOME/md/admin/mdinst.sql;
以SYS 用户连接并执行以下:
$ORACLE_HOME/sysman/admin/emdrep/sql/emreposcre $ORACLE_HOME SYSMAN
&&sysmanPassword TEMP ON;
WHENEVER SQLERROR CONTINUE;
以SYS 用户连接并执行以下:
Create spfile='$ORACLE_HOME/dbs/spfileorcl.ora' FROM pfile='/u01/app/oracle/dbs/initorcl.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 $ORACLE_HOME/bin/emca -config dbcontrol db -silent -DB_UNIQUE_NAME orcl -
PORT 1521 -EM_HOME $ORACLE_HOME -LISTENER LISTENER -SERVICE_NAME
orcl.ocp10g -SYS_PWD &&sysPassword -SID orcl -ORACLE_HOME $ORACLE_HOME
-DBSNMP_PWD &&dbsnmpPassword -HOST OCP10g -LISTENER_OH
$ORACLE_HOME -LOG_FILE $ORACLE_BASE/admin/orcl/scripts/emConfig.log -
SYSMAN_PWD &&sysmanPassword;
好了,至此我们已经成功创建了ORCL 数据库。
写得比较粗枝烂造,大家见谅。
Orapwd的前世今生 (转载http://bobjoy.blog.hexun.com/14854437_d.html)
--by Goodmandqp 2006/09/15
Orapwd是oracle生成口令文件的命令。口令文件一般存放在dbs(unix/linux)或者database(win)目录下,叫做pwdsid.ora(10g) 或者orapwsid/orapw(9i及以下)
1、 为什么需要口令文件?
在数据库尚未启动的时候,负有启动数据库使命的sysdba/sysoper用户如何验证登录权限呢?
只能把sysdba/sysoper的用户名和密码记录在一个文件中,这个文件就是口令文件。
所有sysdba以及sysoper用户列表都存放在口令文件中,如果口令文件删除,也就意味着其中存放的sysdba/sysoper用户不再具有sysdba/sysoper权限。
所有希望用sysdba/sysoper身份登陆上数据库的用户,不管此时数据库启动没有,都必须经过口令文件这一关,只要其中有相关记录并且口令能对上,那么就可以放行,否则拒绝登入。当然用拥有dba权限的操作系统用户(linux/unix下一般是oracle用户,win下是隶属于ORA_DBA组的用户)登进来的除外。
如果在数据库open状态下,口令文件被删除又重建,那么只有重新启动数据库口令文件才能生效,此前任何sysdba/sysoper都无法连进来。
2、口令文件损坏或者丢失怎么办?
口令文件就是sysdba/sysoper用户的唯一花名册,丢了就进不来,不管数据库启动没有。只能用操作系统级权限验证登陆,即oracle/oracle登陆,然后orapwd重建花名册。Orapwd命令第二个参数是指定sys的密码,参数等于什么,sys密码以后就是什么。为什么要指定sys密码?因为花名册里面必须要有用户密码,否则怎么验证啊?但此时数据库如果没启动的话就根本取不到sys密码,所以只能强行指定了,启动后数据库里面sys的密码会被改成此时指定的。Entries参数基本没有用,本意是花名册中最大可以存放多少个用户条目,实际上限制不了,能够容纳的数目会比指定的数目多几条,原因是orapwd分配口令文件空间时是按照os的最小block来分配的,这个问题不需要太多关注,毕竟你的数据库需要几个sysdba呢?一个足矣!。另外重建花名册的工作只能由oracle/oracle用户完成,或者具有dba权限的用户也可以,其他用户执行orapwd命令都会失败。
3、如何把sysdba/sysoper用户加到花名册中去?
再执行一遍grant sysdba/sysoper to sb.即可,oracle会自动在口令文件中增加一个条目,并且把密码copy过来。察看口令文件内容的方法:select * from v$pwfile_users;
4、没有口令文件是否可以启动数据库?
可以,9i及以下mount过程中会报错,然后手动open就可以了。因为只要用oracle/oracle照样可以做sysdba的事情,没有理由让数据库启动不了。10g已经不会报错了。
5、没有口令文件为什么是mount阶段报错而不是momount阶段报错?
哈哈,因为只有到了alter mount阶段才验证各种文件,nomount只读spfile/pfile创建进程。
6、修改sysdba/sysoper用户密码时,能否同步到口令文件?
可以同步。Alter user xxx identified by yyy.
所有密码忘记都没关系,但至少要记住ORACLE用户密码。
7、spfile/pfile中remote_login_passwordfile是干嘛用的?
设定为EXCLUSIVE,则一个实例专用;SHARE则可以多个实例共享(用于OPS/RAC环境);NONE则不启用口令文件,此时任何sysdba/sysoper都无法连接进来。在用SPFILE的情况下,remote_login_passwordfile参数怎么改呢?SPFILE是不可以强行编辑的,否则数据库不认的。用alter system set remote_login_passwordfile=none scope=spfile.改成NONE以后怎么改回来呢?HOHO……用os级认证登陆,然后alter system,或者直接create spfile from pfile;
remote_login_passwordfile=’none’意味着禁用口令文件,有也不能用。等于可以disable所有sysdba/sysoper,此时只能用oracle/oracle用户来启动和关闭数据库,也就是只有os认证,没有口令文件认证,这就是此参数的意义—口令文件验证的开关。
8、sqlnet.ora中SQLNET.AUTHENTICATION_SERVICES=(NTS/NONE)有什么用?
NTS=NT Security 即采用OS优先认证登陆,NONE为不可以,必须采用usr/pwd as sysdba/sysoper 登陆。这里是操作系统级验证的开关。
9、如果SQLNET.AUTHENTICATION_SERVICES=(NONE)并且remote_login_passwordfile=’none’,即两个开关都关闭,那么神仙也进不了数据库,hoho…我指的是sysdba/sysoper用户,普通用户可以照常使用的。当然,有物理权限的人也除外,即你可以物理地打开这台计算机操作。
总结一下,ORACLE有两种方式可以认证sysdba/sysoper用户:操作系统级认证—dba权限组(linux/unix)和ORA_DBA组(win);口令文件认证。
两种方式有各自的开关:sqlnet.ora中AUTHENTICATION_SERVICES参数;spfile/pfile中remote_login_passwordfile参数。并且这两个开关互不矛盾,可以同时打开同时关闭或者只开一个。
OS级认证是优先于口令文件认证的。