天天看點

oracle學習筆記 存儲結構_檔案oracle學習筆記 存儲結構_檔案



oracle學習筆記 存儲結構_檔案

從這節課開始我們開始講oracle的存儲結構

oracle的存儲結構對于oracle的備份恢複以及oracle的優化都很有幫助

是以存儲結構講的相對深入一些

一)oracle的實體檔案類型

先看一個資料庫都包含哪些檔案

實體資料庫結構包括

控制檔案、資料檔案、聯機重做日志檔案、參數檔案、備份檔案、歸檔日志檔案、密碼檔案、預警和跟蹤日志檔案

控制檔案、資料檔案、聯機重做日志檔案這三類檔案以前講過

一個資料庫至少包括這三類檔案

控制檔案主要放的是資料庫的名字、資料庫的實體結構資訊以及關于資料庫的字元集的資訊

還有 SCN号 checkpoint 以及一些狀态資訊

還包括一些歸檔日志的曆史資訊

資料檔案裡面放的實實在在的資料

資料檔案又分兩類

一類是我們講的普通的資料檔案

另外一類資料檔案是臨時資料檔案

加上聯機重做日志檔案

對資料庫來講這三類檔案是聯機檔案

不管哪個壞了資料庫都會報錯并可能會出現崩潰的情況

這三類檔案很關鍵

oracle就針對這三類檔案提供了很多的安全保障措施

二)控制檔案

1)看一下oracle有哪些控制檔案

課程中老師講課這裡用了Oracle SQL Developer工具

操作起來較友好

但是輸出結果需要截圖或者導出比較麻煩

我的筆記無圖是以看結果還是使用字元操作和輸出的putty工具

SQL> select name,value from v$parameter where name like '%control%';

NAME

------------------------------

VALUE

------------------------------------------------------------------------------------------------------------------------------------------------------

control_files

/u01/app/oracle/oradata/jiagulun/control01.ctl, /u01/app/oracle/oradata/jiagulun/control02.ctl, /u01/app/oracle/oradata/jiagulun/control03.ctl

control_file_record_keep_time

7

結果中control files有三個檔案

/u01/app/oracle/oradata/jiagulun/control01.ctl

/u01/app/oracle/oradata/jiagulun/control02.ctl

/u01/app/oracle/oradata/jiagulun/control03.ctl

這三個控制檔案是完全一樣的,是一種複用的關系

目前這三個控制檔案都放在了同一個目錄底下

這是非常不好的一種狀況

建議将這三個檔案放到三個不同的目錄,最好是放到三個不同的磁盤裡面去

實體上讓這三個檔案隔離開,這樣壞了一個還有另外兩個

它們完全是複用的關系

oracle為什麼用了這三個檔案就因為要讓這三個檔案複用

這是control files

控制檔案的安全是通過複用的方式

2)下面示範一下怎麼把這三個控制檔案放到不同的目錄底下去

控制控制檔案路徑的參數在oracle的spfile或pfile類型的參數檔案中

參數名為control_files

改變控制檔案的路徑就要修改這個參數

a)第一種方法使用alter指令更改參數值

先建一個測試用的目錄

[[email protected] oracle]$ pwd

/u01/app/oracle

[[email protected] oracle]$ mkdir ctltest

[[email protected] oracle]$ ll

總用量 24

drwxr-x---  3 oracle oinstall 4096 2016-04-11  admin

drwxr-xr-x  2 oracle oinstall 4096  2月 20 07:58 ctltest

drwxr-x---  3 oracle oinstall 4096 2016-04-11  flash_recovery_area

drwxr-x---  3 oracle oinstall 4096 2016-04-11  oradata

drwxrwx---  6 oracle oinstall 4096 2016-04-10  oraInventory

drwxrwx---  3 oracle oinstall 4096 2016-04-10  product

此時資料庫處于open狀态

這裡隻修改第三個控制檔案control03.ctl的路徑

SQL> alter system set control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl',

'/u01/app/oracle/oradata/jiagulun/control02.ctl',

'/u01/app/oracle/ctltest/control03.ctl'

scope=spfile;  2    3    4

System altered.

scope=spfile因為修改這個參數隻能使用spfile,不能使用both立即生效

如果使用

scope=both

會有錯誤提示

ERROR at line 1:

ORA-02095: specified initialization parameter cannot be modified

修改了spfile檔案後

這時運作的資料庫此參數值仍是原值

要重新開機資料庫使之生效

這時重新開機過程有錯誤提示

SQL> startup

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              83887720 bytes

Database Buffers          192937984 bytes

Redo Buffers                7168000 bytes

ORA-00205: error in identifying control file, check alert log for more info

是因為修改了第三個控制檔案路徑

但是在新路徑下沒有第三個控制檔案

結果導緻資料庫啟動未進入mount狀态

[[email protected] ctltest]$ pwd

/u01/app/oracle/ctltest

[[email protected] ctltest]$ ll

總用量 0

需要把原控制檔案拷貝到這個目錄

把第三個控制檔案移動到ctltest目錄下

[[email protected] ctltest]$ mv /u01/app/oracle/oradata/jiagulun/control03.ctl /u01/app/oracle/ctltest/

[[email protected] ctltest]$ ls

control03.ctl

重新啟動資料庫

SQL> shutdown immediate;

ORA-01507: database not mounted

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              83887720 bytes

Database Buffers          192937984 bytes

Redo Buffers                7168000 bytes

Database mounted.

Database opened.

資料庫啟動成功

再看控制檔案

SQL> select name,value from v$parameter where name like '%control_files%';

NAME

--------------------------------------------------------------------------------

VALUE

----------------------------------------------------------------------------------------------------------------------------------------------------------------

control_files

