oracle學習筆記 參數檔案及資料庫的啟動和關閉
我們這節課把oracle的參數檔案以及oracle的啟動關閉講一下
一)參數檔案作用
先看oracle的參數檔案
它由來已久了
我們知道oracle資料庫有資料庫和執行個體
所謂的執行個體是一堆程序和一堆記憶體
資料庫啟動起來以後
在記憶體裡面會有一個比較大的一個記憶體結構
記憶體結構裡面有PGA有SGA
SGA裡面有很多種池子
池子裡面有很多的一些鍊啊等等這些
包括還有一堆程序,還有PGA,還有所能連接配接的serverprocess數量這些
整個的這是執行個體
這些統稱oracle的執行個體
我們來看oracle執行個體
到底是SGA分多大
裡面的池子分多大
池子裡面具體的什麼情況
等等這些該如何配置設定
也就是說oracle啟動的時候
如何來配置設定記憶體
oracle這些參數在oracle的參數檔案裡面
有一個參數檔案
其中一部分參數就是用來設定這個執行個體的
當然了oracle參數檔案裡面
還有很多參數和這個執行個體沒有多大關系
但是oracle資料庫運作期間會使用這些參數
也就是這麼認為
oracle資料庫的很多參數
都在參數檔案裡面
是以說你要對oracle進行配置和修改
絕大部分操作是修改oracle參數檔案
二)參數檔案位置
oracle參數檔案在什麼地方呢
簡單給大家看一下
在linux或unix裡面
是在$ORACLE_HOME下dbs目錄
windows裡面
是在$ORACLE_HOME下database目錄
好我們看一下
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/./db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat initdw.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
這裡面有一個檔案spfilejiagulun.ora
spfile資料庫名字.ora這個檔案
應該是spfile資料庫執行個體的名字.ora
正常情況下我們執行個體的名字等于資料庫的名字
因為我們是單執行個體環境
單執行個體環境資料庫的名字等于執行個體的名字
多執行個體環境
一個資料庫的名字對應多個執行個體的名字
這裡是spfile執行個體名字.ora
oracle從9i開始
oracle的參數檔案就叫spfile執行個體名字.ora
三)靜态和動态參數檔案
1)名字和檔案格式的差別
參數檔案的内容一會兒我們去看
先看這個參數檔案
oracle參數檔案在9i以前
oracle7和oracle8的時候它是叫靜态參數檔案
從oracle9i開始叫動态參數檔案
靜态和動态參數檔案
第一個不同的地方是
靜态參數檔案的名字叫initSID.ora
我們這裡面
如果是靜态參數檔案的話就應該叫什麼initjiagulun.ora
也就是後面的jiagulun.ora是一樣的
前面叫init然後執行個體名字.ora
如果是靜态參數檔案的話應該是這個名字
我們這裡面動态參數檔案叫spfile執行個體名字.ora
這是動态參數檔案
這是它名字上不一樣的地方
從oracle9i開始
我們都用動态參數檔案
還有一個不同的地方是
靜态參數檔案是文本檔案
動态參數檔案是二進制檔案
其實它所不同的地方是
文本檔案是vi可以看的
二進制檔案原則上vi是不能看的
但是我們這裡面呢
vi也可以看動态參數檔案
[oracle@redhat4 dbs]$ vi spfilejiagulun.ora
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^G^@^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^B^@^@U^D^@^@!Âz9^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@jiagulun.__db_cache_size=
jiagulun.__java_pool_size=
jiagulun.__large_pool_size=
jiagulun.__shared_pool_size=
jiagulun.__streams_pool_size=
*.audit_file_dest='/u01/app/oracle/admin/jiagulun/adump'
*.background_dump_dest='/u01/app/oracle/admin/jiagulun/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl','/u01/app/oracle/oradata/jiagulun/control02.ctl','/u01/app/oracle/oradata/jiagulun/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/jiagulun/cdump'
*.db_block_size=
*.db_domain=''
*.db_file_multiblock_read_count=
*.db_name='jiagulun'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=
*.dispatchers='(PROTOCOL=TCP) (SERVICE=jiagulunXDB)'
*.job_queue_processes=
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=
*.pga_aggregate_target=
*.processes=
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/jiagulun/udump'
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
這是vi的結果
但裡面上面是有一些亂碼
記住你vi看的時候這些内容也可以看到
但是退出的時候一定要用q!退出
q!退出就是強制退出但不儲存
否則這個檔案就被損壞了
原則上我們不建議對spfile進行vi
這是靜态和動态的幾個差別
一是名字的差別
一是檔案格式的差別
記住不管是靜态和動态裡面放的都是oracle的參數
我們平時對oracle進行配置的時候主要看這個參數
2)本質的差別
我們看靜态和動态參數檔案的本質差別是什麼
靜态參數檔案
是oracle啟動的時候去讀一下這個檔案
根據參數檔案的設定來設定這個執行個體
同時把參數讀到記憶體裡面去
然後關閉這個參數檔案
然後再也不用它了
也就是說靜态參數檔案
隻有在oracle資料庫啟動的時候才能去讀一下
讀完了就關閉了,然後就一直不用了
它對應的是
如果你要改oracle的任何參數隻能重新開機資料庫
這是本質的地方
動态參數檔案是
oracle啟動的時候讀一下
這個跟靜态一樣
啟動的時候讀一下然後去設定,根據參數去設定
然後把參數讀到記憶體裡面去
但是它不關閉這個檔案
它一直打開這個檔案
這就意味着在資料庫運作期間
我們可以動态的修改參數
但是記住
隻是部分參數可以動态修改
不是全部的參數都可以動态修改
因為有些參數
它改動的非常大是以輕易的不讓改
就是有的參數不能動态改
所謂的不能動态改是這麼個意思
是可以動态改
但是改完了後不一定馬上生效,需要重新開機
或者從某種意義上來講
動态參數檔案裡面所有的參數
都可以在資料庫運作期間修改
但是有的參數
修改完了馬上生效
有的參數修改完了需要重新開機資料庫
一會兒我們去看一個去判斷一個參數是什麼情況
這就是資料庫的動态和靜态參數
是以說我們用動态參數好還是用靜态參數好
顯然用動态好
因為對oracle資料庫來講
我們輕易的不重新開機
是以說對靜态參數來講改任何參數都要重新開機顯然不合适
是以說資料庫一定要用動态參數
從oracle9i開始我們都在用動态參數
這是本質的地方
四)參數檔案尋找順序
oracle資料庫啟動的時候
尋找參數檔案的過程中
參數檔案的尋找順序很有意思
有時候會有一些問題
我們來看一下
首先來講oracle啟動的時候用什麼啟動
用sqlplus / as sysdba
先連接配接資料庫,先連接配接進去
我的資料庫已經啟動了
為了試驗先給它關了
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
這個關,一會兒告訴你幾種關的方式
資料庫啟動的時候這裡面會有些小技巧
關的話最好先關監聽
實驗環境中有對資料庫的連接配接
先把其它的連接配接關了
如oracle sql developer中的連接配接
在一個連接配接上點右鍵
然後執行
斷開連接配接
把其它連接配接關了
資料庫斷開了對它的連接配接關閉過程會快一些
oracle資料庫關了以後
就沒有程序了
我們看資料庫啟動過程
oracle啟動的時候
資料庫啟動分三步
啟動三個階段
第一個階段是nomount
第二個階段是mount
第三個階段是open
啟動階段我們先不看
先看oracle的參數檔案
oracle資料庫啟動的時候
做的第一件事情是找spfile是找ora檔案找參數檔案
預設是到這個目錄底下去找
/u01/app/oracle/product/10.2.0/db_1/dbs
這個目錄底下有很多檔案
oracle根據
[oracle@redhat4 dbs]$ echo $ORACLE_SID
jiagulun
ORACLE_SID環境變量
根據這個環境變量裡面設定的SID裡面
這裡名字叫jiagulun
然後它跑到這個dbs目錄底下去
/u01/app/oracle/product/10.2.0/db_1/dbs
去找spfilejiagulun.ora
也就是說
能不能找到這個檔案spfilejiagulun.ora
取決于環境變量$ORACLE_SID設的有沒有問題
找到這個檔案spfilejiagulun.ora以後
然後使用這個檔案去啟動
如果找不到這個檔案呢
它就嘗試找initjiagulun.ora
也就是動态檔案找不到它找靜态檔案
當然了它的尋找順序基本上是這個順序
先找動态,動态找不着找個靜态
一般的我們要保證有這個動态檔案spfilejiagulun.ora
在使用靜态參數檔案initjiagulun.ora啟動後
對參數的修改與使用和動态參數檔案啟動有些不同
這時alter system執行時無法對spfilejiagulun.ora檔案進行寫入操作
是以隻能修改記憶體中的參數值
如果向spfile檔案中寫入參數值會報錯
如:
SQL> alter system set recyclebin = off scope = spfile;
alter system set recyclebin = off scope = spfile
*
ERROR at line :
ORA-: write to SPFILE requested but no SPFILE specified at startup
在資料庫啟動時沒有指定spfile檔案是以向spfile檔案的寫請求無法執行
這時向記憶體中的更改還是可以執行的
如:
SQL> alter session set recyclebin = off;
Session altered.
和
SQL> alter system set recyclebin = off scope = memory;
System altered.
這樣的修改對運作中的執行個體是有效的,但資料庫重新開機記憶體中的修改都會失效
要想使以後的執行個體有效需要手動編寫init.ora檔案
這樣的修改不會在目前執行個體中馬上生效
下次啟動使用這個init.ora檔案才能使參數更改有效
使用靜态參數檔案啟動後
雖然這時動态參數檔案還在磁盤的那個位置
但是執行個體是不使用它的,隻有在啟動時加載了它才會使用它
如使用它的一個參數視圖v$spparameter
這時對它查詢所有的參數都無值
ISSPECIFIED都是FALSE就是都沒有指定值
五)參數檔案名和$ORACLE_SID的值的關系
如果說假設我這個$ORACLE_SID設錯了的話
啟動的時候會找不到這個參數檔案,就會報錯
是以$ORACLE_SID一定要設對了
設不對的話我們改一下就ok了
這個環境變量在oracle使用者的.bash_profile檔案裡面
看一下這個檔案
[oracle@redhat4 ~]$ vi .bash_profile
檔案内容
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
unset USERNAME
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/./db_1
export ORACLE_SID=jiagulun
export NLS_LANG=american_america.zhs16gbk
export PATH=$PATH:$ORACLE_HOME/bin:.
有這一行
export ORACLE_SID=jiagulun
這個名字我們事後設定也可以
它一定等于資料庫執行個體的名字
[oracle@redhat4 ~]$ sync
這裡老師執行了一下sync指令
它的作用是,将有關檔案系統的存儲器常駐資訊送入實體媒體内
這裡就是強制把磁盤緩沖的所有資料寫入磁盤
這是我們剛才講的尋找順序
一定要給它設對了
既然設對了用sqlplus就可以連上來
假設我們設錯了
重新設一下
[oracle@redhat4 ~]$ export ORACLE_SID=jiagulun1
設錯了以後連過來
在資料庫已開啟和沒有開啟的狀态下,執行結果都是
[[email protected] ~]$ sqlplus / as sysdba
SQL*Plus: Release - Production on Fri Jan ::
Copyright (c) , , Oracle. All rights reserved.
Connected to an idle instance.
連過來以後,它提示
Connected to an idle instance.
連到一個空閑的執行個體上
表示資料庫沒有執行個體啟動,就是沒有名為jiagulun1的執行個體已啟動
sqlplus連接配接要用到ORACLE_SID這個環境變量
傳回結果說明剛才的
ORACLE_SID=jiagulun1中的
jiagulun1這個執行個體
就是ORACLE_SID所對應的執行個體沒有啟動
我們啟動一下
SQL> startup
ORA-: failure in processing system parameters
LRM-: could not open parameter file '/u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun1.ora'
它提示
could not open parameter file
不能打開參數檔案
/u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun1.ora
它去找jiagulun1.ora
因為spfile沒找到,它就找init
也沒找到,它就報錯了
實際上我們報錯以後發現
不是我們的參數檔案沒有
是因為我們的ORACLE_SID設錯了
設對了以後就ok了
這是一個簡單的排錯流程
[oracle@redhat4 ~]$ echo $ORACLE_SID
jiagulun1
然後看這個SID和我們的實際的SID一不一樣
這個名字應該在$ORACLE_HOME/dbs目錄底下
有一個spfile後面名字跟他一樣
我們把$ORACLE_SID改回正确的值
exit對linux的oracle使用者的會話後重新登陸一下
[oracle@redhat4 ~]$ echo $ORACLE_SID
jiagulun
因為剛才的修改時對單個會話進行的export
是以退出那個會話,在重新登陸一個會話就可以了
好這回對了
上面修改linux的這個環境變量時是在oracle使用者的會話中進行的
是對單個會話進行的,隻對目前的linux會話有效
退出這個會話這次的修改就失效了
記住這個oracle參數檔案的啟動順序尋找順序
六)oracle啟動的三個階段
Oracle啟動三個階段
nomount
mount
open
第一是nomount
第二是mount
第三是open
我們來簡單看一下這個啟動狀态啟動過程
我們來啟動
首先打開sqlplus用戶端
[[email protected] ~]$ sqlplus / as sysdba
SQL*Plus: Release - Production on Sat Jan ::
Copyright (c) , , Oracle. All rights reserved.
Connected to an idle instance.
首先來講它是idle空閑
目前沒有資料庫執行個體在運作
是以sqlplus沒有連接配接到執行個體
然後在sqlplus中startup直接回車以後
啟動的三個階段自動完成
如果分階段啟
1)nomount階段和mount階段
先啟動到nomount狀态
用startup nomount指令
資料庫nomount啟動階段做了件什麼事情呢
nomount的過程oracle要找到參數檔案
記住nomount階段oracle隻做一件事情
找到參數檔案
根據參數檔案的配置将記憶體空間以及程序起來
就是記憶體空間劃分出來、程序起來就ok
是以說隻要有參數檔案
隻要參數檔案的設定沒有錯就可以nomount
第二個階段是mount
mount是根據參數檔案裡面設定的控制檔案的位置
找到控制檔案把控制檔案打開
也就是說二階段把控制檔案打開
一階段如果能打開的話
隻要參數檔案正确就可以打開
二階段是找到控制檔案打開控制檔案
第一找到、第二打開
2)nomount階段的狀态
SQL> startup nomount;
ORACLE instance started.
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
SQL>
startup nomount;執行完了
它隻是把執行個體啟動起來了
就是程序和記憶體空間都有了
還做了一件事情把參數檔案打開了
第一記憶體空間劃分了
第二程序起來了
我們去判斷一下
[[email protected] ~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan05 ? 00:00: init []
root 2 1 0 Jan05 ? 00:00: [migration/]
root 3 1 0 Jan05 ? 00:00: [ksoftirqd/]
.
.
.
root 24780 24697 0 07:58 pts/1 00:00: su - oracle
oracle 24784 24780 0 07:58 pts/1 00:00: -bash
oracle 26088 8843 0 08:00 ? 00:00:05 /u01/app/oracle/product/10.2.0/db_1/jdk/bin/java -server -Xmx256M -XX:MaxPermSize=96m -XX:MinHeoracle 26197 24784 0 08:00 pts/1 00:00: sqlplus as sysdba
oracle 27113 1 0 08:09 ? 00:00: ora_pmon_jiagulun
oracle 27115 1 0 08:09 ? 00:00: ora_psp0_jiagulun
oracle 27117 1 0 08:09 ? 00:00: ora_mman_jiagulun
oracle 27119 1 0 08:09 ? 00:00: ora_dbw0_jiagulun
oracle 27121 1 0 08:09 ? 00:00: ora_lgwr_jiagulun
oracle 27123 1 0 08:09 ? 00:00: ora_ckpt_jiagulun
oracle 27125 1 0 08:09 ? 00:00: ora_smon_jiagulun
oracle 27127 1 0 08:09 ? 00:00: ora_reco_jiagulun
oracle 27129 1 0 08:09 ? 00:00: ora_cjq0_jiagulun
oracle 27131 1 0 08:09 ? 00:00: ora_mmon_jiagulun
oracle 27133 1 0 08:09 ? 00:00: ora_mmnl_jiagulun
oracle 27135 1 0 08:09 ? 00:00: ora_d000_jiagulun
oracle 27137 1 0 08:09 ? 00:00: ora_s000_jiagulun
oracle 27138 26197 0 08:09 ? 00:00: oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 28069 24689 0 08:18 pts/2 00:00: bash
root 28151 28069 0 08:18 pts/2 00:00: su - oracle
oracle 28152 28151 0 08:18 pts/2 00:00: -bash
oracle 28348 28152 0 08:21 pts/2 00:00: ps -ef
我們看結果中有
oracle 27113 1 0 08:09 ? 00:00:00 ora_pmon_jiagulun
oracle 27115 1 0 08:09 ? 00:00:00 ora_psp0_jiagulun
oracle 27117 1 0 08:09 ? 00:00:00 ora_mman_jiagulun
oracle 27119 1 0 08:09 ? 00:00:00 ora_dbw0_jiagulun
oracle 27121 1 0 08:09 ? 00:00:00 ora_lgwr_jiagulun
...
這樣的一些内容
是oracle的一堆程序起來了
再看一下記憶體的情況
[[email protected] ~]$ ipcs -a
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x36010028 524288 oracle 640 287309824 14
------ Semaphore Arrays --------
key semid owner perms nsems
0x7df2e688 360448 oracle 640 154
------ Message Queues --------
key msqid owner perms used-bytes messages
oracle也占用相關記憶體了
如結果中的
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x36010028 524288 oracle 640 287309824 14
Shared Memory Segments共享記憶體段中有oracle資訊
記憶體也啟來了
然後程序也啟來了
參數檔案也可以通路了
這時一般資料檔案還不能通路
SQL> desc tab;
ERROR:
ORA-: object tab does not exist
有些動态視圖已經可以通路了
SQL> desc v$parameter;
Name Null? Type
----------------------------------------- -------- ----------------------------
NUM NUMBER
NAME VARCHAR2()
TYPE NUMBER
VALUE VARCHAR2()
DISPLAY_VALUE VARCHAR2()
ISDEFAULT VARCHAR2()
ISSES_MODIFIABLE VARCHAR2()
ISSYS_MODIFIABLE VARCHAR2()
ISINSTANCE_MODIFIABLE VARCHAR2()
ISMODIFIED VARCHAR2()
ISADJUSTED VARCHAR2()
ISDEPRECATED VARCHAR2()
DESCRIPTION VARCHAR2()
UPDATE_COMMENT VARCHAR2()
HASH NUMBER
SQL> show parameter control;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
control_file_record_keep_time integer
7
control_files string
/u01/app/oracle/oradata/jiagul
un/control01.ctl, /u01/app/ora
cle/oradata/jiagulun/control02
.ctl, /u01/app/oracle/oradata/
jiagulun/control03.ctl
參數檔案中的資訊中有控制檔案的位置
parameter可以打開了可以看了
控制檔案在
/u01/app/oracle/oradata/jiagul
un/control01.ctl, /u01/app/ora
cle/oradata/jiagulun/control02
.ctl, /u01/app/oracle/oradata/
jiagulun/control03.ctl
這幾個地方
在這三個位置
在這三個位置内容都是一樣的
3)mount階段
我們nomount以後
将參數檔案打開以後,可以找到控制檔案
第二個階段mount
在nomount階段可以使用下面的指令進入mount
alter database mount;
在nomount階段執行startup mount不可行
SQL> startup mount;
ORA-: cannot start already-running ORACLE - shut it down first
正确的可以
SQL> alter database mount;
Database altered.
mount就是找到控制檔案把控制檔案打開
就是第二階段
mount就是打開控制檔案
4)open階段
然後open是把資料檔案和redolog打開
因為資料檔案和redolog這些檔案在控制檔案中記載着
因為控制檔案記載着資料庫的實體結構
是以說你要打開資料檔案和redolog必須先打開控制檔案
同時控制檔案還記錄着資料庫的運作狀态
根據控制檔案記錄的狀态
我們去判斷這個資料庫是不是一緻
是以說第三階段是open
在mount階段這時不能執行startup
SQL> startup open;
ORA-: cannot start already-running ORACLE - shut it down first
正确的方法可以
SQL> alter database open;
Database altered.
open是把資料檔案和跟redolog打開
是以是一步步的去對接的
回去要好好的把oracle的啟動順序
啟動流程去看一下
好三個階段
nomount是讀spfile
mount是讀controlfile
open是讀資料檔案和redolog
spfile裡面記錄着控制檔案的位置
控制檔案中記錄着資料庫的實體位置
是以說通過控制檔案可以找到資料檔案跟redolog
這是oracle啟動的三個階段
5)各階段可以檢視的内容
在啟動的這個三個階段
随着每個階段的打開
資料庫的内容也一步步的打開
這樣每啟動一步有些内容就可以檢視了
這裡以資料字典的動态性能視圖為例
在資料庫啟動到 NOMOUNT 的狀态時
隻能通路那些與SGA區相關的資料字典視圖
可以通路 v$parameter、v$sga 、v$session、v$process、v$instance、v$version、v$option
這些視圖中的資訊都是從SGA區中獲得的,與資料庫無關
當資料庫啟動到 mount 的狀态時
可以通路那些與控制檔案相關的資料字典視圖了
我們還可以通路 v$log、v$logfile、v$datafile、v$controlfile、v$database、v$thread、v$datafile_header
這些視圖中的資訊都是從控制檔案獲得的
Open模式,資料庫的所有資料檔案已被打開
所有的表和視圖都可以通路了
七)動态和靜态參數檔案的生成
動态和靜态參數檔案互相可以生成
記住有了動态參數檔案了我可以生成靜态參數檔案
有了靜态了可以生成動态
create pfile from spfile;
建立一個pfile然後from spfile
将動态參數檔案生成一個靜态參數檔案
這個最簡單
原來預設參數檔案所在目錄狀态
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/./db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat initdw.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
其實這個create pfile 和 create spfile指令在資料庫是關閉的狀态下在sqlplus中就可以執行
建立pfile檔案
SQL> create pfile from spfile;
File created.
老師在實驗中字元顯示有些問題
是字元集設定中的語言有問題
執行指令時傳回結果會有些亂碼
顯示的時候有些不太好
這個系列中的實驗一直如此
前面老師總是在使用者會話中使用
export NLS_LANG=american_america.zhs16gbk
解決問題
但每次實驗前都執行有些麻煩
其實可以放到使用者的初始化檔案.bash_profile中
修改後的oracle使用者的.bash_profile檔案的内容如下
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
unset USERNAME
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/./db_1
export ORACLE_SID=jiagulun
export NLS_LANG=american_america.zhs16gbk
export PATH=$PATH:$ORACLE_HOME/bin:.
有了
export NLS_LANG=american_america.zhs16gbk
這一行
這樣每次這個oracle使用者登入
這個環境變量就自動設定好了
剛才靜态檔案已經生成了
生成到哪個地方去了
[[email protected] dbs]$ pwd
/u01/app/oracle/product//db_1/dbs
[[email protected] dbs]$ ls
hc_jiagulun.dat initdw.ora initjiagulun.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
在
/u01/app/oracle/product/10.2.0/db_1/dbs
目錄下多了一個檔案initjiagulun.ora
名字的前部分字元有init
這是通過同一目錄下的spfilejiagulun.ora生成的initjiagulun.ora
當然也可以通過initjiagulun.ora生成spfilejiagulun.ora
但是
SQL> create spfile from pfile;
create spfile from pfile
*
ERROR at line :
ORA-: cannot create SPFILE already being used by the instance
說明運作的執行個體正在使用spfile檔案時不能替換spfile檔案
initjiagulun.ora這個檔案是可以vi編輯的
[oracle@redhat4 dbs]$ vi initjiagulun.ora
檔案内容:
jiagulun.__db_cache_size=
jiagulun.__java_pool_size=
jiagulun.__large_pool_size=
jiagulun.__shared_pool_size=
jiagulun.__streams_pool_size=
*.audit_file_dest='/u01/app/oracle/admin/jiagulun/adump'
*.background_dump_dest='/u01/app/oracle/admin/jiagulun/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl','/u01/app/oracle/oradata/jiagulun/control02.ctl','/u01/app/oracle/oradata/jiagulun/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/jiagulun/cdump'
*.db_block_size=
*.db_domain=''
*.db_file_multiblock_read_count=
*.db_name='jiagulun'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=
*.dispatchers='(PROTOCOL=TCP) (SERVICE=jiagulunXDB)'
*.job_queue_processes=
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=
*.pga_aggregate_target=
*.processes=
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/jiagulun/udump'
~
裡面有好多的參數都可以手工修改
參數用vi修改完了,直接就修改了pfile中的這個參數
對這裡面的參數來講
有一個參數啟動時是必須的
jiagulun.__shared_pool_size=75497472
設定這一個參數其實就可以了
老師的環境這個參數比較小,隻有4兆,比較小
[[email protected] dbs]$ sync
老師在這裡寫了一下磁盤緩存
也就是說對spfile來講
對這個參數檔案來講
如果說啟動起來至少要設正确一個參數就是sharedpool size
老師說的是要使執行個體正常運作必須的參數設定
經查閱資料
要讓資料庫啟動起來必須的參數是db_name,隻要有這個參數資料庫就可以啟動起來
這就是動态和靜态的生成
根據靜态我生成動态是可以的
比如說我們的動态參數檔案壞了
有可能被修改壞了
這時候資料庫啟動不起來了
我可以先用靜态的啟來
然後再create一個動态的
再重新開機
動态的生成就是create spfile from pfile;
這是動态和靜态的生成
如果錯誤的修改了spfile裡面的參數,資料庫啟動失敗
因為沒有辦法直接修改spfile,該怎麼辦
我們後面有個小例子有個小實驗
關于生成呢先講到這裡
八)參數的修改類型
1)不同類型參數有不同的修改方法
接下來我們講一個很重要的東西
就是參數類型
資料庫啟動起來以後
哪些參數可以修改,哪些參數不能修改
一個參數的作用範圍可以在三個地方起作用
整個資料庫、運作的執行個體和運作的會話
參數修改在執行個體級别我們用
指令修改
一般用這個修改
oracle執行個體中有關于參數的視圖,oracle有哪些參數可以通過它們來查
這節課用到了v$parameter、v$system_parameter、v$spparameter
v$parameter顯示的是session級的參數及其狀态
v$system_parameter顯示的是執行個體級的參數及其狀态
v$spparameter顯示的是在spfile檔案中的有哪些參數的設定
這些視圖它們在unmount狀态就可以查
每一個新Session都是從v$system_parameter上取得系統的目前值而産生Session的v$parameter視圖
v$system_parameter這個視圖是執行個體參數的情況,對會話的參數的修改和它無關聯
平時常用的show parameter指令的值來自于v$parameter
就是它來自于目前會話的參數值
oracle資料庫參數有動态和靜态之分是針對執行個體來講的
靜态指執行個體運作期間這個參數的值是不能改變的
動态就是執行個體運作期間在這個執行個體中這個參數的值可以改變。
關于參數的詳細資訊和使用在oracle官方文檔中可以查到
oracle官方文檔裡面有個books
books裡面有一個reference
打開以後然後查V$PARAMETER
在Dynamic Performance (V$) Views中可以找到
然後打開V$PARAMETER的說明
這裡面有這個資料字典的詳細說明
這個字典視圖有一個ISSYS_MODIFIABLE VARCHAR2(9) 列
ISSYS_MODIFIABLE用來說明
這個參數是靜态參數還是動态參數
以及這個參數在系統級别可以修改的方式及在什麼時候生效
這個視圖中還有兩個類似的列
ISSES_MODIFIABLE,isinstance_modifiable
ISSES_MODIFIABLE表示參數值是否可以在會話級别進行修改
isinstance_modifiable在一個資料庫有多個執行個體運作時使用,如RAC環境
整個教程沒牽扯到這部分内容,不細講了
isses_modifiable列的值有兩個
true可以、false不可以
表示修改時可不可以使用alter session指令修改
alter session指令是沒有scope選項的,如果帶上會報錯不會執行
對issys_modifiable列
下面是官方文檔的說明:
ISSYS_MODIFIABLE VARCHAR2(9) Indicates whether the parameter can be changed with ALTER SYSTEM and when the change takes effect:
•IMMEDIATE - Parameter can be changed with ALTER SYSTEM regardless of the type of parameter file used to start the instance. The change takes effect immediately.
•DEFERRED - Parameter can be changed with ALTER SYSTEM regardless of the type of parameter file used to start the instance. The change takes effect in subsequent sessions.
•FALSE - Parameter cannot be changed with ALTER SYSTEM unless a server parameter file was used to start the instance. The change takes effect in subsequent instances.
如果說是FALSE
表示這個參數不可以使用ALTER SYSTEM對運作的執行個體中的這個參數進行修改
但是可以修改用于執行個體啟動的參數檔案中的參數值
在以後的執行個體中産生效果
如果說這個列裡面的值是IMMEDIATE
表示這個參數可以使用ALTER SYSTEM修改
可以不修改參數檔案,修改完了可以馬上生效,不用重新啟動執行個體
而且馬上對所有會話生效
那麼DEFERRED呢
表示可以使用ALTER SYSTEM修改目前執行個體中的值,
可以不修改參數檔案,不用重新啟動執行個體來生效,修改完了馬上在執行個體生效
對會話的作用效果是對修改以後建立的新會話生效
對已經正在運作的會話無效,需要這個會話重新登陸後才在會話中生效
這個DEFERRED隻對少數參數有用
一個參數可以分别設定于多個地方
在spfile檔案中可以有值
在記憶體中也可以有值
而在記憶體中有可以分為執行個體中和會話中
對這幾個部分可以使用相應的指令分别修改
實際issys_modifiable列這幾種參數類型都是可以靜态修改的
就是alter system 使用scope = spfile參數
就是不管是靜态參數還是動态參數
都是可以在oracle啟動時的參數檔案中直接修改
如果ISSYS_MODIFIABLE的值是FALSE說明這個參數是靜态參數
修改隻能在參數檔案中修改
不能修改執行個體中的此參數的值
如果ISSYS_MODIFIABLE的值是IMMEDIATE或DEFERRED表示這個參數是動态參數
這時仍然可以在參數檔案中直接修改
而且可以修改運作的執行個體中的此參數值,這時修改的值在記憶體中生效
我們看修改語句的文法:
alter system set parameter_name = parameter_value [, parameter_value ]...
[ COMMENT 'text' ]
[ DEFERRED ]
[ SCOPE = { MEMORY | SPFILE | BOTH } ]
[ SID = { 'sid' | * } ]
修改的範圍有三種
SCOPE = { MEMORY | SPFILE | BOTH }
根據這個參數的ISSYS_MODIFIABLE的值
可以選擇alter system的修改範圍,就是SCOPE的值
另外決定是否使用DEFERRED選項
所有的參數不管是靜态的還是動态的都可以使用SCOPE = SPFILE
不管ISSYS_MODIFIABLE的值是FALSE還是IMMEDIATE或DEFERRED都可以直接修改參數檔案
并在下次執行個體啟動時生效
ISSYS_MODIFIABLE的值是IMMEDIATE時
可以使用 SCOPE = MEMORY隻修改執行個體記憶體中此參數的值
并且馬上在執行個體和執行個體中的所有會話生效
ISSYS_MODIFIABLE的值是DEFERRED時
修改時必須加上DEFERRED選項執行個體記憶體中此參數的值才能得到修改
隻在參數修改後啟動的會話中生效,對目前已有的會話不影響
這裡的DEFERRED是個特别的地方
這個類型的參數數量很少
SQL> select name,value,issys_modifiable from v$parameter where issys_modifiable='DEFERRED';
NAME VALUE ISSYS_MOD
------------------------------ ---------------------------------------- ---------
backup_tape_io_slaves FALSE DEFERRED
audit_file_dest /u01/app/oracle/admin/jiagulun/adump DEFERRED
object_cache_optimal_size DEFERRED
object_cache_max_size_percent DEFERRED
sort_area_size DEFERRED
sort_area_retained_size DEFERRED
olap_page_pool_size DEFERRED
rows selected.
一共就這幾個
我舉例語句中以sort_area_size為例
這個參數的原始狀态
SQL> select name,value,isdefault,isses_modifiable,issys_modifiable,isinstance_modifiable,ismodified from v$parameter where NAME = 'sort_area_size';
NAME VALUE ISDEFAULT ISSES ISSYS_MOD ISINS ISMODIFIED
--------------- -------- --------- ----- --------- ----- ----------
sort_area_size TRUE TRUE DEFERRED TRUE FALSE
它的isses_modifiable類型是TRUE,就是可以對會話修改它的參數值,
這個隻對單個會話有作用,和執行個體及spfile檔案沒有關系
SQL> alter session set sort_area_size = ;
Session altered.
issys_modifiable為DEFERRED類型的參數也是可以直接修改spfile檔案的
SQL> alter system set sort_area_size = scope = spfile;
System altered.
這樣對DEFERRED類型的參數修改就剩下了對執行個體的修改了
對記憶體中執行個體中此參數的值的修改則必須帶上DEFERRED選項
使用無DEFERRED的alter system 的語句會報錯
如使用無DEFERRED的memory參數:
alter system set sort_area_size = 75536 scope = memory;
傳回結果
SQL> alter system set sort_area_size = scope = memory;
alter system set sort_area_size = scope = memory
*
ERROR at line :
ORA-: specified initialization parameter is not modifiable with this
option
oracle對這個錯誤的描述是:
[oracle@redhat4 ~]$ oerr ora
, , "specified initialization parameter is not modifiable with this option"
// *Cause: Though the initialization parameter is modifiable, it cannot be
// modified using the specified command.
// *Action: Check the DBA guide for information about under what scope
// the parameter may be modified
說明使用的指令有錯誤
DEFERRED類型的參數
修改時帶上DEFERRED選項就可以修改了
這時所有的scope選項的取值都可以使用
這時的scope的值可以進一步限制DEFERRED參數修改的範圍
alter system set sort_area_size = 75536 DEFERRED;
alter system set sort_area_size = 75536 DEFERRED scope=both;
alter system set sort_area_size = 75536 DEFERRED scope=memory;
alter system set sort_area_size = 75536 DEFERRED scope=spfile;
這幾種都是可以執行成功的
其中DEFERRED和DEFERRED scope=both是等同的
既修改記憶體也修改spfile檔案
就是在這裡scope的預設值是both
DEFERRED對記憶體的修改是修改執行個體中此參數的值
對目前以存在的會話不影響
但是以後開啟的會話會使用新指定的值
關于參數是否被修改過
v$parameter和v$system_parameter視圖中有ismodified
v$spparameter視圖中有個isspecified
這幾個PARAMETER視圖列出了所有使用者可操作的參數
V$PARAMETER是會話中參數的情況
v$system_parameter是執行個體中參數的情況
v$spparameter是所有參數在spfile中的定義情況
v$parameter中ismodified字段有三個取值
FALSE會話中的此參數沒有被修改過
MODIFIED會話中的此參數被alter session修改過
SYSTEM_MOD會話中的此參數被alter system修改過
v$system_parameter中ismodified字段有兩個取值
FALSE執行個體中的此參數沒有被修改過
MODIFIED執行個體中的此參數被修改過
v$system_parameter是執行個體的參數隻能使用alter system修改
v$spparameter中isspecified字段有兩個取值
FALSE說明spfile檔案中沒有指定這個參數
TRUE說明spfile檔案中指定了這個參數
因為v$spparameter隻和spfile相關,是以isspecified為true說明這個參數被靜态修改了
2)參數修改小結
參數可以在兩個位置進行修改
spfile中是靜态修改,oracle啟動使用spfile,是以在資料庫啟動時這裡的修改生效
記憶體中的修改是動态修改,不用重新開機資料庫就可以生效
記憶體中又有執行個體中的參數值和會話中的參數值
使用者使用的參數及其狀态oracle提供了視圖,如V$PARAMETER、v$system_parameter、v$spparameter
視圖中所有的參數都可以直接使用
alter system set…scope=spfile;
修改
因為這是靜态修改,隻修改spfile檔案,和記憶體中正在運作的執行個體及執行個體中的會話沒有關系
視圖中isses_modifiable字段的值表示是否可以對目前會話進行修改此參數值
是針對單個會話的修改
視圖中issys_modifiable字段的值表示是否可以對目前執行個體進行修改此參數值
是對正在運作的執行個體的修改,同時對執行個體中運作的會話也有作用
issys_modifiable的三個類型在修改執行個體時起作用
FALSE不能對執行個體修改這個參數
IMMEDIATE對執行個體可進行修改并對執行個體生效,并且對執行個體中所有的會話立即生效
DEFERRED對執行個體可進行修改并對執行個體生效,執行個體中已運作的會話沒有作用隻對執行個體中後來啟動的會話生效
DEFERRED類型的參數在對執行個體修改時必須帶上DEFERRED選項
關于參數修改的情況被分别記錄在各個PARAMETER視圖中的ismodified字段或isspecified字段中
九)一個修改例子
參數一般的是IMMEDIATE和FALSE
老師用oracle sql developer查了一下
連接配接以後執行
查詢結果:
SQL> select name,value,ISSYS_MODIFIABLE from v$parameter;
NAME VALUE ISSYS_MOD
----------------------------------- ---------------------------------------- ---------
tracefile_identifier FALSE
lock_name_space FALSE
processes FALSE
sessions FALSE
sga_max_size FALSE
pre_page_sga FALSE FALSE
lock_sga FALSE FALSE
shared_pool_size IMMEDIATE
large_pool_size IMMEDIATE
java_pool_size IMMEDIATE
streams_pool_size IMMEDIATE
sga_target IMMEDIATE
transactions FALSE
transactions_per_rollback_segment FALSE
instance_name jiagulun FALSE
service_names jiagulun IMMEDIATE
db_name jiagulun FALSE
db_unique_name jiagulun FALSE
asm_power_limit IMMEDIATE
sqltune_category DEFAULT IMMEDIATE
rows selected.
内容較多這裡隻選了部分本課可能用到的列出來
如:
tracefile_identifier FALSE
它的ISSYS_MODIFIABLE為FALSE
表示可以修改
但是修改完了以後需要執行個體重新開機生效
比如有一個比較經典的參數
sga_max_size參數目前大小是285212672
然後參數的ISSYS_MODIFIABLE是FALSE
false表示什麼意思我們修改一下試試
原來的值是285212672,約285兆
也可以這樣查詢目前的值是:
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 272M
假設修改的大一些
2285000000是3位K,3位M,修改結果是2個多G
我們來看靜态參數檔案動态參數檔案裡面有什麼特點
我們使用動态參數檔案的時候
我們的參數有幾個地方有
在spfile裡有參數
在記憶體裡面也有參數
我們修改參數的時候可以用這個指令來修改
ALTER SYSTEM SET 參數 等于 新的值
scope=memory表示隻是修改記憶體的
是設在記憶體馬上生效
因為隻是修改記憶體的
下次資料庫重新開機的時候參數就沒了,又恢複原來了
scope=spfile表示隻是修改參數檔案
沒有立即生效,下次重新開機生效
那麼both表示spfile和memory全部修改
修改參數預設是both
我們修改sga_max_size使用scope=both
指令:
執行結果
SQL> alter system set sga_max_size= scope=both;
alter system set sga_max_size= scope=both
*
ERROR at line :
ORA-: specified initialization parameter cannot be modified
報錯了這個參數不能修改
我們查的這個參數的ISSYS_MODIFIABLE為FALSE
這時scope不能使用both
是FALSE意思是
你修改的時候隻能是scope等于spfile
隻能使用spfile
也就是ISSYS_MODIFIABLE為FALSE
可以修改但隻能spfile
這樣指令就是:
這時候可以修改了
執行結果:
SQL> alter system set sga_max_size= scope=spfile;
System altered.
已經被修改成功了
這時馬上再看一下這個參數的值
SQL> select name,value,ISSYS_MODIFIABLE from v$parameter where name='sga_max_size';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
ISSYS_MOD
---------
sga_max_size
285212672
FALSE
或者
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 272M
仍是原來的值
退出資料庫前此參數的值并沒有改變
然後我們再重新開機資料庫
我們先把靜态的參數檔案删了
[[email protected] dbs]$ pwd
/u01/app/oracle/product//db_1/dbs
[[email protected] dbs]$ ls
hc_jiagulun.dat initdw.ora initjiagulun.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
[[email protected] dbs]$ rm -f initjiagulun.ora
[[email protected] dbs]$ ls
hc_jiagulun.dat initdw.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
好删了,然後隻有一個動态的
因為在動态參數檔案啟動不起來資料庫時會自動去使用靜态參數檔案,
這裡把靜态參數檔案删了,是為了動态參數檔案無法啟動時直接讓它報錯
下面把資料庫關了
使用shutdown abort;關的快一些
SQL> shutdown abort;
ORACLE instance shut down.
這裡用了一個比較粗暴的關閉的方式
退出sqlplus然後再連上來
SQL> exit
Disconnected from Oracle Database g Enterprise Edition Release - Production
With the Partitioning, OLAP and Data Mining options
[[email protected] dbs]$ sqlplus / as sysdba
SQL*Plus: Release - Production on Sun Jan ::
Copyright (c) , , Oracle. All rights reserved.
Connected to an idle instance.
然後我們去啟動
SQL> startup
ORACLE instance started.
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
Database mounted.
Database opened.
檢視一下這個參數的值
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 2192M
現在是兩個G,就是修改後的值
表示參數修改成功
再核實一下:
SQL> select name,value,ISSYS_MODIFIABLE from v$parameter where name='sga_max_size';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
ISSYS_MOD
---------
sga_max_size
2298478592
FALSE
修改成功了!
十)一個修改參數造成執行個體無法啟動的排錯例子
1)造成的錯誤
老師又實驗修改了三個參數
alter system set sga_max_size= scope = spfile;
alter system set sga_target= scope = spfile;
alter system set pre_page_sga=true scope = spfile;
整個實驗過程要多次修改這些參數,使用這個參數的不同值
是以每次修改前如果允許可以把這些參數重置一下,就是先恢複它們的預設值
重置一個參數可以使用reset指令
文法是:alter system reset 參數名 scope = spfile sid=’*’;
這個指令執行後在spfile檔案中的這個參數的定義會被删除
重新開機執行個體前記憶體中此參數的值沒有影響
這裡的scope隻能等于spfile,使用memory和both是不允許的
選項sid必須有,用來指定要在哪些執行個體中重置這個參數
可以指定一個執行個體的名如我們用的jiagulun
也可以對所有執行個體起作用就用*表示所有執行個體
因為環境問題
修改參數後沒有重新開機成功
模拟了一下後資料庫啟不啟來了
我的實驗環境是虛拟機
記憶體比較小總共隻給了1個G
上面的參數資料大了也無法實作
執行了上面的三個指令後
重新開機資料庫時
SQL> startup
ORA-: out of memory
是以恢複原系統後自己重新改了一下大小
alter system set sga_max_size= scope = spfile;
alter system set sga_target= scope = spfile;
alter system set pre_page_sga=true scope = spfile;
再看一下385M是否可以啟動資料庫,我的環境是可以啟動起來的
我的環境如果這麼改
alter system set sga_max_size= scope = spfile;
alter system set sga_target= scope = spfile;
alter system set pre_page_sga=true scope = spfile;
是2G時,啟動困難
執行startup一直在等待
半天都沒完全啟動
SQL> startup;
ORACLE instance started.
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
Database mounted.
ORA-: ORACLE instance terminated. Disconnection forced
我把它強行終止了
實驗環境中記憶體1G确實太小
盡管參數數值改小了,
但實際需要的記憶體相對還是太大
重新開機資料庫還是啟動不起來了
這三個參數分别是什麼意思呢
前面兩個參數sga_max_size、 sga_target
sga_target表示将oralce的SGA設成8個G
你即使把這兩個參數都設成8個G
oracle啟動的時候,在startup的時候
你發現它也是配置設定了8個G
但是你用icps看一下
實際并沒有配置設定8個G
也就是它是預留8個G
但是實際上它再根據需要再去擴
并沒有實際分
如果你把
pre_page_sga這個參數設成true的話
你設了8個G
oracle啟動的時候
它就會在記憶體空間裡面劃出8個G來
是以說如果把這個參數pre_page_sga設成true的話
oracle的啟動會慢很多
因為它要劃8個G出來
因為實驗環境裡面我們的記憶體沒有8個G
是以說在啟動的時候會時間很長
你用ipcs看一下
它會分很多記憶體出來
這時候
如果說實體記憶體不夠的話它會去用swap
結果改了這三個參數以後
資料庫啟不來了
2)改錯的方法
這時有個沖突
這時候有個小沖突
小沖突就可能帶來一些問題
我們把spfile的參數改錯了
改錯了以後這時候spfile就打不開了
打不開的話我們又不能改
我們知道不能用vi直接改這個檔案
這就沖突了
參數錯了打不開
打不開又改不了
也就是這個參數檔案用不了了
這時候oracle留了個這麼個地方
有個指令就是剛才那個生成指令
針對這種情況我們的辦法是
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/./db_1/dbs
[oracle@redhat4 dbs]$ ls
hc_jiagulun.dat initdw.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
這裡面有個spfile檔案spfilejiagulun.ora
這個檔案被我們用alter system改壞了
資料庫啟不來了
啟不來以後就打不開
打不開以後就不能改
也就是說目前為止這個檔案不能用了
針對這種情況我們可以這樣
[oracle@redhat4 dbs]$ sqlplus / as sysdba
連上來以後我們執行這個指令
SQL> create pfile from spfile;
File created.
然後退出
SQL> exit
Disconnected
[oracle@redhat4 ~]$
看dbs檔案夾
[[email protected] dbs]$ pwd
/u01/app/oracle/product//db_1/dbs
[[email protected] dbs]$ ls
hc_jiagulun.dat initdw.ora initjiagulun.ora init.ora lkJIAGULUN orapwjiagulun spfilejiagulun.ora
生成了
initjiagulun.ora
這個檔案
這時這個檔案的内容和spfile是一樣的
并且這個pfile檔案是可以手動修改的
用vi編輯一下這個檔案
[oracle@redhat4 dbs]$ vi initjiagulun.ora
檔案内容:
jiagulun.__db_cache_size=
jiagulun.__java_pool_size=
jiagulun.__large_pool_size=
jiagulun.__shared_pool_size=
jiagulun.__streams_pool_size=
*.audit_file_dest='/u01/app/oracle/admin/jiagulun/adump'
*.background_dump_dest='/u01/app/oracle/admin/jiagulun/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl','/u01/app/oracle/oradata/jiagulun/control02.ctl','/u01/app/oracle/oradata/jiagulun/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/jiagulun/cdump'
*.db_block_size=
*.db_domain=''
*.db_file_multiblock_read_count=
*.db_name='jiagulun'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=
*.dispatchers='(PROTOCOL=TCP) (SERVICE=jiagulunXDB)'
*.job_queue_processes=
*.nls_language='SIMPLIFIED CHINESE'
*.nls_territory='CHINA'
*.open_cursors=
*.pga_aggregate_target=
*.pre_page_sga=TRUE
*.processes=
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_max_size=
*.sga_target=
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/jiagulun/udump'
vi打開檔案以後
找到剛才修改的那三個參數
檔案中
*.pre_page_sga=TRUE
把它改成false
*.pre_page_sga=false
把這些參數
*.sga_max_size=8285000000
*.sga_target=8285000000
去一位是828500000
8百多兆了
都改成228500000
2百多兆
好把這個參數改回去
*.sga_max_size=228500000
*.sga_target=228500000
然後vi執行:x儲存并退出
然後我再連上來
[oracle@redhat4 ~]$ sqlplus / as sysdba
執行
SQL> create spfile from pfile;
File created.
這時候實際生成了一個spfile
這個spfile已經和pfile的内容一樣了
pfile中參數已經改過來了
并使用這個改過的pfile生成了一個新的spfile檔案spfilejiagulun.ora
這個時候就可以啟了
SQL> startup
ORACLE instance started.
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
Database mounted.
Database opened.
如果說我們手工地用alter system不小心把spfile改壞了的話
資料庫啟不來的時候
我們可以用剛才那個辦法解決一下
資料庫啟來了,啟來了就沒問題了
剛才給大家講了一個常見的錯誤解決流程
特點是
spfile沒有打開的時候我們可以create一下
spfile即使沒有打開也可以create
這是講的這些知識
十一)oracle的關閉方式
我們再來看一下還有oracle的關閉方式這個知識點
實驗環境先重新登入一下
這時資料庫在打開狀态
Oracle關閉四種方式
有四個選項可以選擇
預設是normal
1、abort
模拟突然掉電
記憶體被清空、記憶體中的資料沒有寫入資料檔案
事務被立即中斷
沒有送出、沒有復原
2、immediate
強制中斷目前正在運作的所有事務,復原這些事務
復原完畢,強制中斷所有的連接配接
将執行個體中的所有資料寫入資料檔案
3、transactional
等待正在運作的事務,一直到他們送出或者復原
所有事務主動結束以後(送出或者復原),強行中斷連接配接
将執行個體裡面的資料寫入資料檔案
清空緩存
如果有事務一直沒有送出或者復原,執行個體無法關閉
4、normal
等待事務的主動送出或者復原
等待使用者主動斷開連接配接
如果有一個使用者沒有斷開連接配接,那麼資料庫無法關閉
1)normal
第一種方式是預設方式
資料庫關閉的時候執行shutdown
shutdown預設就是normal這個參數
shutdown normal一般我們不用
對資料庫來講關閉的時候會有各種情況
oracle的執行個體和資料庫
在關閉的時候執行個體會存在很多的會話在鍊上來
在關閉期間關閉的時候
第一有會話連上來
第二有的會話還有未送出的事務
有很多的情況
shutdown normal是
第一、等待事務的主動送出或者復原
shutdown normal會等待所有的會話的事務主動的送出或復原
主動是指連接配接的這個人主動的送出或者復原
第二、等待使用者主動斷開
資料庫它不但等待這些會話主動的送出或復原
還等待會話主動的斷開
斷開是使用者在用戶端把這個連接配接給它斷了
也就是這是最幹淨的一種連接配接方式、一種關閉方式
第一它會等待這個會話送出或復原
第二它會等待這個會話主動斷開
在斷開連接配接前,已運作連接配接中是可以開始新的事務的
但不允許建立新的連接配接
在這個前提下它再關閉
在關閉的時候
它會将buffercache裡面所有的髒緩沖區寫到磁盤上,然後關閉
這種關閉方式最幹淨對用戶端的影響最小
但它有個問題
如果使用者沒有主動斷開
這個shutdown一直在那裡停着
也就是關閉不了
是以說shutdown如果正常
shutdown回車以後基本上就關不了
因為隻要有一個連接配接在這裡連着
即使空連接配接在這裡連着你也關不了資料庫
這個關閉方式很不好
一般你很難關,關不了
2)transactional
針對這個問題
還有第二個
shutdown transactional
就是shutdown這個指令後面加上transactional
這種方式不能建立事務
它等待正在運作的事務結束
然後強行中斷
shutdown normal是
使用者主動送出和復原以後
使用者主動斷開連接配接
資料庫才能關
transactional是
使用者隻要送出了或者復原了
這時候這個資料庫
shutdown就會主動的把使用者踢出去
記住shutdown transactional
把使用者踢出去的一個前提是使用者所進行的事務正常的結束了
或者送出了或者復原了
這時候就把使用者踢出去
都踢完以後然後再關閉
關閉的時候
也是将buffercache全部寫到磁盤
然後再關閉
這時候比shutdown normal進了一步
也就是你隻要是沒有事務了就把你踢出去
normal是要等主動退出去
沒有事務的連接配接被自動中斷,有事務的連接配接等待使用者的送出然後馬上中斷這個連接配接
3)immediate
還有一個我們用的最多
shutdown immediate
所有的會話不管你目前狀态
它會将你所有的會話的事務強行給你復原
然後把你踢出去
這時候對使用者有影響
也就是比如使用者做了一個事務,做了很長時間了
但它也會強行給你復原
shutdown imediate
将所有會話的所有的事務強行復原
然後把使用者會話強行踢出去
然後進行關閉
但它有個好處
它也是把buffercache全部寫過來
然後再關閉
也是幹淨的關閉
下次資料庫啟的時候不需要做執行個體恢複
隻不過對使用者有影響
使用者被踢出去了
是以說我們看這三種關閉方式
immediate、transactional、normal
最溫柔的是normal
其次是transaction
其次是immediate
這三種方式裡面
我們通常用immediate
這三種方式都是幹淨的關閉方式
也就是資料庫buffercache全部寫過來
資料庫下次啟動的時候
都不需要做執行個體恢複
4)abort
還有一個shutdown abort這個關閉
這個關閉就是模拟的突然斷電
他跟突然斷電是一樣的
這個時候
我們的buffercache沒有寫到磁盤上
下次資料庫重新開機的時候
就需要做執行個體恢複
這是它最不好的地方
資料庫實在不到萬不得已
不要用abort
一般用immediate
這是資料庫關閉方式
我們用immediate
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
這時候它會強行把使用者的未送出事務給它復原了
然後把使用者踢出去
同時做幹淨的關閉
5)關閉方式小結
normal 等待使用者中斷連接配接,不能建立連接配接,已有連接配接中仍可建立新的事務
就是等待現有的所有使用者主動地斷開連接配接
transactional 不能建立連接配接,不能開始新事務
沒有事務的連接配接會自動中斷連接配接
有事務的連接配接等待使用者結束已有事務這個連接配接被自動強行中斷
所有的事務都結束就意味着所有連接配接都被中斷,這時這個指令就會執行成功
就是等待現有的所有使用者完成正在執行的事務
immediate 強行復原所有事務,強行中斷所有連接配接
就是對使用者不做任何的等待,放棄了所有使用者正在執行的事務
abort 模拟突然斷電,對記憶體資料沒執行任何的操作
這是不正常的關閉,損壞了使用者的操作,重新開機需要執行個體恢複
這就是我們這節課講的内容
内容比較多
2018年2月11日
文字:韻筝