代码改变世界

Oracle 11g R2创建数据库之手工建库方式

2019-01-11 17:04  H_Johnny  阅读(2379)  评论(0编辑  收藏  举报

在之前的博文当中梳理了关于DBCA静默方式创建数据库的过程,本文就手工通过SQL*PLUS客户端采用CREATE DATABASE语句创建数据库。这种建库方式就是完全使用手工SQL语句创建数据库,通常而言都会推荐DBCA图形界面方式创建,因为更为直观,但并非所有场景都有图形界面。DBCA也可以使用静默方式进行创建数据库,详细可参考我另一篇博文:Oracle 11g R2创建数据库之DBCA静默方式

手工方式是采用执行CREATE DATABASESQL语句完成的。相比较DBCA工具建库而言,手工方式可以将建库语句编写成脚本语句,可以通过执行脚本来完成建库。在完成手工方式创建数据库之前还需进行额外的操作以保证数据库可用性:

  • 创建数据字典以及基于数据字典视图;
  • 创建标准的PL/SQL包。

这些操作也都可以写进脚本当中执行,简化了操作步骤。

关于手工方式创建数据库详细步骤可以参考官方文档:Creating a Database with the CREATE DATABASE Statement

环境准备

  1. 操作系统(OS):CentOS Linux release 7.5.1804 (Core)
  2. 数据库版本(Oracle Database):Oracle Database 11g R2(11.2.0.4.0)

其中监听也已经通过静默方式配置启动成功。

总体步骤

  1. 指定数据库实例的SID
  2. 配置系统环境变量
  3. 指定数据库管理员认证方式
  4. 创建初始化参数文件(pfile)
  5. 连接数据库实例
  6. 创建服务器参数文件(spfile)
  7. 启动数据库实例
  8. 执行CREATE DATABASE建库语句
  9. 创建额外的表空间(如索引表空间)
  10. 执行脚本创建数据字典视图

步骤解析

指定数据库实例(SID)

SID是Oracle数据库在同一服务器上的唯一标识。通过环境变量ORACLE_SID指定,在Linux系统下ORACLE_SID是区分大小写的,长度最大为8个字符,有两种方式配置:

  • 环境变量配置文件中指定,环境变量文件一般是oracle用户home目录下的.bash_profile
$ grep ORACLE_SID /home/oracle/.bash_profile
export ORACLE_SID=dbabd                                  #实例SID 
  • 会话级别直接使用命令export指定。
$ export ORACLE_SID=dbabd

配置系统环境变量

主要是配置ORACLE_HOME环境变量值,并且将oracle命令路径 $ORACLE_HOME/bin加入系统PATH变量中方便以使用,可以参考SID配置写入环境变量文件当中。

$ grep ORACLE_HOME /home/oracle/.bash_profile
export ORACLE_HOME=/data/app/oracle/product/11.2.0/db_1  #Oracle Home目录
export PATH=$PATH:$ORACLE_HOME/bin                       #命令加入系统环境变量中

指定管理员认证方式

根据官方文档的描述,数据库管理员的认证方式有如下方式:

  • 通过密码文件认证;
  • 通过操作系统级别认证。

如果是通过操作系统认证,则用户要是属于dba组的成员,如果是密码文件认证必须创建密码文件:

$ orapwd file=$ORACLE_HOME/dbs/orapwdbabd password=oracle entries=10

创建初始化参数文件

这里的初始化参数文件指的pfile,pfile可以能过文本编辑器进行编辑与修改,待实例启动成功之后根据pfile创建服务器参数文件(spfile)。spfile使有的数据库参数能够在实例运行中动态修改并且生效,大大增加了数据库参数的可维护性。pfile和spfile文件默认存储的路径为 $ORACLE_HOME/dbs。pfile的命名格式为initSID.ora,本文创建的pfile文件名为initdbabd.ora,根据官方文档的要求,初始化参数文件最少都要包含如下参数DB_NAMECONTROL_FILESMEMORY_TARGETinitdbabd.ora内容如下:

DB_NAME=dbabd
CONTROL_FILES=(/data/app/oracle/data/dbabd/control01.ctl,/data/app/oracle/data/dbabd/control02.ctl)
MEMORY_TARGET=300M

也可以通过模板参数文件init.ora进行修改,init.ora内容如下:

$ cat init.ora | grep -v ^$ | grep -v ^#
db_name='ORCL'
memory_target=1G
processes = 150
audit_file_dest='<ORACLE_BASE>/admin/orcl/adump'
audit_trail ='db'
db_block_size=8192
db_domain=''
db_recovery_file_dest='<ORACLE_BASE>/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='<ORACLE_BASE>'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files = (ora_control1, ora_control2)
compatible ='11.2.0'

连接数据库实例

在连接之前确保当前环境变量的配置,主要检查的是数据库实例SID变量ORACLE_SID的值:

$ echo $ORACLE_SID
dbabd

$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Fri Jan 11 15:16:12 2019

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to an idle instance.

SQL>                      

创建服务器参数文件

通过create spfile from pfile语句从初始化参数文件创建服务器参数文件,路径也是保存在 $ORACLE_HOME/dba目录下:

$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Fri Jan 11 15:20:04 2019

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> create spfile from pfile;

File created.

$ pwd
/data/app/oracle/product/11.2.0/db_1/dbs
$ ls *.ora
initdbabd.ora  init.ora  spfiledbabd.ora

启动数据库实例

启动数据库实例,因为当前只有参数文件,所以只能将实例启动到NOMOUNT状态:

SQL> startup nomount;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2252824 bytes
Variable Size             222302184 bytes
Database Buffers           83886080 bytes
Redo Buffers                4718592 bytes

SQL> select status from v$instance;

STATUS
------------------------------------
STARTED

即使直接执行命令startup也是只能启动到NOMOUNT状态,并会报ORA-00205错误,因为当前只有参数文件。

SQL> startup;
ORACLE instance started.

Total System Global Area  313159680 bytes
Fixed Size                  2252824 bytes
Variable Size             222302184 bytes
Database Buffers           83886080 bytes
Redo Buffers                4718592 bytes
ORA-00205: error in identifying control file, check alert log for more info

执行建库语句

最关键的一个步骤,就是执行CREATE DATABASE建库语句。开始创建数据库之前检查确保:

  • 数据文件目录存在
  • 日志文件目录存在
  • 控制文件目录存在

本文以上三类文件的路径统一为 /data/app/oracle/data/dbabd

官方文档上有CREATE DATABASE语句的模板:Issue the CREATE DATABASE Statement,也可以根据需求自定义CREAET DATABASE语句,以下是通过模板进行修改的语句:

CREATE DATABASE dbabd                          -- 数据库名,DB_NAME
   USER SYS IDENTIFIED BY oracle               -- sys用户密码
   USER SYSTEM IDENTIFIED BY oracle            -- system用户密码
   LOGFILE GROUP 1 ('/data/app/oracle/data/dbabd/redo01.log') SIZE 100M BLOCKSIZE 512,     -- 在线日志
           GROUP 2 ('/data/app/oracle/data/dbabd/redo02.log') SIZE 100M BLOCKSIZE 512,
           GROUP 3 ('/data/app/oracle/data/dbabd/redo03.log') SIZE 100M BLOCKSIZE 512
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   CHARACTER SET AL32UTF8                      -- 数据库字符集        
   NATIONAL CHARACTER SET AL16UTF16
   EXTENT MANAGEMENT LOCAL
   DATAFILE '/data/app/oracle/data/dbabd/system01.dbf' SIZE 325M REUSE           -- 各个表空间数据文件
   SYSAUX DATAFILE '/data/app/oracle/data/dbabd/sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TABLESPACE users
      DATAFILE '/data/app/oracle/data/dbabd/users01.dbf'
      SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TEMPORARY TABLESPACE temp
      TEMPFILE '/data/app/oracle/data/dbabd/temp01.dbf'
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs
      DATAFILE '/data/app/oracle/data/dbabd/undotbs01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

以上注释只是为了更好解析语句的内容,实际语句当中并不存在注释内容。

执行以上CREATE DATABASE语句:

SQL> CREATE DATABASE dbabd
  2     USER SYS IDENTIFIED BY oracle
  3     USER SYSTEM IDENTIFIED BY oracle
  4     LOGFILE GROUP 1 ('/data/app/oracle/data/dbabd/redo01.log') SIZE 100M BLOCKSIZE 512,
  5             GROUP 2 ('/data/app/oracle/data/dbabd/redo02.log') SIZE 100M BLOCKSIZE 512,
  6             GROUP 3 ('/data/app/oracle/data/dbabd/redo03.log') SIZE 100M BLOCKSIZE 512
  7     MAXLOGFILES 5
  8     MAXLOGMEMBERS 5
  9     MAXLOGHISTORY 1
 10     MAXDATAFILES 100
 11     CHARACTER SET AL32UTF8
 12     NATIONAL CHARACTER SET AL16UTF16
 13     EXTENT MANAGEMENT LOCAL
 14     DATAFILE '/data/app/oracle/data/dbabd/system01.dbf' SIZE 325M REUSE
 15     SYSAUX DATAFILE '/data/app/oracle/data/dbabd/sysaux01.dbf' SIZE 325M REUSE
 16     DEFAULT TABLESPACE users
 17        DATAFILE '/data/app/oracle/data/dbabd/users01.dbf'
 18        SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
 19     DEFAULT TEMPORARY TABLESPACE temp
 20        TEMPFILE '/data/app/oracle/data/dbabd/temp01.dbf'
 21        SIZE 20M REUSE
 22     UNDO TABLESPACE undotbs
 23        DATAFILE '/data/app/oracle/data/dbabd/undotbs01.dbf'
 24        SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

Database created.

创建额外表空间(可选)

这一步是可选的,如果建库语句创建的数据库已经满足需求,这步可以跳过,本文这一步创建一个索引表空间:

SQL> create tablespace idx_tbs datafile '/data/app/oracle/data/dbabd/idx_tbs01.dbf' size 100M;

Tablespace created.

创建数据字典视图

执行额外的SQL脚本创建数据字典、视图、同义词、PL/SQL包等。脚本所在路径为 ORACLE_HOME/rdbms/admin$ORACLE_HOME/sqlplus/admin,关于执行的SQL脚本及其作用可以参考官方文档:Run Scripts to Build Data Dictionary Views

以SYS用户执行:

@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/rdbms/admin/utlrp.sql

执行完成后切换到SYSTEM用户执行:

@?/sqlplus/admin/pupbld.sql

在SQL*PLUS当中,?代表的是$ORACLE_HOME。

至此,手工方式创建数据库完成,可以通过sqlplus进行查询实例状态:

SQL> select instance_name,startup_time,status from v$instance;

INSTANCE_NAME                                    STARTUP_TIME        STATUS
------------------------------------------------ ------------------- ------------------------------------
dbabd                                            2019-01-11 15:26:49 OPEN

也可以通过监听查看实例状态:

$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 11-JAN-2019 16:53:17

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                11-JAN-2019 10:35:36
Uptime                    0 days 6 hr. 17 min. 41 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /data/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /data/app/oracle/diag/tnslsnr/dbabd/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dbabd)(PORT=1521)))
Services Summary...
Service "dbabd" has 1 instance(s).
  Instance "dbabd", status READY, has 1 handler(s) for this service...
The command completed successfully

参考

https://docs.oracle.com/cd/E11882_01/server.112/e25494/create.htm#ADMIN11073

☆〖本人水平有限,文中如有错误还请留言批评指正!〗☆