/u01/app/oracle/oradata/jiagulun/control01.ctl, /u01/app/oracle/oradata/jiagulun/control02.ctl, /u01/app/oracle/ctltest/control03.ctl

第三個控制檔案路徑修改成功

第一種方法總結:

1、SQL> alter system set control_files=... scope=spfile;

修改spfile檔案中的control_files參數,為控制檔案指定新的位置

2、SQL> shutdown immediate;

要使用control_files新的參數值必須重新啟動資料庫

3、拷貝控制檔案到新目錄

把控制檔案放到新的位置,使新的參數值位置有最新控制檔案

4、SQL> startup

b)第二種方法編輯spfile檔案

為了保證安全先用spfile檔案生成一個pfile檔案

SQL> create pfile ='/u01/app/oracle/ctltest/init0.ora' from spfile;

File created.

修改過程控制檔案位置仍以原位置開始

SQL> select name from v$controlfile;

NAME

------------------------------------------------------------

/u01/app/oracle/oradata/jiagulun/control01.ctl

/u01/app/oracle/oradata/jiagulun/control02.ctl

/u01/app/oracle/oradata/jiagulun/control03.ctl

spfile預設位置為

/u01/app/oracle/product/10.2.0/db_1/dbs/目錄下

我的實驗環境為

[[email protected] dbs]$ pwd

/u01/app/oracle/product/10.2.0/db_1/dbs

[[email protected] dbs]$ ls

hc_jiagulun.dat  init.ora    orapwjiagulun

initdw.ora       lkJIAGULUN  spfilejiagulun.ora

spfilejiagulun.ora檔案就是資料庫預設的參數檔案

但此檔案是二進制檔案直接修改很容易把檔案修改壞

我嘗試了一下直接使用文本編輯器修改此檔案中的control_files參數的值

結果

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORA-01078: failure in processing system parameters

LRM-00109: could not open parameter file '/u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun.ora'

說明檔案已經損壞

但是錯誤提示中并沒有直接說明spfilejiagulun.ora檔案損壞

原因在于oracle啟動時查找參數檔案的順序

第一個使用的參數檔案是spfile{SID}.ora,一般這個檔案是在資料庫建立時自動生成的預設參數檔案

spfile{SID}.ora檔案沒有或損壞會查找第二個參數檔案spfile.ora

spfile.ora沒有或損壞會找第三個參數檔案init{SID}.ora

第三個參數檔案再不可使用就會報錯,資料庫啟動就會失敗

并且報出上面的LRM-00109錯誤

實際的意思是說目前已沒有可用的參數檔案。

我的實驗環境spfile.ora和init{SID}.ora沒有自動生成

要使用還要自己建立

這三個檔案的格式類型,資料庫是有要求的

啟動時使用的

spfile{SID}.ora和spfile.ora必須是二進制檔案

init{SID}.ora必須是ASCII text類型檔案

并且啟動時隻以這種類型的檔案類型來處理

類型不對資料庫會拒絕使用

如把spfilejiagulun.ora嘗試當做pfile檔案使用

SQL> startup pfile="/u01/app/oracle/product/10.2.0/db_1/dbs/spfilejiagulun.ora";

LRM-00123: invalid character 0 found in the input file

ORA-01078: failure in processing system parameters

讀不出字元,

說明把它當做pfile檔案使用但和pfile檔案的類型不一樣,

pfile為字元型檔案,而spfile是二進制檔案

雖然你可以create spfile或create pfile指令将這三個檔案的類型進行轉變

但spfile{SID}.ora和spfile.ora檔案如果是文本檔案,或init{SID}.ora如果是二進制檔案資料庫系統都不會使用。

檢視一個檔案的類型可以使用file指令

[[email protected] dbs]$ pwd

/u01/app/oracle/product/10.2.0/db_1/dbs

[[email protected] dbs]$ file spfilejiagulun.ora

spfilejiagulun.ora: data

[[email protected] dbs]$ file init.ora

init.ora: ASCII English text

另外參數檔案的預設路徑下有一個init.ora檔案

是個文本檔案

它隻是個參數檔案的模闆

實際環境無法直接使用,因為裡面的參數數目和參數的值和實際環境都不一樣

如果所有參數檔案都丢失可以使用這個模闆編輯生成可用的參數檔案

在/u01/app/oracle/admin/jiagulun/pfile/目錄下有一個pfile檔案

我的環境下名字是init.ora.3112016134140

這個是一個可以使用的pfile檔案

參數個數和值是資料庫建立時生成的,是個最原始的可用pfile檔案

可以用它啟動資料庫

SQL> startup pfile="/u01/app/oracle/admin/jiagulun/pfile/init.ora.3112016134140";

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              88082024 bytes

Database Buffers          188743680 bytes

Redo Buffers                7168000 bytes

Database mounted.

Database opened.

也可以用它來生成spfile,但參數值不能保證是最新的。

系統預設的spfile檔案是spfile{SID}.ora

系統預設的pfile檔案是init{SID}.ora

它們的預設路徑都是在/u01/app/oracle/product/10.2.0/db_1/dbs下

用此方法開始時建立的最新的pfile恢複原來的spfile

SQL> create spfile ='/u01/app/oracle/product/10.2.0/db_1/dbs/spfilejiagulun.ora' from pfile='/u01/app/oracle/ctltest/init0.ora';

File created.

SQL> startup

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              83887720 bytes

Database Buffers          192937984 bytes

Redo Buffers                7168000 bytes

Database mounted.

Database opened.

啟動成功

說明檔案spfilejiagulun.ora不能直接修改

隻能使用間接的方法

利用pfile檔案來完成

看一下目前使用的spfile檔案

SQL> show parameter spfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string      /u01/app/oracle/product/10.2.0

                                                 /db_1/dbs/spfilejiagulun.ora

目前使用的是spfilejiagulun.ora檔案

