天天看點

oracle學習筆記 參數檔案及資料庫的啟動和關閉oracle學習筆記 參數檔案及資料庫的啟動和關閉

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日

文字:韻筝