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命令更改參數值


先建一個測試用的目錄


[oracle@redhat4 oracle]$ pwd
/u01/app/oracle
[oracle@redhat4 oracle]$ mkdir ctltest
[oracle@redhat4 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狀態


[oracle@redhat4 ctltest]$ pwd
/u01/app/oracle/ctltest
[oracle@redhat4 ctltest]$ ll
總用量 0


需要把原控制文件拷貝到這個目錄
把第三個控制文件移動到ctltest目錄下


[oracle@redhat4 ctltest]$ mv /u01/app/oracle/oradata/jiagulun/control03.ctl /u01/app/oracle/ctltest/
[oracle@redhat4 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/目錄下
我的實驗環境爲
[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 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命令


[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ file spfilejiagulun.ora
spfilejiagulun.ora: data
[oracle@redhat4 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


控制文件是時刻變化着的而且各個控制文件是複用關係要求必須完全一樣
發生的版本錯誤就是說控制文件內容不一樣了


這時只要重新拷貝一下最新的控制文件使每個控制文件都完全一樣就可以了
[oracle@redhat4 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、[oracle@redhat4 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/目錄下
文件都很小的並且不會怎麼增長


我們到目錄下看一下


[oracle@redhat4 jiagulun]$ pwd
/u01/app/oracle/oradata/jiagulun
[oracle@redhat4 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目錄下

[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 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
沒有歸檔日誌


而且在歸檔日誌的默認目錄也沒有產生
[oracle@redhat4 JIAGULUN]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN
[oracle@redhat4 JIAGULUN]$ ls
onlinelog


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


在23課logbuffer相關設置中我們講過了歸檔模式的切換了
這裏把它切換一下,切換到自動歸檔模式


切換剛完成時
SQL> select * from v$archived_log;

no rows selected
仍沒有歸檔日誌


[oracle@redhat4 JIAGULUN]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN
[oracle@redhat4 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.
自動歸檔模式下日誌切換會造成日誌歸檔


[oracle@redhat4 JIAGULUN]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN
[oracle@redhat4 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


進入此目錄查看
[oracle@redhat4 2017_02_05]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_05
[oracle@redhat4 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
如果多次切換日誌造成多次的日誌發生歸檔,會產生多個歸檔日誌文件


隔天后切換日誌
[oracle@redhat4 archivelog]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog
[oracle@redhat4 archivelog]$ ls
2017_02_05  2017_02_06
產生了另一日期的目錄及歸檔日誌


新日期目錄下
[oracle@redhat4 2017_02_06]$ pwd
/u01/app/oracle/flash_recovery_area/JIAGULUN/archivelog/2017_02_06
[oracle@redhat4 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日誌


[oracle@redhat4 bdump]$ pwd
/u01/app/oracle/admin/jiagulun/bdump
[oracle@redhat4 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的錯誤都會出現在這個日誌中


我們可以看一下這個文件的內容


[oracle@redhat4 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目錄

[oracle@redhat4 udump]$ pwd
/u01/app/oracle/admin/jiagulun/udump
[oracle@redhat4 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日              
                                                                                                             文字:韻箏


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章