首先以目前可用的spfile檔案建立一個pfile檔案

SQL> create pfile ='/u01/app/oracle/ctltest/pfiletest.ora' from spfile;

File created.

修改字元型檔案pfiletest.ora

将control_files部分改為

*.control_files='/u01/app/oracle/oradata/jiagulun/control01.ctl','/u01/app/oracle/oradata/jiagulun/control02.ctl','/u01/app/oracle/ctltest/control03.ctl'

改完後

如果這時想替換原spfile檔案

SQL> create spfile from pfile='/u01/app/oracle/ctltest/pfiletest.ora'

  2  ;

create spfile from pfile='/u01/app/oracle/ctltest/pfiletest.ora'

*

ERROR at line 1:

ORA-32002: cannot create SPFILE already being used by the instance

說明目前執行個體正在使用此spfile檔案,不能替換

隻能重新開機資料庫使執行個體使用其它參數檔案時替換這個spfile檔案

資料庫關閉後

這時把要更改路徑的控制檔案移動到更改的目錄

如果不是這時移動的控制檔案,資料庫啟動時可能會發生控制檔案版本不一緻的錯誤

ORA-00214: control file '/u01/app/oracle/oradata/jiagulun/control01.ctl' version 782 inconsistent with file '/u01/app/oracle/ctltest/control03.ctl' version 763

資料庫沒有完全啟動起來:database not mounted

控制檔案是時刻變化着的而且各個控制檔案是複用關系要求必須完全一樣

發生的版本錯誤就是說控制檔案内容不一樣了

這時隻要重新拷貝一下最新的控制檔案使每個控制檔案都完全一樣就可以了

[[email protected] ctltest]$ cp /u01/app/oracle/oradata/jiagulun/control01.ctl /u01/app/oracle/ctltest/control03.ctl

重新啟動一下資料庫

shutdown以後

SQL> startup pfile="/u01/app/oracle/ctltest/pfiletest.ora";

ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              96470632 bytes

Database Buffers          180355072 bytes

Redo Buffers                7168000 bytes

Database mounted.

Database opened.

看一下現在使用的是不是spfile參數檔案

SQL> show parameter spfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

spfile                               string

無值說明沒有使用spfile檔案

這時資料庫使用的是pfile檔案可以重新生成spfile了

SQL> create spfile from pfile='/u01/app/oracle/ctltest/pfiletest.ora';

File created.

重新啟動資料庫

startup成功

再檢視一下控制檔案

SQL> select name from v$controlfile;

NAME

------------------------------------------------------------

/u01/app/oracle/oradata/jiagulun/control01.ctl

/u01/app/oracle/oradata/jiagulun/control02.ctl

/u01/app/oracle/ctltest/control03.ctl

修改成功!

第二種方法總結出來的最簡步驟:

1、SQL> shutdown immediate;

先關閉資料庫

2、SQL> create pfile ='/u01/app/oracle/ctltest/pfiletest_1.ora' from spfile;

用spfile生成一個臨時的pfile檔案

3、[[email protected] dbs]$ vi /u01/app/oracle/ctltest/pfiletest_1.ora

編輯這個pfile檔案,更改control file檔案的位置

4、SQL> create spfile from pfile='/u01/app/oracle/ctltest/pfiletest_1.ora';

用這個更改後的臨時pfile檔案生成新的spfile檔案

5、拷貝控制檔案到新目錄

将控制檔案放到新的位置

6、SQL> startup

正常啟動資料庫,這時用的是新的spfile檔案。

經測試最簡方法是可行的!

各個控制檔案在不同的磁盤或目錄對安全會有進一層的保護

我實驗環境隻是示範一下後面還是繼續老師的課程使用的是控制檔案的預設狀态和位置

3)控制檔案大小

控制檔案檔案的大小都是比較小的

一般都幾M

現在用的實驗環境中

控制檔案在/u01/app/oracle/oradata/jiagulun/目錄下

檔案都很小的并且不會怎麼增長

我們到目錄下看一下

[[email protected] jiagulun]$ pwd

/u01/app/oracle/oradata/jiagulun

[[email protected] jiagulun]$ ll

總用量 1083832

-rw-r-----  1 oracle oinstall   7061504  2月  4 11:21 control01.ctl

-rw-r-----  1 oracle oinstall   7061504  2月  4 11:21 control02.ctl

-rw-r-----  1 oracle oinstall   7061504  2月  4 11:21 control03.ctl

-rw-r-----  1 oracle oinstall 104865792  2月  4 09:31 example01.dbf

-rw-r-----  1 oracle oinstall  52429312  2月  4 09:26 redo01.log

-rw-r-----  1 oracle oinstall  52429312  2月  4 11:21 redo02.log

-rw-r-----  1 oracle oinstall  52429312 12月 30 14:47 redo03.log

-rw-r-----  1 oracle oinstall 262152192  2月  4 11:21 sysaux01.dbf

-rw-r-----  1 oracle oinstall 503324672  2月  4 11:20 system01.dbf

-rw-r-----  1 oracle oinstall  20979712 12月 30 11:00 temp01.dbf

-rw-r-----  1 oracle oinstall  36708352  2月  4 11:21 undotbs01.dbf

-rw-r-----  1 oracle oinstall   5251072  2月  4 09:31 users01.dbf

從結果中可以看到控制檔案就是ctl檔案,大小都是7061504 就是7兆

三個控制檔案都是7兆,很小

而且這三個控制檔案大小不怎麼變化,變化的幅度都很小

我們該避免控制檔案變的很大

有一個參數

control_file_record_keep_time

可以限制控制檔案變的很大

控制檔案由兩大部分組成:可重用的部分和不可重用的部分

不可重用的部分記錄着資料庫中固定部分的内容

如資料庫的執行個體資訊和包含的資料檔案日志檔案等的資訊

