上一節中手動創建數據庫由於參數太過簡單,且沒有安裝數據字典,是無法實際應用的,本章節是對上節內容的深入,增加了很多細節和參數配置,按照以下步驟,可以成功安裝一個能實際使用的數據庫。
======清理現有數據庫文件======
[oracle@localhost dbs]$ ll
total 240396 -rw-r-----. 1 oracle oinstall 7847936 Aug 28 11:43 cntrlwly.dbf -rw-r-----. 1 oracle oinstall 81928192 Aug 28 11:40dbs1wly.dbf -rw-r-----. 1 oracle oinstall 10493952 Aug 28 11:40 dbu1wly.dbf ... -rw-r-----. 1 oracle oinstall 2560 Aug 28 04:17 spfileorcl.ora -rw-r-----. 1 oracle oinstall 1536 Aug 28 10:25 spfilewly.ora -rwxr-xr-x. 1 oracle oinstall 254 Aug 28 07:40 wly.env
[oracle@localhost dbs]$ rm -f*dbf
[oracle@localhost dbs]$ rm -fspfilewly.ora
[oracle@localhost dbs]$ ls
hc_orcl.dat initorcl.ora lkWLY peshm_orcl_0 spfileorcl.ora hc_wly.dat initwly.ora old peshm_ORCL_0 wly.env init.ora lkORCL orapworcl peshm_wly_0
=======準備初始化參數文件=========
可以通過聯機文檔reference參考各參數的含義和用法。對於初學者,可以直接拷貝有經驗的DBA創建的參數文件,也可以對安裝ORACLE時默認創建的數據庫中的PFILE進行修改。
[oracle@localhost dbs]$ env |grep ORA
ORACLE_SID=orcl ORACLE_BASE=/oracle ORACLE_HOME=/oracle/11g # 當前使用的是orcl這個數據庫
[oracle@localhost dbs]$ stringsspfileorcl.ora > initsmn.ora
# 提取orcl的SPFILE到initsmn.ora中
[oracle@localhost dbs]$ viminitsmn.ora
*.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.undo_tablespace='UNDOTBS1' … ~ :%s/orcl/smn # 在vim中使用 %s/原字符串/要替換的字符串將orcl 換成smn # 這裏有很多目錄也被替換了,需要提前將他們創建出來,否則運行時會報錯 :%s/*\.//g # 去掉SPFILE中帶上的*號
========根據參數文件逐一創建目錄=========
[oracle@localhost dbs]$ catinitsmn.ora
smn.__db_cache_size=96468992 smn.__java_pool_size=4194304 smn.__large_pool_size=4194304 smn.__oracle_base='/oracle'#ORACLE_BASE set from environment smn.__pga_aggregate_target=146800640 smn.__sga_target=276824064 smn.__shared_io_pool_size=0 smn.__shared_pool_size=159383552 smn.__streams_pool_size=4194304 audit_file_dest='/oracle/admin/smn/adump' audit_trail='db' compatible='11.2.0.0.0' control_files='/oracle/oradata/smn/control01.ctl','/oracle/flash_recovery_area/smn/control02.ctl' db_block_size=8192 db_domain='' db_name='smn' db_recovery_file_dest='/oracle/flash_recovery_area' db_recovery_file_dest_size=4039114752 diagnostic_dest='/oracle' dispatchers='(PROTOCOL=TCP) (SERVICE=smnXDB)' LOG_ARCHIVE_DEST_1='LOCATION=/oracle/oradata/smn/archive' LOG_ARCHIVE_FORMAT ='%t_%s_%r.dbf' memory_target=421527552 open_cursors=300 processes=150 remote_login_passwordfile='EXCLUSIVE' undo_tablespace='UNDOTBS1'
[oracle@localhost dbs]$ cd/oracle/oradata
[oracle@localhost oradata]$ mkdir smn
[oracle@localhost oradata]$ ll
total 8 drwxr-x---. 2 oracle oinstall 4096 Aug 27 09:21 orcl drwxr-xr-x. 2 oracle oinstall 4096 Aug 28 12:13 smn
[oracle@localhost dbs]$ mkdir/oracle/flash_recovery_area/smn/
[oracle@localhost ~]$ mkdir/oracle/oradata/smn/archive
# 創建archive目錄
[oracle@localhost oradata]$ mkdir/oracle/admin/smn/
[oracle@localhost ~]$ cd/oracle/admin/
[oracle@localhost admin]$ ll
total 8 drwxr-x---. 5 oracle oinstall 4096 Aug 5 18:24 orcl drwxr-xr-x. 2 oracle oinstall 4096 Aug 28 12:33 smn
[oracle@localhost admin]$ cp -Rorcl/* smn
# 將orcl目錄下的子目錄都複製到smn下
[oracle@localhost admin]$ cdsmn
[oracle@localhost smn]$ ll
total 20 drwxr-x---. 2 oracle oinstall 12288 Aug 28 12:41 adump drwxr-x---. 2 oracle oinstall 4096 Aug 28 12:41 dpdump drwxr-x---. 2 oracle oinstall 4096 Aug 28 12:41 pfile
[oracle@localhost smn]$ rm -fadump/*
[oracle@localhost smn]$ rm -fdpdump/*
[oracle@localhost smn]$ rm -fpfile/*
# 刪除上述三個子目錄中原有的文件
======準備創建數據庫用的腳本======
由於真正使用的創建數據庫命令很長,如果直接在命令行中輸入,很容易出錯,因此建議先將這個命令編寫成一個腳本,然後執行:
[oracle@localhost dbs]$ vimcrdb01.sql
spool dbcreate.log -- 將以下執行的語句輸出到dbcreate.log這個文件中 CREATE DATABASE "smn" MAXDATAFILES500 MAXINSTANCES 8 MAXLOGFILES 32 CHARACTER SET"UTF8" NATIONALCHARACTER SET AL16UTF16 ARCHIVELOG SYSAUX DATAFILE '/oracle/oradata/smn/system01.dbf' SIZE 300M EXTENTMANAGEMENT LOCAL DEFAULTTEMPORARY TABLESPACE temp TEMPFILE '/oracle/oradata/smn/tempts01.dbf' SIZE 100M EXTENTMANAGEMENT LOCAL UNDOTABLESPACE "UNDOTBS1" DATAFILE'/oracle/oradata/smn/undotbs01.dbf' SIZE 200M LOGFILE GROUP 1 ( '/oracle/oradata/smn/redo01a.rdo', '/oracle/oradata/smn/redo01b.rdo' ) SIZE 100M, GROUP 2 ( '/oracle/oradata/smn/redo02a.rdo', '/oracle/oradata/smn/redo02b.rdo' ) SIZE 100M, GROUP 3 ( '/oracle/oradata/smn/redo03a.rdo', '/oracle/oradata/smn/redo03b.rdo' ) SIZE 100M ; Spool off;
上述腳本需要和數據庫的初始化參數文件中列出的數值一一對應,比如在PFILE中undo_tablespace='UNDOTBS1',那麼,在CREATEDATABASE的腳本中,就需要指明UNDO TABLESPACE"UNDOTBS1"。這些細節需要十分小心,否則數據庫創建會失敗。
CREATE DATABASE語句的更多用法細節,可以查詢聯機文檔中SQLReference相關章節的內容。
========創建環境變量========
[oracle@localhost dbs]$ vimsmn.env
ORACLE_BASE=/oracle ORACLE_HOME=$ORACLE_BASE/11g ORACLE_SID=smn ORACLE_NLS33=$ORACLE_HOME/nls/data PATH=$ORACLE_HOME/bin:$PATH LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH export ORACLE_BASE ORACLE_HOME ORACLE_SID ORACLE_NLS33 PATHLD_LIBRARY_PATH
[oracle@localhost dbs]$ chmod+x smn.env
[oracle@localhost dbs]$ ../smn.env
[oracle@localhost dbs]$ env |grep ORAC
ORACLE_NLS33=/oracle/11g/nls/data ORACLE_SID=smn ORACLE_BASE=/oracle ORACLE_HOME=/oracle/11g
======執行創建數據庫用的腳本======
[oracle@localhost dbs]$ sqlplus/nolog
SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 915:34:09 2014 Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> create spfile frompfile;
File created.
SQL> startup nomount
ORACLE instance started. Total System Global Area 422670336 bytes Fixed Size 1336960 bytes Variable Size 318769536 bytes Database Buffers 96468992 bytes Redo Buffers 6094848 bytes
SQL>@$ORACLE_HOME/dbs/crdb01.sql;
-- 使用@加上路徑和腳本的名字,就可以執行sql腳本了 Database created.
[oracle@localhost ~]$ cd/oracle/admin/smn
[oracle@localhost smn]$ ls
adump dpdump pfile
[oracle@localhost smn]$ lsadump
smn_ora_14093_1.aud smn_ora_14201_2.aud smn_ora_14430_1.aud smn_ora_14513_1.aud smn_ora_14201_1.aud smn_ora_14303_1.aud smn_ora_14430_2.aud
[oracle@localhost ~]$ cd/oracle/oradata/smn
[oracle@localhost smn]$ ls
archive redo01a.rdo redo02a.rdo redo03a.rdo system01.dbf undotbs01.dbf control01.ctl redo01b.rdo redo02b.rdo redo03b.rdo tempts01.dbf # 已經創建了很多文件
=======創建額外的表空間=======
出於安全性和實用性考慮,用戶可以創建額外的表空間,只需要執行CREATETABLESPACE 語句就可以了:
SQL> CREATE TABLESPACEmytbs
2 DATAFILE '/oracle/oradata/smn/mytbs01.dbf' SIZE 100M
3 EXTENT MANAGEMENT LOCAL;
Tablespace created. -- 創建了此表空間以後,可以將數據存放在該空間裏
[oracle@localhost dbs]$ cd/oracle/oradata/smn
[oracle@localhost smn]$ ls
archive mytbs01.dbf redo01b.rdo redo02b.rdo redo03b.rdo tempts01.dbf # 可以看到剛剛創建的表空間mytbs01.dbf control01.ctl redo01a.rdo redo02a.rdo redo03a.rdo system01.dbf undotbs01.dbf
=======創建數據字典=========
沒有數據字典的數據庫是無法使用的,因此這一步是必須的:
[oracle@localhost ~]$ cd/oracle/11g/rdbms/admin
[oracle@localhost admin]$ ls
a0902000.sql dbmshtdb.sql owmricb.plb prvtmetd.plb ... catalog.sql catproc.sql
[oracle@localhost ~]$ cd/oracle/11g/sqlplus
[oracle@localhost admin]$ ls
afiedt.buf glogin.sql help libsqlplus.def plustrce.sql pupbld.sql
SQL> spool log1.1
-- 用來記錄執行過程
SQL>@?/rdbms/admin/catalog.sql
-- 執行第一個腳本
... PL/SQL procedure successfully completed. TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP CATALOG 2014-09-09 17:01:14
SQL> spool log2.log
SQL>@?/rdbms/admin/catproc.sql
... PL/SQL procedure successfully completed.
SQL> spool log3.log
SQL> @?/sqlplus/admin/pupbld.sql;
SQL> -- End of pupbld.sql
創建過程中會出現一些ERROR,這通常是因爲腳本中會先刪除某個表再創建一個表,而第一次運行時表並不存在,所以那些ERROR是正常的。
[oracle@localhost dbs]$ vimlog2.log
DROP TYPE kupc$_mastererror FORCE * ERROR at line 1: ORA-04043: object KUPC$_MASTERERROR does not exist
======檢驗數據庫是否可以正常工作=======
[oracle@localhost dbs]$ env |grep ORA
ORACLE_NLS33=/oracle/11g/nls/data ORACLE_SID=smn ORACLE_BASE=/oracle ORACLE_HOME=/oracle/11g
[oracle@localhost dbs]$ sqlplus/nolog
SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 917:23:07 2014 Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started. Total System Global Area 422670336 bytes Fixed Size 1336960 bytes Variable Size 322963840 bytes Database Buffers 92274688 bytes Redo Buffers 6094848 bytes Database mounted. Database opened. -- 正常啓動數據庫
SQL> select * from dual;
D - X -- 能夠執行查詢語句
SQL> desc dba_objects;
Name Null? Type ------------------------------------------------- -------------------- OWNER VARCHAR2(30) OBJECT_NAME VARCHAR2(128) SUBOBJECT_NAME VARCHAR2(30) OBJECT_ID NUMBER DATA_OBJECT_ID NUMBER OBJECT_TYPE VARCHAR2(19) CREATED DATE LAST_DDL_TIME DATE TIMESTAMP VARCHAR2(19) STATUS VARCHAR2(7) TEMPORARY VARCHAR2(1) GENERATED VARCHAR2(1) SECONDARY VARCHAR2(1) NAMESPACE NUMBER EDITION_NAME VARCHAR2(30) -- 能夠查詢表結構
SQL> Create tabletestb1(id integer, name char(10));
Table created. --能夠創建表
SQL> insert into testb1values(0, 'smn');
1 row created. -- 能夠插入數據
SQL> select * from testb1;
ID NAME ---------- ---------- 0 smn
到這裏,一個完整的並可以正常工作的數據庫就創建好了
根據具體的需求,還可以安裝一些額外的包。
由於創建數據庫的過程非常繁瑣,且有大量的初始化參數需要設置,爲了簡化操作,ORACLE提供了OMF特性,預設了很多參數幫助安裝。
在創建數據庫過程中可能會出現很多問題,需要自行查詢聯機文檔和日誌文件,來排查錯誤。
當數據庫建立好以後,需要修改初始化密碼,其中SYS用戶的缺省密碼是change_on_install,
SYSTEM用戶的缺省密碼是manager。