本文为So Easy! Oracle在Linux上的安装配置系列的第三篇,使用create database创建数据库,本序列第一篇介绍了学习实验环境的搭建包括:在win 7中使用VMware Workstation 创建虚拟机,安装CentOS-6.6-x86_64,网络配置 和使用xshell连接远程linux服务器,上传Oracle软件和使用操作系统安装光盘搭建本地yum源,第二篇专门说了Oracle11g R2在CentOS6.6上的安装,包括Oracle安装前的准备工作,并以图文详细介绍了安装过程,安装界面乱码问题,还说了工具软件rlwrap的安装和配置,安装完软件之后,还设置了oracle用户的环境变量.
在上一篇的结尾设置了Oracle用户的环境变量,但是出于实验目的,最重要的一个环境变量oracle_sid并没有设置.
本文文档位置:
http://docs.oracle.com/cd/E11882_01/server.112/e25494/create.htm#CIAEJDBE
文档一开始就说了几个最重要的oracle用户环境变量,包括oracle_home,oracle_sid,path,这几个环境变量的正确设置 ,是create database执行成功的关键
- 名词解释
- 数据库创建前的准备
- 创建初始化参数文件
- 使用create database创建数据库
- 运行脚本创建数据字典
1. 名词解释
①、数据库(database)
物理操作系统文件或磁盘的集合是一个静态的概念
②、实例(instance):
一组Oracle后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程共享
③、参数文件
数据库的参数文件,通常称为初始文件,这个文件告诉oracle实例在哪里可以找到控制文件,并且指定某些初始化参数,这些参数定义了某种内存结构有多大等设置 默认名init<ORACLE_SID>.ora Oracle,
Oracle9iR1开始引入了一个改进的新服务器参数文件(server parameter file)简称为SPFILE默认名为spfile<ORACLE_SID>,这两个文件的默认存放位置为$ORACLE_HOME/dbs. 数据库参数是一个键/值对 如db_name=ora11g,当oracle实例启动会从参数文件中读取初始化参数,create database语句创建数据库时最少的初始文件必须包含db_name,此参数和oracle_sid环境变量的值相同,其它参数可以使用默认值。oracle启动时会搜索服务器参数文件(spfile),如果找不到spfile则会查找文本的初始文件。
参数文件的文档位置:
http://docs.oracle.com/cd/E11882_01/server.112/e25494/create.htm#i1013946
④、 控制文件
控制文件记录oracle数据库的物理结构,是一个相当小的二进制文件,其中包含Oracle需要的其他文件的一个目录。参数文件告诉实例控制文件的位置,控制文件则告知实例数据库和在线重做日志文件的位置。控制文件包括数据库名,数据库和在线重做日志文件的位置,创建数据库的时间戳,当前日志序列号,检查点等 .控制文件在发出create database语句时被创建,控制文件的文件名由参数文件中的CONTROL_FILER指定
参数文件中的控制文件的例子如:(/u01/app/oracle/admin/control目录必须先创建)
CONTROL_FILES = (/u01/app/oracle/admin/control/control01.ctl, /u01/app/oracle/admin/control/control02.ctl, /u01/app/oracle/admin/control/control03.ctl)
作为实验环境控制文件都以不同文件名保存在同一目录下,生产环境中建议多路保存
控制文件的文档位置:
http://docs.oracle.com/cd/E11882_01/server.112/e25494/control.htm#g1009963
2 . 数据库创建前的准备
上一篇中我们安装了Oracle Database 11g 11.2.0.1。我们执行一个纯软件的安装 ,不包括初始的"启动"数据库,除了软件外什么都没有。
切换到oracle初始文件的目录,可以看到除oracle提供的一个初始文件模板外,这个目录中什么内容也没有
$ cd $ORACLE_HOME/dbs $ pwd /u01/app/oracle/product/11.2.0/db_1/dbs[[email protected] dbs]$ ls init.ora
使用linux的ps命令.查看oracle软件所有者运行的所有进程,这里oracle是软件的所有者,可以看到此时没有任何Oracle数据库进程
$ ps -aef | grep oracle root 32429 22185 0 11:06 pts/1 00:00:00 su - oracleoracle 32431 32429 0 11:06 pts/1 00:00:00 -bashoracle 32526 32431 0 11:26 pts/1 00:00:00 vim .bash_profileroot 33101 21914 0 14:57 pts/0 00:00:00 su - oracleoracle 33103 33101 0 14:57 pts/0 00:00:00 -bashoracle 33205 33103 0 15:07 pts/0 00:00:00 ps -aeforacle 33206 33103 0 15:07 pts/0 00:00:00 grep oracle
使用linux的ipcs -a查看显示unix进程间的通信设备,如共享内存,信号量等 ,可以看到目前系统中没有任何通信设备
$ ipcs -a ------ Shared Memory Segments --------key shmid owner perms bytes nattch status ------ Semaphore Arrays --------key semid owner perms nsems ------ Message Queues --------key msqid owner perms used-bytes messages
启动SQL *Plus,并作为sysdba连接 ,开始时假设还没有设置环境变量ORACLE_SID,将看到:
$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 15 15:10:50 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. ERROR:ORA-12162: TNS:net service name is incorrectly specified Enter user-name:
有错误发生,因为数据库软件不知道该连接谁。连接时,Oracle软件将查找一个TNS连接字符串(一个网络连接)。如果像这个例子,没有连接字符串,Oracle软件将查找ORACLE_SID的变量。ORACLE_SID是Oracle的站点标识符,它是访问实例的键,如果像下面这样设置ORACLE_SID
export ORACLE_SID=ora11g
连接将会成功,SQL*Plus报告称连接上了一个空闲的实例:
$ export ORACLE_SID=orcl[[email protected] dbs]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 15 15:13:25 2015 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to an idle instance. SQL>
实例现在只包括一个oracle服务器进程,此时还没有分配共享内存,也没有其他进程
$ ps -aef | grep oracle | grep -v ptsoracle 33228 33227 0 15:13 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))$ ipcs -a ------ Shared Memory Segments --------key shmid owner perms bytes nattch status ------ Semaphore Arrays --------key semid owner perms nsems ------ Message Queues --------key msqid owner perms used-bytes messages
下面启动实例
SQL> startup ORA-01078: failure in processing system parametersLRM-00109: could not open parameter file ‘/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora‘
注意关于丢失文件initorcl.ora的错误。那个文件为init.ora文件,通常叫做参数文件,是启动实例时必须要有的一个文件 ,启动实例时我们需要有一个参数文件 或者要一个存储参数文件
3. 创建初始化参数文件
现在就来创建参数文件并放入启动数据库实例的最少信息,默认情况下,文件位于$ORACLE_HOME/dbs目录,名字init${ORACLE_SID}.ora
只需要有db_name就可以启动数据库实例,但是oracle推荐最小初始化参数为:
DB_NAMECONTROL_FILESMEMORY_TARGET
DB_NAME:参数设置数据库的名字。这量个强制性的参数,其值与创建的数据库名称相同。DB_NAME的值应该与ORACLE_SID环境变量的值相同。此参数在数据库创建后不能更改.DB_NAME的值最多为8个字符
CONTROL_FILES:控制文件是保存数据文件名和位置以及许多其他重要信息的关键文件。数据库只需要一个控制文件,但因为这是一个非常重要的文件,所以总会保存多个副本。多路复用控制文件的方法是在CONTROL_FILES参数中指定多个位置,这个oracle强烈推荐的参数
MEMORY_TARGET:设置这个参数可以使oracle的内存管理完全自动化,这个参数指定分配给oracle的内存。数据库将调优SGA和PGA组件的值,使它们的和等于MEMORY_TARGET参数值,可以KB,MB或GB为单位设置这个值
为了以后创建监听器的实验,这里还有几个参数需要注意,这几个参数可以在一台安装并创建了数据库的机器上使用SHOW PARAMETER NAME看到如下:
SQL> SHOW PARAMETER NAME NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_file_name_convert stringdb_name string ora11gdb_unique_name string ora11gglobal_names boolean FALSEinstance_name string ora11glock_name_space stringlog_file_name_convert stringservice_names string ora11g
DB_UNIQUE_NAME:参数指定数据库的全局名称.默认和db_name相同。如果是手动设置一般格式为database_naem.database.domaim.
INSTANCE_NAME:在单一实例环境中,INSTANCE_NAME参数具有与DB_NAME参数相同的值,默认值实例SID
SERVICE_NAME:为数据库服务提供一个名字,可以随意起一个名字,默认值DB_NAME.DB_DOMAIN
DIAGNOSTIC_DEST:Oracle Database 11g为存储诊断信息使用一种新的结构,称为Automatic Diagnostic Repository(ADR).用初始化参数DIAGNOSTIC_DEST指定这个目录的位置。DIAGNOSTIC_DEST参数以下面的方式指定ADR的结构
<diagnostic_dest>/diag/rdbms/<dbname>/<instname>
ADR文档位置
http://docs.oracle.com/cd/E11882_01/server.112/e25494/control.htm#g1009963
此ADR主目录包含预警日志,跟踪文件,核心文件和意外事件文件
DB_DOMAIN:指定数据库的完全限定名,这个参数一般与拥有数据库的组织机构的名称相同
创建init.ora文件:
$ pwd /u01/app/oracle/product/11.2.0/db_1/dbs[[email protected] dbs]$ vim initorcl.ora db_name=orclmemory_targer=1G diagnostic_dest=/u01/app/oracle/adminCONTROL_FILES = (/u01/app/oracle/admin/control/control01.ctl, /u01/app/oracle/admin/control/control02.ctl, /u01/app/oracle/admin/control/control03.ctl)db_unique_name=orclinstance_name=orcldb_domain=Oracle.Study.orgservice_names=orcl_Oracle.Study.org
这里的初始参数比启动实例的最小化参数多了好多,不过不管了,就这样吧!
为了创建数据库,首先必须使实例启动和运行。注意,实例可独立存在而无需附加到其上的数据库,活动的实例能够创建数据库。
实例启动必须满足的前提是:
# env | grep ORAORACLE_SID=orclORACLE_BASE=/u01/app/oracleORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
另外创建过程中所需要的目录必须先被创建好
准备将来存放数据文件、日志文件,控制文件,ADR的路径,。这几类文件的路径如下
如果没有事先创建好存储控制文件,ADR的路径,实例不能启动,如果没有准备好数据文件,日志文件的路径CREATE DATABASE语句将出错
$ mkdir -p $ORACLE_BASE/admin/{control,logs/my,oradata/orcl}$ tree $ORACLE_BASE/admin
4. 使用create database创建数据库
经过以上步骤数据库创建准备工作完成,下面将使用CEATE DATABASE创建数据库
ADR(自动诊断信息库)存储在$ORACLE_BASE/admin下面,ADR所使用的目录将从这个目录派生
控制文件存话在:$ORACLE_BASE/admin/control下面
日志文件存放在:$ORACLE_BASE/admin/logs和$ORACLE_BASE/logs/my下面
数据文件在放在:$ORACLE_BASE/admin/oradata/orcl下面
以NOMOUNT方式启动实例,因为现在还没有任何控制文件可安装。如果使用普通的STRATUP命令,Oracle将查找控制文件。不用担心现在还没有创建它们,在创建数据库的过程中会创建的。
以nomount方式装载数据库得到以上错误,产生这个错误的原因是共享内存太小,我们设置MEMORY_TARGET的内存为1g,,解决办法是增加系统的共享内存
$ df -h | grep shmtmpfs 931M 0 931M 0% /dev/shm
可以看到shm的大小为931M,但我们的MEMORY_TARGET设置为1G,MEMORY_TARGET 的设置不能超过 /dev/shm 的大小,知道问题所在就很容易解决,立马加大shm
$ su root -c "sed -i ‘s/tmpfs[[:blank:]]*defaults/tmpfs defaults,size=1G/‘ /etc/fstab" $ cat /etc/fstab | grep tmpfstmpfs /dev/shm tmpfs defaults,size=1G 0 0
可以通过重启使这个配置生效,也可以通过重新挂载来修改其大小:
su -c "mount -o remount,size=1G /dev/shm" root[[email protected] ~]$ df -h | grep shmtmpfs 1.0G 0 1.0G 0% /dev/shm
实例可以正常启动不报错了
现在就有了所谓的"实例"。运行数据库所需的后台进程都有了,如进程监视器(process monitor)、日志写入器(log write,lgwr)等
再使用ipcs 命令,它会首次报告指出使用了共享内存和信号量
可在这一步执行简单的查询验证数据库版本
SQL> SELECT * FROM v$version; BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE 11.2.0.1.0 ProductionTNS for Linux: Version 11.2.0.1.0 - ProductionNLSRTL Version 11.2.0.1.0 - Production
也可以查看ADR(自动诊断消息库)的目录结构
可再预警日志中查看oracle实例的创建过程
$ cd $ORACLE_BASE/admin/diag/rdbms/orcl/orcl/trace $ tail -f alert_orcl.log
Oracle将所有启动和关闭以及实例创建和例行数据库数据库操作的信息写预警日志。预警日志还列出init.ora文件中的所有非默认的初始化参数。请注意所有Oracle进程的启动,这些进程包括:
DBWn :(Database Block Write)数据库块写入器
LGWR :(Log Writer Process)日志写入器
PMON :(Porcess Monitor)进程监视器
CKPT :(Checkpoint Process)检查点进程
SMON :(System Monitor Process)系统监视器
RECO :(recoverer process)分布式数据库恢复
注意,我们还没有"数据库"呢!此时,只有数据库之名(在所创建的参数文件中),而没有数据库之实。
如何试图“装载”这个数据库,就会失败,因为数据库根本就不存在,下面就来创建数据库,可以在预警日志中查看数据库的创建过程:
CREATE DATABASE orclUSER SYS IDENTIFIED BY oracleUSER SYSTEM IDENTIFIED BY oracleLOGFILE GROUP 1 (‘/u01/app/oracle/admin/logs/redo01a.log‘,‘/u01/app/oracle/admin/logs/my/redo01b.log‘) SIZE 100M BLOCKSIZE 512, GROUP 2 (‘/u01/app/oracle/admin/logs/redo02a.log‘,‘/u01/app/oracle/admin/logs/my/redo02b.log‘) SIZE 100M BLOCKSIZE 512, GROUP 3 (‘/u01/app/oracle/admin/logs/redo03a.log‘,‘/u01/app/oracle/admin/logs/my/redo03b.log‘) SIZE 100M BLOCKSIZE 512MAXLOGFILES 5MAXLOGMEMBERS 5MAXLOGHISTORY 1 MAXDATAFILES 3 CHARACTER SET AL32UTF8NATIONAL CHARACTER SET AL16UTF16EXTENT MANAGEMENT LOCAL DATAFILE ‘/u01/app/oracle/admin/oradata/orcl/system01.dbf‘ SIZE 325M REUSESYSAUX DATAFILE ‘/u01/app/oracle/admin/oradata/orcl/sysaux01.dbf‘ SIZE 325M REUSEDEFAULT TABLESPACE usersDATAFILE ‘/u01/app/oracle/admin/oradata/orcl/users01.dbf‘ SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITEDDEFAULT TEMPORARY TABLESPACE tempts1TEMPFILE ‘/u01/app/oracle/admin/oradata/orcl/temp01.dbf‘ SIZE 20M REUSEUNDO TABLESPACE undotbsDATAFILE ‘/u01/app/oracle/admin/oradata/orcl/undotbs01.dbf‘ SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
现在数据库已经有了,可以简单地查询一些Oracle V$视图(具体就是v$datafile、v$logfile和v$controlfile),列出构成数据库的文件:
列出数据文件:
SQL> SELECT name FROM v$datafile; NAME--------------------------------------------------------------------------------/u01/app/oracle/admin/oradata/orcl/system01.dbf/u01/app/oracle/admin/oradata/orcl/sysaux01.dbf/u01/app/oracle/admin/oradata/orcl/undotbs01.dbf/u01/app/oracle/admin/oradata/orcl/users01.dbf
列出日志文件:
SQL> SELECT member FROM v$logfile; MEMBER--------------------------------------------------------------------------------/u01/app/oracle/admin/logs/redo01a.log/u01/app/oracle/admin/logs/my/redo01b.log/u01/app/oracle/admin/logs/redo02a.log/u01/app/oracle/admin/logs/my/redo02b.log/u01/app/oracle/admin/logs/redo03a.log/u01/app/oracle/admin/logs/my/redo03b.log
列出控制文件:
SQL> SELECT name FROM v$controlfile; NAME--------------------------------------------------------------------------------/u01/app/oracle/admin/control/control01.ctl/u01/app/oracle/admin/control/control02.ctl/u01/app/oracle/admin/control/control03.ctl
5. 运行脚本创建数据字典
运行脚本创建必须的数据字典,同名对象和PL/SQL包
在SQL * Plus中以sysdba身份运行以下两个脚本
@?/rdbms/admin/catalog.sql@?/rdbms/admin/catproc.sql
在SQL * Plus中以system身份运行以下脚本
@?/sqlplus/admin/pupbld.sql
可以运行另外的脚本添加符加的选项
文档位置
http://docs.oracle.com/cd/E11882_01/server.112/e40402/scripts.htm#REFRN005
本篇的内容到此为止,恭候阅读,不对的地址请批评指证,讨论.
qq:276631587
good luck!