一般情況下不會變化也是不能丢失的

可重用部分是提供恢複管理器來使用的,這部分的内容可以自動擴充

可重用的部分的大小可用CONTROL_FILE_RECORD_KEEP_TIME參數來控制

該參數的預設值為7天

就是這部分内容不是必須的,隻保留7天,7天後這部分内容可以被覆寫

這樣隻有不可重用的部分的内容是控制檔案大小的固定部分

可重用的部分隻保留7天的内容

7天内記錄的内容不多控制檔案就不會變的很大

若7天記錄的内容還太多可以縮小這個值到滿意的大小

控制檔案裡沒有實實在在的資料都是一些系統的資訊

三)資料檔案

資料檔案分兩類

一類是普通資料檔案,另外一類是臨時資料檔案

資料檔案裡面放的是實實在在的資料

我們知道資料庫裡面放的是表

資料庫最主要的是表

表裡面是一行行的資料

1)資料檔案大小

對使用oracle來講

一個資料庫裡面放幾百張表

表的大小達到上億行都很正常

當然資料庫裡面不可能所有的表都上億行

往往有四五個以内的大表上億行

别的表可能幾萬行,十幾萬行

現在對oracle來講

百萬以下的表我們我們都稱為小表

千萬以下的表在千萬到百萬之間的我們叫中型表

千萬以上的叫大型表

上億行的我們叫巨型表

一般對小表來講我們關注的少

對大表我們關注的多一些

這樣一個表大小動辄幾個G十幾個G也都很正常

表的資料實實在在的放到資料檔案裡面

資料檔案可能非常大

大部分情況我們資料庫的資料檔案幾百G一個T以内

當然也有出現一個資料庫的資料檔案達到幾個T幾十個T上百T的情況

是以對資料庫來講最主要的最大的檔案是資料檔案

主要是因為它放的是實實在在的資料

2)資料檔案的安全

對資料檔案來講它沒有複用

比如裡面有十個資料檔案

這十個資料檔案是不一樣的,裡面的内容也是不一樣

oracle害怕控制檔案壞,害怕redolog壞

唯獨不害怕的是資料檔案損壞

但是對資料檔案來講我們必須做一件事情備份

備份完了的檔案是舊檔案

比如昨天備份的檔案是舊檔案

今天資料庫壞了,我是昨天備份的

備份裡面隻有昨天的資料,沒有今天的資料

但oralce有日志

隻要有舊的備份檔案和足夠的日志檔案

就可以把資料檔案給跑成最新的

oracle隻要有舊的資料檔案的備份檔案

再加上日志檔案,資料檔案就是安全的

是以隻有資料檔案損壞我們不害怕

3)oracle資料檔案的位置

SQL> select * from dba_data_files;

FILE_NAME                   FILE_ID TABLESPACE      BYTES     BLOCKS STATUS    RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ONLINE_

------------------------ ---------- ---------- ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- ----------- -------

/u01/app/oracle/oradata/          4 USERS         5242880        640 AVAILABLE            4 YES 3.4360E+10    4194302          160    5177344         632 ONLINE

jiagulun/users01.dbf

/u01/app/oracle/oradata/          3 SYSAUX      262144000      32000 AVAILABLE            3 YES 3.4360E+10    4194302         1280  262078464       31992 ONLINE

jiagulun/sysaux01.dbf

/u01/app/oracle/oradata/          2 UNDOTBS1     36700160       4480 AVAILABLE            2 YES 3.4360E+10    4194302          640   36634624        4472 ONLINE

jiagulun/undotbs01.dbf

/u01/app/oracle/oradata/          1 SYSTEM      503316480      61440 AVAILABLE            1 YES 3.4360E+10    4194302         1280  503250944       61432 SYSTEM

jiagulun/system01.dbf

/u01/app/oracle/oradata/          5 EXAMPLE     104857600      12800 AVAILABLE            5 YES 3.4360E+10    4194302           80  104792064       12792 ONLINE

jiagulun/example01.dbf

可以看到目前環境有5個資料檔案,它們在的目錄是

/u01/app/oracle/oradata/jiagulun/

BYTES和BLOCKS列是資料檔案的大小

一個是資料檔案的位數大小一個是資料檔案所占的塊數

資料檔案裡面還有一類是臨時檔案

SQL> select * from dba_temp_files;

FILE_NAME                   FILE_ID TABLESPACE      BYTES     BLOCKS STATUS    RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS

------------------------ ---------- ---------- ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- -----------

/u01/app/oracle/oradata/          1 TEMP         20971520       2560 AVAILABLE            1 YES 3.4360E+10    4194302           80   19922944        2432

jiagulun/temp01.dbf

可看到oracle隻有一個臨時檔案

現在知道怎麼去找到這些資料檔案就可以了

四)聯機重做日志檔案

日志檔案的位置

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                             IS_

---------- ------- ------- -------------------------------------------------- ---

         3         ONLINE  /u01/app/oracle/oradata/jiagulun/redo03.log        NO

         2         ONLINE  /u01/app/oracle/oradata/jiagulun/redo02.log        NO

         1         ONLINE  /u01/app/oracle/oradata/jiagulun/redo01.log        NO

目前有三個重做日志檔案

也可以看重做日志檔案有多大

同樣預設在

/u01/app/oracle/oradata/jiagulun

目錄下

-rw-r-----  1 oracle oinstall  52429312  2月  4 09:26 redo01.log

-rw-r-----  1 oracle oinstall  52429312  2月  4 11:21 redo02.log

-rw-r-----  1 oracle oinstall  52429312 12月 30 14:47 redo03.log

有50兆大小

你設大了将來可能會有問題,設小了也會有問題

控制檔案 資料檔案 聯機重做日志檔案

我們通常都放到存儲上

