So Easy! Oracle在Linux上的安裝配置系列三
使用create database創建數據庫
本文爲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
[oracle@Oracle 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 - oracle
oracle 32431 32429 0 11:06 pts/1 00:00:00 -bash
oracle 32526 32431 0 11:26 pts/1 00:00:00 vim .bash_profile
root 33101 21914 0 14:57 pts/0 00:00:00 su - oracle
oracle 33103 33101 0 14:57 pts/0 00:00:00 -bash
oracle 33205 33103 0 15:07 pts/0 00:00:00 ps -aef
oracle 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
[oracle@Oracle 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 pts
oracle 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 parameters
LRM-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_NAME
CONTROL_FILES
MEMORY_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 string
db_name string ora11g
db_unique_name string ora11g
global_names boolean FALSE
instance_name string ora11g
lock_name_space string
log_file_name_convert string
service_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
[oracle@Oracle dbs]$ vim initorcl.ora
db_name=orcl
memory_targer=1G
diagnostic_dest=/u01/app/oracle/admin
CONTROL_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=orcl
instance_name=orcl
db_domain=Oracle.Study.org
service_names=orcl_Oracle.Study.org
這裏的初始參數比啓動實例的最小化參數多了好多,不過不管了,就這樣吧!
爲了創建數據庫,首先必須使實例啓動和運行。注意,實例可獨立存在而無需附加到其上的數據庫,活動的實例能夠創建數據庫。
實例啓動必須滿足的前提是:
# env | grep ORA
ORACLE_SID=orcl
ORACLE_BASE=/u01/app/oracle
ORACLE_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 shm
tmpfs 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 tmpfs
tmpfs /dev/shm tmpfs defaults,size=1G 0 0
可以通過重啓使這個配置生效,也可以通過重新掛載來修改其大小:
#su -c "mount -o remount,size=1G /dev/shm" root
$ df -h | grep shm
tmpfs 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 Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL 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 orcl
USER SYS IDENTIFIED BY oracle
USER SYSTEM IDENTIFIED BY oracle
LOGFILE 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 512
MAXLOGFILES 5
MAXLOGMEMBERS 5
MAXLOGHISTORY 1
MAXDATAFILES 3
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DATAFILE '/u01/app/oracle/admin/oradata/orcl/system01.dbf' SIZE 325M REUSE
SYSAUX DATAFILE '/u01/app/oracle/admin/oradata/orcl/sysaux01.dbf' SIZE 325M REUSE
DEFAULT TABLESPACE users
DATAFILE '/u01/app/oracle/admin/oradata/orcl/users01.dbf' SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE '/u01/app/oracle/admin/oradata/orcl/temp01.dbf' SIZE 20M REUSE
UNDO TABLESPACE undotbs
DATAFILE '/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
在啓動oracle實例或重起linux會話時,記得在oracle用戶的.bash_profile文件中添加oracle_sid
export ORACLE_SID=orcl
本篇的內容到此爲止,恭候閱讀,不對的地址請批評指證,討論.
qq:276631587
good luck!