oracle的實際生産環境

一般的是兩個伺服器機器和一個儲存設備

對資料庫來講

兩邊的伺服器放oracle軟體

但是控制檔案、redolog和資料檔案這三類檔案一定要放到存儲上

五)參數檔案

以後有章節會專門講oracle的參數檔案及它的意義是什麼

參數檔案放的是參數,并且有很多參數

舉個最簡單的例子,最基礎參數的使用

資料庫啟動,啟動起來以後

在實體記憶體裡面要劃出一塊oracle的記憶體空間來

這塊記憶體空間到底該怎麼劃,劃多大出來

空間劃出來以後裡面每一塊該設多大

還如我們SGA有六個池子,有PGA

我們的一些程序,該啟哪些程序

這所有的資訊都在參數檔案裡面

oracle的參數檔案是有個變遷的曆史的

這裡隻講一下參數檔案的位置

SQL> select * from v$parameter where name like '%spfile%';

  NUM NAME     TYPE VALUE                DISPLAY_VALUE        ISDEFAULT ISSES ISSYS_MOD ISINS ISMODIFIED ISADJ ISDEP DESCRIPTION              UPDATE_COMMENT        HASH

----- ------- ----- -------------------- -------------------- --------- ----- --------- ----- ---------- ----- ----- ------------------------ --------------- ----------

  128 spfile      2 /u01/app/oracle/prod /u01/app/oracle/prod TRUE      FALSE FALSE     FALSE FALSE      FALSE FALSE server parameter file                    3653611964

                    uct/10.2.0/db_1/dbs/ uct/10.2.0/db_1/dbs/

                    spfilejiagulun.ora   spfilejiagulun.ora

目前我的參數檔案是在

/u01/app/oracle/product/10.2.0/db_1/dbs/

目錄底下

有個spfile+資料庫名字.ora檔案

這就是oracle資料庫的參數檔案

我們平時改的參數都在這裡面

通路的v$parameter視圖

其實就是從參數檔案裡面取的值

上面的語句不加where條件,直接通路

SQL> select num,name from v$parameter;

  NUM NAME

----- ----------------------------------------

    2 tracefile_identifier

   25 lock_name_space

   26 processes

   27 sessions

   28 timed_statistics

.

.

.

 1330 asm_diskstring

 1334 asm_diskgroups

 1335 asm_power_limit

 1372 sqltune_category

258 rows selected.

結果中有很多行

這些資料就是oracle的參數資料

而這些參數資料都在spfile裡面設定

控制檔案、資料檔案、聯機重做日志檔案

這三類檔案壞了一個,oracle資料庫可能就會崩潰 

也就是這三類檔案對資料庫很關鍵很重要

對參數檔案來講原則上是

oracle在啟動的時候會用一次參數檔案,此後基本上不用了

oracle啟動的時候會讀、通路參數檔案

啟動完了以後這個參數檔案基本上不怎麼用了

oracle資料庫在啟動以後即使參數檔案壞了oracle還是可以正常跑

參數檔案我們一般放到

$ORACLE_HOME的dbs目錄底下

安裝在windows的oracle的spfile檔案在database目錄下

linux和unix在dbs目錄下

[[email protected] dbs]$ pwd

/u01/app/oracle/product/10.2.0/db_1/dbs

[[email protected] dbs]$ ls

hc_jiagulun.dat  initdw.ora  init.ora  lkJIAGULUN  orapwjiagulun  spfilejiagulun.ora

參數檔案名是spfilejiagulun.ora

它是個二進制檔案,不能用vi編輯

編輯的話容易給編輯壞

oracle資料庫很有特色

參數檔案是oracle啟動的時候會去讀它一下

但是讀了以後它并不把這個檔案關閉

資料庫整個的啟動以後這個參數檔案一直是打開的

但是它即使丢了的話oracle也不會崩潰

參數檔案有一點半脫機半聯機的感覺

都放在兩邊的伺服器上,一般不放在存儲上

六)備份檔案

控制檔案可以備份

參數檔案可以備份

我們對備份檔案主要備的是資料檔案還有歸檔日志檔案

控制檔案和參數檔案每次備份的時候不一定都備份,可在需要備份的時候備份

但是對資料檔案和歸檔日志檔案我們每次備份是需要一定備份的

原則性問題:

備份檔案千萬不要放到存儲上

備份檔案是離線檔案

備完了以後就放在一個離線的位置

我們一般把備份檔案放在帶庫上

帶庫就是錄音帶庫

經過複雜的整合可擁有多個讀寫驅動裝置和基本無限制的錄音帶

最基礎元件是錄音帶機,是讀寫錄音帶的裝置

和硬碟一樣都是磁媒體儲存設備

它們最主要的差別:

硬碟主要用在運作的系統中

而錄音帶庫主要用于備份恢複上

因為硬碟便于讀寫速度較快而錄音帶讀寫較麻煩速度較慢

要備份資料和長久保留資料使用錄音帶庫是個較好的選擇

備份是把資料存在一個位置友善恢複時使用

錄音帶和硬碟相比作為備份媒體的優勢

從它們的基本差別可以看出

都使用 磁 儲存資料

硬碟存儲的位置是中心的磁盤

對資料的讀寫使用了內建在一起的複雜的機電裝置

帶庫存儲的中心位置在條形的錄音帶

讀寫使用的是錄音帶和可以于它分離的驅動器

硬碟結構複雜對磁盤的潔淨度要求非常的高

而且各個元件間無法分離,

一個元件損壞硬碟就報廢了

雖說可以把中間的磁盤取出進行恢複

但那是一個非常麻煩和耗時的過程,同時也極不安全

帶庫要保留住資料隻要保留住錄音帶即可

可友善的脫離出原帶庫系統在其它錄音帶機中讀出

他們的使用都有壽命

任何形式的備份都不可能完全保障任何時候都能恢複出原來的資料

延長使用壽命,儲存錄音帶更簡單和容易實行

是以錄音帶相對的非常穩定

這和存儲資料的最本質要求是相符的。

安全對備份是第一位的

對安全來講,速度總是顯得不重要,并且在高速下安全總是難于保障

如果隻對備份來講現在帶庫的速度其實一點也不慢

帶庫裝置

我們有虛拟帶庫跟真實的兩種帶庫

我們要掌握帶庫的工作原理,去使用它操作它

一般的備份,備份的資料放到帶庫上

比較有錢的使用者或者比較規矩的使用者一般用真實的帶庫

當然現在虛拟的帶庫使用越來越大但還是有些問題

建議大家資料不要放在虛拟帶庫上

虛拟帶庫是将硬碟或磁盤陣列虛拟成錄音帶庫

有多種的虛拟方法

如:磁盤陣列型(Disk Array Based)、應用伺服器型(VTL Appliance)、備份軟體型(Backup Software)

但都是在一定的位置運用儲存虛拟軟體,将連接配接訊号仿真成錄音帶機的表述格式

欺騙作業系統和備份軟體,誤以為連接配接到的是一部實體的錄音帶裝置

虛拟帶庫本質還是使用的硬碟,速度達到了硬碟的速度,但安全方面也是和硬碟一樣,沒有真實的帶庫安全

備份檔案是離線的千萬不要放在存儲上

七)歸檔日志檔案

1)預設歸檔日志的産生

以前向大家描述了歸檔産生的過程

這裡看一下oracle産生多少歸檔,都歸檔到什麼位置去了

可以查,但查的不一定準

在沒有更改歸檔目錄的預設情況下

現在我的實驗環境

SQL> select * from v$archived_log;

no rows selected

沒有歸檔日志

而且在歸檔日志的預設目錄也沒有産生

[[email protected] JIAGULUN]$ pwd

/u01/app/oracle/flash_recovery_area/JIAGULUN

[[email protected] JIAGULUN]$ ls

onlinelog

這是因為現在我的學習環境還沒有打開歸檔模式是以先打開它

在23課logbuffer相關設定中我們講過了歸檔模式的切換了

這裡把它切換一下,切換到自動歸檔模式

切換剛完成時

SQL> select * from v$archived_log;

no rows selected

仍沒有歸檔日志

[[email protected] JIAGULUN]$ pwd

/u01/app/oracle/flash_recovery_area/JIAGULUN

[[email protected] JIAGULUN]$ ls

onlinelog

而且沒有歸檔目錄

可以執行歸檔指令進行手動的歸檔,對未歸檔日志進行歸檔

alter system archive log all;

歸檔所有未歸檔日志,但不對目前的日志進行操作,就是不歸檔目前日志,也不進行目前日志的切換

alter system archive log current;

歸檔目前所有的未歸檔日志,包括目前的日志,歸檔後會進行一次目前日志的切換,改變目前日志到下一個

SQL>ALTER SYSTEM ARCHIVE LOG SEQUENCE 46;

歸檔指定序号的未歸檔日志,序号可以在v$log視圖中找到,不能歸檔目前日志

現在是自動歸檔模式手動切換一下日志

SQL> alter system switch logfile;

System altered.

自動歸檔模式下日志切換會造成日志歸檔

[[email protected] JIAGULUN]$ pwd

/u01/app/oracle/flash_recovery_area/JIAGULUN

[[email protected] JIAGULUN]$ ls

archivelog  onlinelog

預設歸檔目錄産生了,就是/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog目錄

SQL> select recid,name from v$archived_log;

     RECID NAME

---------- ----------------------------------------------------------------------------------------------------

         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc

在v$archived_log視圖中也有了一條歸檔記錄

可以看出在預設歸檔目錄下歸檔的日志都放在名稱為目前日期的子目錄下

再次切換日志檔案又會産生一個歸檔日志

SQL> select recid,name from v$archived_log;

     RECID NAME

---------- ----------------------------------------------------------------------------------------------------

         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc

         2 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_7_d9fwqk9o_.arc

進入此目錄檢視

[[email protected] 2017_02_05]$ pwd

/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05

[[email protected] 2017_02_05]$ ll

總用量 27068

-rw-r-----  1 oracle oinstall 27256320  2月  5 17:32 o1_mf_1_6_d9fw96tx_.arc

-rw-r-----  1 oracle oinstall   419328  2月  5 17:40 o1_mf_1_7_d9fwqk9o_.arc

如果多次切換日志造成多次的日志發生歸檔,會産生多個歸檔日志檔案

隔天後切換日志

[[email protected] archivelog]$ pwd

/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog

[[email protected] archivelog]$ ls

2017_02_05  2017_02_06

産生了另一日期的目錄及歸檔日志

新日期目錄下

[[email protected] 2017_02_06]$ pwd

/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06

[[email protected] 2017_02_06]$ ll

總用量 3664

-rw-r-----  1 oracle oinstall 3745792  2月  6 08:21 o1_mf_1_8_d9hjchs0_.arc

有了新歸檔

SQL> select recid,name from v$archived_log;

     RECID NAME

---------- ----------------------------------------------------------------------------------------------------

         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc

         2 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_7_d9fwqk9o_.arc

         3 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_8_d9hjchs0_.arc

查詢出有不同日期的歸檔日志

再多次發生歸檔後

SQL> select recid,name from v$archived_log;

     RECID NAME

---------- ----------------------------------------------------------------------------------------------------

         1 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_6_d9fw96tx_.arc

         2 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05/o1_mf_1_7_d9fwqk9o_.arc

         3 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_8_d9hjchs0_.arc

         4 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_9_d9hjxryc_.arc

         5 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_10_d9hjxvrv_.arc

         6 /u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06/o1_mf_1_11_d9hjy0pb_.arc

6 rows selected.

有了多條歸檔記錄

oracle産生了這麼多歸檔日志

都存儲到了

/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/

目錄下

名字是自動取的,字尾為arc

2)歸檔日志不要放到存儲上

當然歸檔日志是離線檔案

oracle歸檔的時候會歸檔到這個目錄底下

有可能出現這個檔案被拷走了然後被删除了

是以這個位置并不能真實的來反應這個歸檔日志是不是在這個地方

但它要反應兩個問題

第一個 oracle當年歸檔的時候把它歸檔到這個目錄底下去了

第二個 如果oracle要找歸檔的話,它要到這個目錄底下去按照這個名字去找歸檔

       找不到的話它會報錯

記住歸檔日志檔案有一個原則,歸檔日志檔案千萬不要放到存儲上

我們很多使用者特别是大的銀行使用者,非常喜歡把歸檔日志放到存儲上

原因很簡單

第一存儲有空間有足夠的空間空間很大

第二歸檔日志占用的空間很大

這裡面可能最占用空間的就是歸檔日志檔案

是以使用者就理所當然的把資料檔案和歸檔日志檔案放到存儲上

這樣資料庫一旦出了問題,存儲一旦出了問題

資料庫肯定會丢失資料,肯定會有一批人會倒黴

歸檔日志檔案一定不要放到存儲上

老師每次講課的時候在中國在國内

就為了這個問題老師呼籲了很多次了

因為存儲出問題太經常了

存儲出問題如果你把歸檔跟資料檔案全部放到存儲上肯定會丢資料

3)歸檔日志目錄的設定

有三組設定參數

第一種 預設 參數db_recovery_file_dest并且此參數預設值為/u01/app/oracle/flash_recovery_area

第二組 參數log_archive_dest(主歸檔路徑)和log_archive_duplex_dest(從歸檔路徑) 最多兩個位置 預設無值

第三組 參數log_archive_dest_n n是從1開始的數字最多10個不同的歸檔路徑 預設無值

設定了第二種或第三種參數 第一種參數會自動失效

第二種和第三種參數的設定是互斥的不能同時設定

第一種第二種參數隻能指定本地路徑,參數值是一個已存在目錄

第三種參數可以指定本地和遠端路徑,

在設定時要在參數值中使用'LOCATION=本地的一個路徑'或'SERVICE=遠端服務名'

遠端資料庫的網絡服務名要在tnsnames.ora檔案中配置

第二種第三種中的參數設定一個就可以使用,

若設定了多個則它們是複用的關系同時使用,就是每個目錄都進行歸檔并且歸檔的檔案一樣。

log archive還有不少的其它參數,通過這些參數可以把歸檔按自己的要求設定使歸檔比較合理。

八)密碼檔案

和oracle安全有關系

這個檔案即使丢了也沒關系我們可以再重新生成

可以臨時生成

當遠端以SYSDBA的身份登入資料庫的時候需要用到這個密碼檔案

九)預警和跟蹤日志

oracle有兩種日志

聯機重做日志是記錄oracle操作,記錄oracle資料塊變更的

用來恢複資料,保證資料一緻

oracle還有一個日志叫alert日志預警日志

oracle重大的操作以及錯誤資訊都在這個日志裡面會出現

用來判斷oracle有沒有問題

先簡單的看一下

1)alert日志

在/u01/app/oracle/admin/jiagulun目錄下有一堆dump檔案

在bdump目錄下有一個alert日志

[[email protected] bdump]$ pwd

/u01/app/oracle/admin/jiagulun/bdump

[[email protected] bdump]$ ls

alert_jiagulun.log       jiagulun_cjq0_6634.trc   jiagulun_lgwr_6626.trc

jiagulun_arc0_30179.trc  jiagulun_lgwr_13460.trc  jiagulun_p000_6646.trc

jiagulun_arc1_30181.trc  jiagulun_lgwr_13577.trc  jiagulun_p001_6648.trc

jiagulun_arc2_30183.trc  jiagulun_lgwr_13643.trc  jiagulun_pmon_6618.trc

jiagulun_cjq0_13651.trc  jiagulun_lgwr_29955.trc

alert_jiagulun.log就是alert日志是資料庫的問題診斷的一個入口

oracle重大的操作以及oracle的錯誤都會出現在這個日志中

我們可以看一下這個檔案的内容

[[email protected] bdump]$ more alert_jiagulun.log

Mon Apr 11 13:38:53 2016

Starting ORACLE instance (normal)

LICENSE_MAX_SESSION = 0

LICENSE_SESSIONS_WARNING = 0

Shared memory segment for instance monitoring created

Picked latch-free SCN scheme 2

Using LOG_ARCHIVE_DEST_10 parameter default value as USE_DB_RECOVERY_FILE_DEST

Autotune of undo retention is turned on.

IMODE=BR

ILAT =18

LICENSE_MAX_USERS = 0

SYS auditing is disabled

ksdpec: called for event 13740 prior to event group initialization

Starting up ORACLE RDBMS Version: 10.2.0.1.0.

System parameters with non-default values:

  processes                = 150

  nls_language             = SIMPLIFIED CHINESE

  nls_territory            = CHINA

  sga_target               = 285212672

  control_files            = /u01/app/oracle/oradata/jiagulun/control01.ctl, /u0

1/app/oracle/oradata/jiagulun/control02.ctl, /u01/app/oracle/oradata/jiagulun/co

ntrol03.ctl

.

.

.

Mon Feb  6 07:43:33 2017

MMNL absent for 50192 secs; Foregrounds taking over

Mon Feb  6 08:20:58 2017

Thread 1 cannot allocate new log, sequence 9

Private strand flush not complete

  Current log# 1 seq# 8 mem# 0: /u01/app/oracle/oradata/jiagulun/redo01.log

Thread 1 advanced to log sequence 9

  Current log# 2 seq# 9 mem# 0: /u01/app/oracle/oradata/jiagulun/redo02.log

Mon Feb  6 08:30:48 2017

Thread 1 advanced to log sequence 10

  Current log# 3 seq# 10 mem# 0: /u01/app/oracle/oradata/jiagulun/redo03.log

Thread 1 advanced to log sequence 11

  Current log# 1 seq# 11 mem# 0: /u01/app/oracle/oradata/jiagulun/redo01.log

Thread 1 cannot allocate new log, sequence 12

Checkpoint not complete

  Current log# 1 seq# 11 mem# 0: /u01/app/oracle/oradata/jiagulun/redo01.log

Thread 1 advanced to log sequence 12

  Current log# 2 seq# 12 mem# 0: /u01/app/oracle/oradata/jiagulun/redo02.log

内容太多隻截取其中一部分

裡面都是重大的操作

内容中可看到

資料庫的啟動、發生的一些checkpoint事件和備份了一個控制檔案等

還包括oracle的錯誤

都出現在這個檔案裡面

出現了錯誤,要去找相關的錯誤

以後oracle排錯的時候,會首先從這個檔案入手

2)trc檔案

此目錄下有很多的.trc檔案

這些檔案叫trace檔案

比如jiagulun_lgwr_13460.trc檔案

一看就是LGWR程序産生的

這個trc檔案往往意味着LGWR程序出現問題了

trace檔案往往記錄着這個LGWR這個程序出問題的一瞬間的記憶體的狀态

每一個程序包括前台程序包括背景程序都有PGA空間

trace檔案基本記錄着LGWR等程序出問題那一瞬間程序的PGA的資訊

這些資訊一般隻有oracle的人才能看懂

一般的開發人員,一般我們的人都看不懂

是以我們平常隻要看alert日志就是alert_jiagulun.log檔案

其它的trc檔案是背景程序的trace檔案

那麼serverprocess的trace檔案在udump目錄

[[email protected] udump]$ pwd

/u01/app/oracle/admin/jiagulun/udump

[[email protected] udump]$ ls

jiagulun_ora_11458.trc  jiagulun_ora_13551.trc  jiagulun_ora_29945.trc

jiagulun_ora_12933.trc  jiagulun_ora_13567.trc  jiagulun_ora_29972.trc

jiagulun_ora_13393.trc  jiagulun_ora_13592.trc  jiagulun_ora_29974.trc

jiagulun_ora_13449.trc  jiagulun_ora_13617.trc  jiagulun_ora_31683.trc

jiagulun_ora_13450.trc  jiagulun_ora_13633.trc  jiagulun_ora_3623.trc

jiagulun_ora_13475.trc  jiagulun_ora_13660.trc  jiagulun_ora_4721.trc

jiagulun_ora_13525.trc  jiagulun_ora_16478.trc  jiagulun_ora_6616.trc

jiagulun_ora_13529.trc  jiagulun_ora_21408.trc  jiagulun_ora_6643.trc

jiagulun_ora_13547.trc  jiagulun_ora_26989.trc  jiagulun_ora_6644.trc

jiagulun_ora_13550.trc  jiagulun_ora_27058.trc

這裡面也有一堆trace檔案

這些trace檔案都是serverprocess産生的

udump裡面都是serverprocess産生的日志檔案

bdump裡面都是背景程序産生的trace檔案

裡面都記錄着資料庫

程序出問題那一瞬間它的一個記憶體的情況

預警和跟蹤日志檔案

它丢不丢和資料庫都沒有關系

這裡面隻有一個最重要的檔案alert_jiagulun.log就是alert日志

這節課講了資料庫的實體結構資訊

各種檔案都在什麼位置,以及檔案的重要性

十)總結

摘自于老師使用的ppt課件

實體資料庫結構

構成Oracle資料庫的檔案可以分為以下幾類:

 控制檔案:包含有關資料庫本身的資料(即實體資料庫的結構資訊)。

           這些檔案對資料庫而言至關重要。沒有這些檔案,就無法打開用于通路資料庫資料的資料檔案。

 資料檔案:包含資料庫中的使用者資料或應用程式資料。

 聯機重做日志檔案:可用來實作資料庫執行個體恢複。

                   如果資料庫已崩潰但未丢失任何資料檔案,那麼使用這些檔案中的資訊可以通過執行個體恢複資料庫。

 要成功運作資料庫,以下附加檔案非常重要:

 參數檔案:用于定義啟動執行個體時如何配置執行個體。

 密碼檔案:允許使用者遠端連接配接到資料庫并執行管理任務。

 備份檔案:用于恢複資料庫。

           當因媒體故障或使用者錯誤而損壞或删除了原始檔案時,通常需要還原備份檔案。

 歸檔日志檔案:包含執行個體生成的資料更改(重要)的實時曆史記錄。

               使用這些檔案和資料庫備份可以恢複丢失的資料檔案。也就是說,使用歸檔日志可以恢複還原的資料檔案。

 跟蹤檔案:每個伺服器和背景程序都可以對關聯的跟蹤檔案執行寫操作。

           如果在程序中檢測到内部錯誤,程序就會将關于錯誤的資訊轉儲到程序的跟蹤檔案中。

           寫入到跟蹤檔案中的某些資訊專門供資料庫管理者使用,另一些資訊則供Oracle支援服務部門使用。

 預警日志檔案:是特殊的跟蹤檔案,又稱為預警日志。

               資料庫預警日志是按時間順序列出的資訊日志和錯誤日志。Oracle建議檢視這些檔案。

                2017年3月11日              

                                                                                                             文字:韻筝